作者声明:
1. 搭建K8S属实不容易,特别是在网络被限制了之后,越来越多的地方需要到国内找到能够替代的方案。
2. 本文搭建过程使用的是Ubuntu22.04LTS版本,搭建的K8S版本是1.32.5,使用的容器运行时是Docker(因为本人更熟悉Docker-_-...),安装了cri-docker的shim垫片~,在本文最后,作者也会奉上如何修改K8S的运行时,如何将Docker替换为Containerd这一独家 "秘籍"。
3. 如有报错等所有按照我的内容搭建出现的问题都可以在评论区留言,作者会一一解答。
🎉🎉🎉 真心的祝你有一个愉快的k8s学习之旅!^_^ 🎉🎉🎉
一、环境准备
tips:本文是实验环境,所以配置相较于就比较低了,如果生产环境有需要,可以参考我的博文二进制部署Kubernetes1.32.4最新版本高可用集群及附加组件_二进制安装kubernetes 1.32-CSDN博客
当然,生产环境也可以使用kubeadm安装的,只不过配置更高一点。
主机名称/角色 | 主机IP | 主机配置 |
k8s-master | 10.0.0.6/24 | 4Core8GB |
k8s-node1 | 10.0.0.7/24 | 4Core8GB |
k8s-node2 | 10.0.0.8/24 | 4Core8GB |
二、安装前的初始化配置
tips: 此步骤三台机器都要操作
1. 配置hosts解析
vim /etc/hosts
# 内容如下,要根据自己的实际情况来看
10.0.0.6 k8s-master
10.0.0.7 k8s-node1
10.0.0.8 k8s-node2
效果如下
root@k8s-master:~# ping k8s-node1
PING k8s-node1 (10.0.0.7) 56(84) bytes of data.
64 bytes from k8s-node1 (10.0.0.7): icmp_seq=1 ttl=64 time=0.732 ms
64 bytes from k8s-node1 (10.0.0.7): icmp_seq=2 ttl=64 time=0.218 ms
--- k8s-node1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.218/0.475/0.732/0.257 ms
root@k8s-master:~# ping k8s-node2
PING k8s-node2 (10.0.0.8) 56(84) bytes of data.
64 bytes from k8s-node2 (10.0.0.8): icmp_seq=1 ttl=64 time=0.296 ms
64 bytes from k8s-node2 (10.0.0.8): icmp_seq=2 ttl=64 time=0.288 ms
--- k8s-node2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1023ms
rtt min/avg/max/mdev = 0.288/0.292/0.296/0.004 ms
2. 配置时间同步
分布式要解决的一个问题就是时钟同步。
timedatectl set-timezone Asia/Shanghai
apt install -y ntpsec-ntpdate
ntpdate ntp.aliyun.com
3. 配置内核转发和网桥过滤
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
如上配置需要加在如下两个模块
modprobe overlay
modprobe br_netfilter
写到配置文件,永久生效
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
应用配置
sysctl --system
4. 安装ipvs
apt install -y ipset ipvsadm
配置ipvsadm的模块,这些都是算法模块,目的是为了让开机自动加载
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_VS_wrr
ip_vs_sh
nf_conntrack
EOF
编写脚本自动加载
cat << EOF | tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
执行脚本生效
bash ipvs.sh
验证脚本是否生效
root@k8s-master:~# lsmod | grep ip_vs
ip_vs_sh 16384 0
ip_vs_rr 16384 0
ip_vs 176128 4 ip_vs_rr,ip_vs_sh
nf_conntrack 172032 7 xt_conntrack,nf_nat,xt_nat,nf_conntrack_netlink,xt_CT,xt_MASQUERADE,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
libcrc32c 16384 6 nf_conntrack,nf_nat,btrfs,nf_tables,raid456,ip_vs
5. 关闭swap分区
sed -ri 's/^([^#].*swap.*)$/#\1/' /etc/fstab && grep swap /etc/fstab && swapoff -a && free -h
验证
Swap: 0B 0B 0B
至此,Ubuntu服务器配置就初始化成功了,下面可以开始准备集群环境了!
三、安装Docker容器运行时
tips:三台机器都要安装!
这里安装就使用阿里云的Docker镜像源,又快又稳定!这里作者还是建议大家复制也要看清楚,没问题之后再执行哟~
1. 先安装必要的一些系统工具
apt-get update
apt-get install ca-certificates curl gnupg
2. 添加信任 Docker 的 GPG 公钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
3. 写入软件源信息
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. 安装Docker
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
也可以安装指定版本,这里简单给大家看一下(可跳过,这里是一个拓展)
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
安装完成之后可以使用 docker version 命令验证一下~
5. 配置Docker镜像加速
现在这个时间段国内docker下载镜像很困难,需要我们手动设置国内的镜像源。
修改 /etc/docker/daemon.json
,如果该文件不存在就创建该文件并把以下内容写入文件。
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://doublezonline.cloud",
"https://dislabaiot.xyz",
"https://docker.fxxk.dedyn.io",
"https://dockerpull.org",
"https://docker.unsee.tech",
"https://hub.rat.dev",
"https://docker.1panel.live",
"https://docker.nastool.de",
"https://docker.zhai.cm",
"https://docker.5z5f.com",
"https://a.ussh.net",
"https://docker.udayun.com",
"https://hub.geekery.cn"
],
"insecure-registries": ["kubernetes-register.sswang.com"],
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
然后重启生效一下即可
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
四、安装cri-docker
tips:三台机器都要安装!
从 Kubernetes 1.24 开始,默认移除了对 Docker 的直接支持,必须使用 `cri-docker` 作为适配层,才能让 Docker 与 Kubernetes 的 CRI(容器运行时接口)进行通信,从而保证 Kubernetes 能正常管控基于 Docker 的容器运行时。
1. 安装cri-docker
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz
如果wget不下来,可以先下载后上传也可以的!
2. 配置cri-docker
tar xf cri-dockerd-0.3.16.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/
cp -a /usr/local/bin/cri-dockerd /usr/bin
查看版本号验证
root@k8s-master:~# cri-dockerd --version
cri-dockerd 0.3.16 (7119864)
3. 设置开机启动脚本
创建文件 /etc/systemd/system/cri-dockerd.service
,写入如下内容
root@k8s-master:~# cat /etc/systemd/system/cri-dockerd.service
[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-dockerd.socket
# 控制启动失败重试策略
StartLimitIntervalSec=60s
StartLimitBurst=3
[Service]
Type=notify
# 用续行符 '\' 把长命令分行写清楚
ExecStart=/usr/local/bin/cri-dockerd \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10 \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin \
--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock \
--cri-dockerd-root-directory=/var/lib/dockershim \
--docker-endpoint=unix:///var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
Restart=always
RestartSec=2
# 不限文件描述符、线程数等
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
创建 /etc/systemd/system/cri-dockerd.socket
文件,并写入如下内容
root@k8s-master:~# cat /etc/systemd/system/cri-dockerd.socket
[Unit]
Description=CRI Dockerd Socket for the Docker CRI shim
PartOf=cri-dockerd.service
[Socket]
# 监听 cri-dockerd 提供的 Unix domain socket
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
执行开机启动
systemctl daemon-reload
systemctl enable cri-dockerd.service
systemctl restart cri-dockerd.service
验证启动信息
root@k8s-master:~# ls /var/run | grep docker
cri-dockerd.sock
docker
docker.pid
docker.sock
五、安装&部署k8s集群
tips: 此小结有的只需要再master节点执行,注意看我的标注!!!
这里安装就使用阿里云的K8S镜像源,又快又稳定!这里作者还是建议大家复制也要看清楚,没问题之后再执行哟~
tips:现在的操作还是三台机器都要执行的,放心往下做!
1. 安装必要的系统工具
apt-get update && apt-get install -y apt-transport-https
2. 添加GPG公钥
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb/Release.key |
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
3. 写入源信息
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb/ /" |
tee /etc/apt/sources.list.d/kubernetes.list
4. 安装kubelet/kubectl/kubeadm
apt-get update
apt-get install -y kubelet kubeadm kubectl
查看版本验证是否安装成功。
root@k8s-master:~# kubelet --version && kubeadm version && kubectl version
Kubernetes v1.32.5
kubeadm version: &version.Info{Major:"1", Minor:"32", GitVersion:"v1.32.5", GitCommit:"9894294ef13a5b32803e3ca2c0d620a088cc84d1", GitTreeState:"clean", BuildDate:"2025-05-15T09:10:46Z", GoVersion:"go1.23.8", Compiler:"gc", Platform:"linux/amd64"}
Client Version: v1.32.5
Kustomize Version: v5.5.0
Server Version: v1.32.5
5. 锁定版本(拓展)
为了防止自动更新# 三台机器都执行
apt-mark hold kubelet kubeadm kubectl
如果想升级版本,可以解锁
apt-mark unhold kubelet kubeadm kubectl
6. 配置kubelet
进入文件kubelet,1.30版本之后都是在 /etc/default/kubelet,
添加为如下配置,配置cgroup管理
root@k8s-master:~# cat /etc/default/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
三台节点都设置开机自启动
systemctl enable kubelet
注意: 这里只是设置开机启动,但是并没有启动 kubelet
。请不要在此刻启动kubelet。因为我们的K8S集群并没有搭建成功!
7. 初始化集群
tips: 这个初始化的操作,只在master节点上操作!!!
规划pod/service网段,这两个网段和宿主机网段不能重复!原则只有一个:三个网段不重复,没有交叉即可!
- 宿主机网段:前面已经规划过。即:10.0.0.6/24
- service网段:10.96.0.0/12
- pod网段:10.244.0.0/16
执行kubeadm init命令
不要全部复制,注意有些参数需要修改为自己环境的实际情况的!
kubeadm init \
--kubernetes-version=1.32.5 \
--control-plane-endpoint=k8s-master \
--apiserver-advertise-address=10.0.0.6 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository=registry.aliyuncs.com/google_containers \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--upload-certs \
--v=9
以下是对这些参数的逐行解释:
1. `kubeadm init` :这是用于初始化 Kubernetes 集群的命令。
2. `--kubernetes-version=1.32.5` :指定要安装的 Kubernetes 版本为 1.32.5。
3. `--control-plane-endpoint=k8s-master` :可以理解为集群master的命名。
4. `--apiserver-advertise-address=10.0.0.6` :集群中master的地址!注意不要抄,写你自己虚拟机的ip地址
5. `--pod-network-cidr=10.244.0.0/16` :这是分配给 Pod 的 IP 地址范围,用于定义集群内部 Pod 之间的网络通信地址范围。
6. `--service-cidr=10.96.0.0/12` :这是分配给 Kubernetes 服务的集群 IP 地址范围,用于标识服务的虚拟 IP 地址范围。
7. `--image-repository=registry.aliyuncs.com/google_containers` :指定镜像仓库为 `registry.aliyuncs.com/google_containers`这是咱国内的仓库地址。
8. `--cri-socket=unix:///var/run/cri-dockerd.sock` :指定 CRI(容器运行时接口)套接字的位置为 `unix:///var/run/cri-dockerd.sock`,这是与容器运行时(如 Docker)进行通信的套接字文件路径,用于让 Kubernetes 与容器运行时建立连接并进行交互。
9. `--upload-certs` :表示上传证书到集群中,这在高可用集群配置中很有用,用于将证书信息上传到控制平面,以便其他节点可以使用这些证书进行通信和身份验证。
10. `--v=9` :设置日志的详细级别为 9,这会使得输出非常详细日志信息,方便进行调试和问题排查,数值越大,日志越详细。
输出中有两段非常重要的命令我们需要去执行。
## 输出信息如下
...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-master:6443 --token ui01dn.8e7fr73patshrh4h \
--discovery-token-ca-cert-hash sha256:93e98d6e34be023e68c1446f6b181526eb06d686717ca656a4977936434bce85
执行命令1:
只需要在master节点执行即可!!!
# master节点执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行命令2:
tips: 命令2需要再对应的两台worker节点上执行的!!!
意思是使当前节点加入k8s集群,其中cri-socket是指定容器运行时。
kubeadm join k8s-master:6443 --token ui01dn.8e7fr73patshrh4h \
--discovery-token-ca-cert-hash sha256:93e98d6e34be023e68c1446f6b181526eb06d686717ca656a4977936434bce85 --cri-socket=unix:///var/run/cri-dockerd.sock
简单来说就是需要在给我们提供的命令后面加上--cri-socket=unix:///var/run/cri-dockerd.sock来指定我们的套接字。
8. 验证集群
# 在master节点上验证
root@k8s-master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 148m v1.32.5
k8s-node1 NotReady <none> 147m v1.32.5
k8s-node2 NotReady <none> 147m v1.32.5
现在集群的状态依然是NotReady,原因是我们没有安装K8S的CNI网络插件,K8S的跨节点通信需要靠的就是网络插件,所以集群并没有Ready.下面来演示如何安装网络插件,本文采用的是caclio.
六、安装calico网络插件
tips: 安装caclio插件的命令只需要在master节点执行即可
如在安装过程中,遇到的所有虚拟机下载不下来的问题都可以先使用Windows下载, 然后上传到虚拟机(服务器)即可
1. 使用官方yaml文件安装
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/tigera-operator.yaml
注意: 这里只能使用create,不能使用apply
2. 下载并修改配置文件
# master执行
wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/custom-resources.yaml
编辑配置文件修改pod网段,打开配置文件,找到cidr字段进行修改即可。
# master执行
vim custom-resources.yaml
.....
cidr: 10.244.0.0/16
修改其中的网段为之前规划好的pod网段10.244.0.0/16
3. 生效配置
# master节点执行
kubectl apply -f custom-resources.yaml
如果安装过程中由于网络或其他问题,安装失败,想删除资源,可以使用。一般只要是镜像源配置对了就不会失败
# master节点执行
kubectl delete -f custom-resources.yaml
4. 检查生效
检查calico是否运行成功(running即为成功)
root@k8s-master:~# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-6787bc48f4-7rt8x 1/1 Running 2 (71m ago) 150m
calico-apiserver calico-apiserver-6787bc48f4-kzlzq 1/1 Running 2 (71m ago) 150m
calico-system calico-kube-controllers-647d7ff95f-6xnzq 1/1 Running 2 (71m ago) 149m
calico-system calico-node-cs684 1/1 Running 2 (71m ago) 148m
calico-system calico-node-hpnb4 1/1 Running 2 (71m ago) 149m
calico-system calico-node-nrk7j 1/1 Running 2 (71m ago) 128m
calico-system calico-typha-5d666b9f8c-l84rv 1/1 Running 2 (71m ago) 149m
calico-system calico-typha-5d666b9f8c-q5mdq 1/1 Running 2 (71m ago) 149m
calico-system csi-node-driver-kvg92 2/2 Running 4 (71m ago) 150m
calico-system csi-node-driver-st9cc 2/2 Running 4 (71m ago) 137m
calico-system csi-node-driver-t6pm5 2/2 Running 4 (71m ago) 150m
kube-system coredns-6766b7b6bb-kn7h8 1/1 Running 2 (71m ago) 157m
kube-system coredns-6766b7b6bb-qq7z5 1/1 Running 2 (71m ago) 157m
kube-system etcd-k8s-master 1/1 Running 2 (71m ago) 157m
kube-system kube-apiserver-k8s-master 1/1 Running 2 (71m ago) 157m
kube-system kube-controller-manager-k8s-master 1/1 Running 2 (71m ago) 157m
kube-system kube-proxy-6wbjr 1/1 Running 2 (71m ago) 156m
kube-system kube-proxy-7ps9g 1/1 Running 2 (71m ago) 157m
kube-system kube-proxy-dp9hf 1/1 Running 2 (71m ago) 156m
kube-system kube-scheduler-k8s-master 1/1 Running 2 (71m ago) 157m
tigera-operator tigera-operator-ccfc44587-pl9kr 1/1 Running 2 (71m ago) 150m
此过程比较缓慢,我们也可以提前将镜像下载下来,这里我给大家整理了一下K8S1.32.5我安装的此版本需要的镜像。
root@k8s-master:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-apiserver v1.32.5 495c5ce47cf7 4 weeks ago 97MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.32.5 85dcaf69f000 4 weeks ago 89.8MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.32.5 2729fb488407 4 weeks ago 69.6MB
registry.aliyuncs.com/google_containers/kube-proxy v1.32.5 f532b7356fac 4 weeks ago 94.1MB
nginx latest 1e5f3c5b981a 2 months ago 192MB
calico/typha v3.29.2 1d6f9d005866 4 months ago 73.8MB
calico/node-driver-registrar v3.29.2 09a5a6ea58a4 4 months ago 31.8MB
calico/csi v3.29.2 0fae09f861e3 4 months ago 18.9MB
calico/pod2daemon-flexvol v3.29.2 441bf8ace5b7 4 months ago 13.9MB
calico/node v3.29.2 048bf7af1f8c 4 months ago 372MB
calico/kube-controllers v3.29.2 f6a228558381 4 months ago 82.4MB
calico/cni v3.29.2 cda13293c895 4 months ago 220MB
calico/apiserver v3.29.2 d27fc480d1ad 4 months ago 104MB
registry.aliyuncs.com/google_containers/etcd 3.5.16-0 a9e7e6b294ba 9 months ago 150MB
registry.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5 10 months ago 61.8MB
registry.aliyuncs.com/google_containers/pause 3.10 873ed7510279 13 months ago 736kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.10 873ed7510279 13 months ago 736kB
当然,其他版本也可以使用kubeadm config images list来提前下载,这样方便部署
5. 设置命令自动补全功能
[root@k8s-master ~/kube-prometheus-0.15.0]# kubectl completion bash > ~/.kube/completion.bash.inc
[root@k8s-master ~/kube-prometheus-0.15.0]# echo source '$HOME/.kube/completion.bash.inc' >> ~/.bashrc
[root@k8s-master ~/kube-prometheus-0.15.0]# source ~/.bashrc
6. 修改kube-proxy网络模式为ipvs
kubectl edit configmap kube-proxy -n kube-system
找到 “mode” 字段写入ipvs字样
kind: KubeProxyConfiguration
logging:
flushFrequency: 0
options:
json:
infoBufferSize: "0"
text:
infoBufferSize: "0"
verbosity: 0
metricsBindAddress: ""
mode: "ipvs" ### 这里
nftables:
masqueradeAll: false
masqueradeBit: null
minSyncPeriod: 0s
syncPeriod: 0s
删除原有的pod让控制器重新创建
kubectl delete pod -n kube-system -l k8s-app=kube-proxy
验证,在上文中,我们已经安装过ipvs客户端工具了,这里就用到了。
[root@k8s-master ~/kube-prometheus-0.15.0]# kubectl logs --tail=200 -n kube-system kube-proxy-7rg9h |grep ipvs
I0710 06:45:03.143697 1 server_linux.go:231] "Using ipvs Proxier"
[root@k8s-master ~/kube-prometheus-0.15.0]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.200.0.1:443 rr
-> 10.0.0.6:6443 Masq 1 6 0
TCP 10.200.0.10:53 rr
-> 10.100.235.199:53 Masq 1 0 0
-> 10.100.235.202:53 Masq 1 0 0
TCP 10.200.0.10:9153 rr
-> 10.100.235.199:9153 Masq 1 0 0
-> 10.100.235.202:9153 Masq 1 0 0
TCP 10.200.9.208:443 rr
-> 10.100.235.200:5443 Masq 1 0 0
-> 10.100.235.201:5443 Masq 1 2 0
TCP 10.200.37.65:443 rr
TCP 10.200.68.194:9115 rr
TCP 10.200.68.194:19115 rr
TCP 10.200.69.183:3000 rr
-> 10.100.169.134:3000 Masq 1 0 0
TCP 10.200.108.93:8080 rr persistent 10800
TCP 10.200.108.93:9093 rr persistent 10800
TCP 10.200.177.139:5473 rr
-> 10.0.0.7:5473 Masq 1 0 0
-> 10.0.0.8:5473 Masq 1 0 0
TCP 10.200.180.56:8080 rr persistent 10800
TCP 10.200.180.56:9090 rr persistent 10800
UDP 10.200.0.10:53 rr
-> 10.100.235.199:53 Masq 1 0 0
-> 10.100.235.202:53 Masq 1 0 0
七、验证集群可用性
root@k8s-master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 160m v1.32.5
k8s-node1 Ready <none> 160m v1.32.5
k8s-node2 Ready <none> 160m v1.32.5
root@k8s-master:~# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy ok
至此,我们的K8S1.32.5集群终于搭建完成了,以上步骤经过多次实验验证,祝部署顺利🎉🎉!
八、修改K8S的Docker运行时为Containerd(拓展)
1. 查看当前节点状态
首先,我们需要查看当前集群中各个节点的状态以及正在使用的容器运行时。
在 Master 节点上执行以下命令:
root@k8s-master:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready control-plane 168m v1.32.5 10.0.0.6 <none> Ubuntu 22.04.4 LTS 5.15.0-141-generic docker://28.2.2
k8s-node1 Ready <none> 168m v1.32.5 10.0.0.7 <none> Ubuntu 22.04.4 LTS 5.15.0-141-generic docker://28.2.2
k8s-node2 Ready <none> 168m v1.32.5 10.0.0.8 <none> Ubuntu 22.04.4 LTS 5.15.0-141-generic docker://28.2.2
查看节点的详细信息,包括正在使用的容器运行时的套接字:
root@k8s-master:~# kubectl get nodes -o yaml | grep kubeadm.alpha.kubernetes.io/cri-socket
kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/cri-dockerd.sock
kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/cri-dockerd.sock
kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/cri-dockerd.sock
可以看到,worker 节点此时使用的是 Docker 的 /var/run/dockershim.sock 套接字。
2. 驱逐节点上的负载
在更换运行时之前,我们需要将节点设置为维护模式,并驱逐该节点上的负载,以确保不会影响正在运行的应用。
在 Master 节点上执行以下命令驱逐 worker2 节点:
[root@k8s-master ~]# kubectl drain k8s-node2 --ignore-daemonsets --delete-emptydir-data
执行成功后,该节点将被标记为不可调度,并且其上的负载将被驱逐到其他可用节点上。
查看节点状态:
[root@k8s-master ~]# kubectl get nodes
可以看到 worker2 节点的状态为Ready,SchedulingDisabled。
3. 停止 kubelet 和容器运行时进程
在 worker2节点上,停止 kubelet 和 Docker 服务:
[root@k8s-node2 ~]# systemctl disable kubelet.service --now
[root@k8s-node2 ~]# systemctl disable docker --now
4. 更换运行时
移除 Docker 环境
在 worker2节点上,移除 Docker 环境:
简单来说就是要删除docker
apt-get purge docker-ce docker-ce-cli containerd.io
# 删除所有容器
docker rm $(docker ps -aq)
# 删除所有镜像
docker rmi $(docker images -q)
# 删除所有网络
docker network prune -f
# 删除所有卷
docker volume prune -f
# 删除数据目录
rm -rf /var/lib/docker
apt remove docker-buildx-plugin.x86_64 docker-compose-plugin.x86_64
安装 Containerd
使用预准备好的安装脚本安装 Containerd:
这里作者有一键安装containerd的脚本,如有需要,留言可分享
[root@k8s-node2 ~]# ./install-containerd.sh i
安装完成后,可以查看 Containerd 的版本信息:
containerd --version
Client: Version: v1.6.36 Revision: 88c3d9bc5b5a193f40b7c14fa996d23532d6f956 Go version: go1.22.7
Server: Version: v1.6.36 Revision: 88c3d9bc5b5a193f40b7c14fa996d23532d6f956 UUID: d5ffefa9-fb78-4e5a-87e7-82c4f60fb6b8
runc version 1.1.15 commit: v1.1.15-0-gbc20cb44 spec: 1.0.2-dev go: go1.22.3 libseccomp: 2.5.5
修改 kubelet 的运行时环境
在 worker2节点上,修改 kubelet 的配置文件,指定使用 Containerd 的套接字。
修改 /var/lib/kubelet/kubeadm-flags.env 文件:
KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6 --container-runtime-endpoint=unix:///run/containerd/containerd.sock --container-runtime=remote"
检查 Containerd 套接字文件是否存在:
[root@k8s-node2 ~]# ll /run/containerd/containerd.sock
srw-rw---- 1 root root 0 Apr 15 19:57 /run/containerd/containerd.sock
修改节点配置
在 Master 节点上,编辑 worker2 节点的配置,更新其容器运行时的套接字信息:
[root@master231 ~]# kubectl edit node k8s-node2
在编辑器中找到 kubeadm.alpha.kubernetes.io/cri-socket 注解,将其值修改为 unix:///run/containerd/containerd.sock。
5. 完成迁移并恢复节点
启动 kubelet 组件
在 worker2 节点上,启动 kubelet 服务:
[root@k8s-node2 ~]# systemctl enable --now kubelet
取消节点不可调度状态
在 Master 节点上,取消 worker2 节点的不可调度状态:
[root@k8s-master ~]# kubectl uncordon k8s-node2
查看节点状态:
[root@k8s-master ~]# kubectl get nodes -o wide
可以看到 worker2 节点的 CONTAINER-RUNTIME 字段已变为 containerd://1.6.36,表示运行时更换成功。