目录

1、准备环境

2、系统配置

3、安装容器运行时

4、安装cri-dockerd(1.24以下版本跳过这一步)

5、安装kubernetes集群组件

6、可能会出现的问题

7、kubernetes命令补全设置


1、准备环境

做了一些修改,因为某些原因无法科学上网,才发现部分同志的苦衷,所以全部将国外源全部修改为了国内随处可见的源。至于github问题,咱们都这个阶段了,我相信同志们应该可以解决的

系统版本:Centos7.6或者rocky系统。随着centos停止维护,rocky目前正在逐渐替代centos。Rocky Linux 由 Gregory Kurtzer 创立,是由 CentOS 项目的原班人马发起并创建的一个开源企业级 Linux 发行版,并且二者yum源和其他的一些app源兼容性很强。

本次实验使用Rocky10
k8s-msater 192.168.176.101
k8s-node1 192.168.176.102
k8s-node2 192.168.176.103
#阿里云kubernetes源,详情登录阿里云镜像官网查看说明
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/repodata/repomd.xml.key
EOF

#中科大docker-ce源,阿里云docker源有点问题。用的cnetos的,详情去中科大官网查看说明
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

yum clean all && yum makecache

2、系统配置

#官方建议关掉交换分区
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

#开机加载内核,这个内核的作用是所有网桥的流量都要经过iptables的处理,这是docker所需要的设置
#modprobe临时加载内核
#losmod查询内核
echo "br_netfilter" >> /etc/modules-load.d/bridge.conf
modprobe br_netfilter

#开机加载内核,k8s后续更换Service的底层负载方式ipvs要用
cat >> /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
EOF

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh

#将三台服务器域名映射追加进文件
cat >> /etc/hosts << EOF
192.168.176.101    k8s-master
192.168.176.102    k8s-node1
192.168.176.103    k8s-node2
EOF

在分别修改三台主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

3、安装容器服务

这里不得不提到“容器运行时接口(ContainerRuntimeInterface)”也就是后面会常说的“CRI”。“CRI”是k8s定义的统一标准接口,让k8s方便管理实现了“CRI”的“容器运行时”。

而“容器运行时(ContainerRuntime)”则是实现CRI的工具,这些工具可以作为k8s组件部署,也可以独立运行。大众熟知的“容器运行时”比如podman、CRI-O、Containerd、docker等。k8s现在默认的容器运行时为containerd,containerd也正在被世界主流公司使用。

因为没用过containerd,所以就用我熟悉的docker作为k8s的容器运行时组件,博客我会不定期修改,后面大概率会增加containerd作为k8s容器运行时组件的安装部署流程

yum -y install docker-ce ipvsadm(ipvs的管理工具)

#要先启动,不然不会生成/etc/docker目录
systemctl start docker
systemctl enable docker

#配置镜像加速和文件驱动
cat >> /etc/docker/daemon.json << EOF
{
    "registry-mirrors": [ "xxxxxxxxxx" ],
    "exec-opts": [ "native.cgroupdriver=systemd" ]
}
EOF
#随着dockerhub被封锁,这个加速器没用了,各位同志用国内源替代吧,随处可见不难找
#"exec-opts": [ "native.cgroupdriver=systemd" ]设置cgroup驱动,k8s默认是systemd,docker要保持一致
#cgroups 的全称是 Linux Control Groups,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)
#systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.

systemctl daemon-reload
systemctl restart docker

#开启路由转发,这是docker所需要的设置.不设置这个参数k8s集群内域名解析会报错,而且集群启动后dns pod也会报错53端口没权限,没试过猜测是这个原因
echo "net.ipv4.ip_forward=1" >>  /etc/sysctl.conf

#控制桥接网络接口bridge interface的数据包是否经过iptables规则的过滤。如果启用(设置为 1),当桥接设备接收到的数据包需要路由时,会经过Linux内核的iptables规则检查。
echo "net.bridge.bridge-nf-call-iptables=1" >>  /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables=1" >>  /etc/sysctl.conf

sysctl -p    #加载参数

4、安装cri-dockerd

kubernetes从1.24(包括1.24)版本后移除了dockershim,所以部署的k8s集群在1.24版本以下的话可以跳过这一步。使用docker作为容器运行时,不装此插件k8s初始化会报错。他是与docker和CRI进行对接的插件

简单来讲就是将k8s说的话翻译给docker听,1.24版本后移除了此组件。因为增加了k8s官方的维护成本,移除这个组件后导致docker听不懂k8s的话了,无法对接k8s(才有了k8s放弃docker的说法),后来docker和一个叫mirans的公司接过了此项运维工程,开发了cri-docker来保持docker和k8s的对接

这是k8s大于1.23版本没装cri-dockerd的报错贴图

https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd-0.3.21.amd64.tgz

tar -xf cri-dockerd-0.3.21.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/cri-dockerd
chmod +x /usr/bin/cri-dockerd

#创建服务控制文件(官方提供)
cat >> /usr/lib/systemd/system/cri-docker.service << EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd \
--network-plugin=cni \
--pod-infra-container-image=swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.10
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF
#--network-plugin=cni 指定网络插件为CNI
#--pod-infra-container-image 指定Pod的基础镜像pause,可以去https://docker.aityp.com/渡渡鸟寻找国内镜像源

创建服务套接字文件(官方提供)
cat >> /usr/lib/systemd/system/cri-docker.socket << EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
EOF

systemctl daemon-reload
systemctl start cri-docker
systemctl enable cri-docker
systemctl status cri-docker

以上步骤三个节点同步执行
到这一步重启下三个节点,保证某些配置生效,比如主机名,因为k8s集群会把当前主机名称作为节点名称,但是每台主机都是localhost的话会导致节点无法加入集群,当然也可以手动改名不重启,我习惯重启

5、安装kubernetes集群组件

#全部节点安装
yum install -y kubelet kubeadm kubectl

#全部节点设置kubelet开机自起,不然kubeadm初始化会提示报错
systemctl enable --now kubelet

回到master节点
kubeadm init \
--apiserver-advertise-address 192.168.176.101 \#指定master节点
--kubernetes-version 1.34.2 \    #指定kubernetes版本,不知道就kubelet --version查询,不然版本号不对初始化会报错
--service-cidr 10.96.0.0/12 \    #指定服务网络的地址范围,关于为什么可以问问gpt
--pod-network-cidr 10.244.0.0/16 \    #指定Pod网络的地址范围,关于为什么可以问问gpt
--cri-socket unix:///var/run/cri-dockerd.sock    #CRI套接字路径,使用cri-docker要加这个参数
--image-repository=registry.aliyuncs.com/google_containers #指定下载k8s软件包的容器仓库,这个地址我在阿里云找了很久不知道出处,有大佬说不是公开的,能用就行了,所以不纠结了

#安装成功后会提示执行命令,直接复制执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#让node节点加入集群,根据安装成功后会给出命令,这个命令每个人不一样的,根据你们自己的来,并且后面也加--cri-socket指定套接字,来到剩下的两个节点执行命令
kubeadm join 192.168.176.101:6443 --token 7u9cre.th9o2v0l18krhbgw \
	--discovery-token-ca-cert-hash --sha256:b14b7ca3c8e3e30e9d3c2847192024508e19bf5b3cff9e5a5d64bc1728ec7698 --cri-socket unix:///var/run/cri-dockerd.sock
#到此集群节点全部安装,可以kubelet get node查询节点。此时是未就绪的状态,因为缺少网络插件对三个节点进行互通

#安装网络插件
wget https://github.com/projectcalico/calico/archive/refs/tags/v3.29.7.tar.gz
tar -xf calico-3.29.7.tar.gz
cd calico-3.29.7/manifests/
vim calico.yaml
这个
- name: CALICO_IPV4POOL_IPIP
  value: "Always"
改为
- name: CALICO_IPV4POOL_IPIP
  value: "Off"    #意思是关闭IPIP模式,启动BGP模式
这个
# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"
改为
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"    #这个是指定pod网络网段的,要和初始化保持一致

#修改镜像仓库地址,默认是docker.io,无法访问。文中搜索image有五处需要修改,将docker.io修改为quay.io即可,这个是红帽公司创建的镜像托管仓库,没有被封锁,就是速度差了些

#根据kubeadm安装成功后给出的命令指定yaml文件安装网络插件
kubectl apply -f calico.yaml

完成,有的同志会慢一些,稍等即可

kubelet get pod -A,全部处于Running状态即代表集群部署成功

calico插件太深奥,详细说明我会附上大佬的讲解

Calico-介绍、原理与使用_calico的三种模式-CSDN博客

这个大佬很厉害,想了解calico可以去关注这位博主。关于k8s的网络插件,现场使用范围最广的就是calico,在他之前是Flannel。当然看同志们自己的需求

6、可能会出现的问题

部署结束后kubectl get pod -n kube-sytecm会发现有两个dns的pod启动不了。这个问题是由于内核版本过低导致的,升级下内核版本或者修改控制器配置,这个方法是官方提供的。允许绑定1024以下高级端口

kubectl -n kube-system get deployment coredns -o yaml | \
  sed 's/allowPrivilegeEscalation: false/allowPrivilegeEscalation: true/g' | \
  kubectl apply -f -

7、kubernetes命令补全和别名设置

yum -y install bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc

常用别名设置,看需求
cat >> ~/.bashrc << EOF 
alias k='kubectl'
alias kg='kubectl get'
alias kd='kubectl describe'
alias ke='kubectl explain'
alias ka='kubectl apply'
EOF

别名补全
complete -F __start_kubectl k
complete -F __start_kubectl kg
complete -F __start_kubectl kd
complete -F __start_kubectl ke
complete -F __start_kubectl ka
source ~/.bashrc

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐