CentOS9下v1.35版本K8s的部署

1.24版本移除 dockershim,需要使用 CRI,或额外安装支持 Docker 的插件。

一、规划及环境准备

k8s201、k8s202、k8s203都需要操作

1.1 规划

主机名 IP 系统版本 配置 K8S版本 CRI版本
k8s201 192.168.10.201 centos9 2C2G 1.35 2.21.1
k8s202 192.168.10.202 centos9 2C2G 1.35 2.21.1
k8s203 192.168.10.203 centos9 2C2G 1.35 2.21.1
harbor 192.168.10.250
  1. 设置主机名 (分别在各节点执行)
1
2
3
hostnamectl set-hostname k8s201
hostnamectl set-hostname k8s202
hostnamectl set-hostname k8s203
  1. 设置主机名解析
1
2
3
4
5
cat >> /etc/hosts << EOF
192.168.10.201 k8s201
192.168.10.202 k8s202
192.168.10.203 k8s203
EOF

​ 验证

1
2
3
ping -c2 k8s201
ping -c2 k8s202
ping -c2 k8s203
  1. 关闭防火墙和 SELinux
1
2
3
systemctl disable --now firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

​ 验证

1
2
getenforce
systemctl status firewalld
  1. 关闭 Swap 分区

​ 临时关闭

1
swapoff -a && sysctl -w vm.swappiness=0

​ 基于配置文件的关闭

1
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

​ 验证

1
free -h
  1. 确保各个节点MAC地址或product_uuid唯一
1
ip address show ens160 |grep ether |awk '{print $2}'
1
cat /sys/class/dmi/id/product_uuid

1.2 内核模块与网络优化

  1. 加载基础内核模块
1
2
3
4
5
6
7
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter
  1. 加载 IPVS 模块 (用于 Service 高性能转发)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat <<EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipip
EOF

for kernel_module in $(cat /etc/modules-load.d/ipvs.conf); do
/sbin/modprobe $kernel_module
done
  1. 设置 Sysctl 网络参数
1
2
3
4
5
6
7
8
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

sysctl --system

1.3 安装容器运行时 CRI

  1. 安装最新版
1
2
3
dnf install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf install -y containerd.io

​ 显示所有版本

1
dnf list containerd.io --showduplicates
  1. 配置 containerd
1
2
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
  1. 开启 SystemdCgroup (必须,否则 Kubelet 无法启动)
1
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
1
grep SystemdCgroup /etc/containerd/config.toml
  1. 修改沙箱镜像源 (国内加速,否则 init 会卡死)

    注意,按照实际情况替换

1
sed -i 's|registry.k8s.io/pause:3.10.1|registry.aliyuncs.com/google_containers/pause:3.10.1|g' /etc/containerd/config.toml
1
grep registry.k8s.io /etc/containerd/config.toml
  1. 开机自启
1
systemctl enable --now containerd
  1. 验证
1
ctr version
  1. 新建 crictl 的配置文件(可选)

    否则, crictl 不知道去找哪个容器运行时。

1
2
3
4
5
6
cat <<EOF > /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

1.4 下载 K8s

  1. 配置 yum
1
2
3
4
5
6
7
8
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/repodata/repomd.xml.key
EOF
  1. 安装最新版本
1
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

​ 安装最新版本

1
2
KUBE_VERSION=1.35.0
dnf -y install kubeadm-${KUBE_VERSION} kubelet-${KUBE_VERSION} kubectl-${KUBE_VERSION}

​ 查看所有版本

1
dnf list kubelet kubeadm kubectl --showduplicates
  1. 验证
1
kubelet --version
  1. 开机启动
1
systemctl enable --now kubelet

二、获取镜像

  1. 获取镜像
1
kubeadm config images list --kubernetes-version 1.35.0

​ 国内地址

1
kubeadm config images list --kubernetes-version 1.35.0 --image-repository registry.aliyuncs.com/google_containers
  1. 拉取镜像
1
2
3
4
5
6
7
ctr image pull registry.k8s.io/kube-apiserver:v1.35.0
ctr image pull registry.k8s.io/kube-controller-manager:v1.35.0
ctr image pull registry.k8s.io/kube-scheduler:v1.35.0
ctr image pull registry.k8s.io/kube-proxy:v1.35.0
ctr image pull registry.k8s.io/coredns/coredns:v1.13.1
ctr image pull registry.k8s.io/pause:3.10.1
ctr image pull registry.k8s.io/etcd:3.6.6-0

​ 加速地址

1
2
3
4
5
6
7
ctr image pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.35.0
ctr image pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.35.0
ctr image pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.35.0
ctr image pull registry.aliyuncs.com/google_containers/kube-proxy:v1.35.0
ctr image pull registry.aliyuncs.com/google_containers/coredns/coredns:v1.13.1
ctr image pull registry.aliyuncs.com/google_containers/pause:3.10.1
ctr image pull registry.aliyuncs.com/google_containers/etcd:3.6.6-0

三、初始化、加入集群

3.1 初始化

  • k8s201
  1. 生成配置文件
1
kubeadm config print init-defaults > kubeadm.yml
  1. 修改关键配置项
1
vim kubeadm.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  advertiseAddress: 192.168.10.201
bindPort: 6443

name: k8s201

imageRepository: registry.aliyuncs.com/google_containers

serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
  • advertiseAddress
  • name 主节点的名称
  • imageRepository,改为阿里云镜像仓库
  • podSubnet ,追加在 serviceSubnet 的下一行
  • apiVersion,追加这一部分内容,包括 ---
1
kubeadm config images list --config kubeadm.yml
  1. 启动
1
kubeadm init --config=kubeadm.yml

​ 忽略内存不足

1
kubeadm init --config=kubeadm.yml --ignore-preflight-errors=Mem

​ 忽略镜像

1
kubeadm init --config=kubeadm.yml --image-pull-policy=IfNotPresent

​ 跳过镜像拉取

1
kubeadm init --config=kubeadm.yml --skip-phases=preflight/pull-images
  1. 添加kubectl的自动补全功能
1
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
  1. 让当前用户可以直接使用 kubectl 管理整个 Kubernetes 集群
1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 查看控制面组件状态
1
2
kubectl get componentstatuses
kubectl get cs
  1. 查看节点状态
1
kubectl get nodes
  1. 意外情况,重新初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kubeadm reset -f
rm -rf /var/lib/cni/ $HOME/.kube/config
rm -rf /etc/kubernetes/
rm -rf /var/lib/etcd/
rm -rf ~/.kube/
rm -rf /etc/cni/

ip link delete cni0
ip link delete flannel.1

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

3.2 加入集群

  • k8s202
  • k8s203
1
2
kubeadm join 192.168.10.201:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2f55dde305d9df5c21b8d560adffd34dc69810d64788460d4fadb40517d4f561

重新获取加入集群的命令

1
2
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0

​ 或

1
kubeadm token create --print-join-command

3.3 安装 flannel 网络插件

  1. 下载 kube-flannel.yml
1
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

​ 加速

1
wget https://gh.bravexist.cn/https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
  1. 修改网段,和 kubeadm 里的 podSubnet 保持一致,不想每次都重新拉取镜像话,配置 imagePullPolicy
1
vim kube-flannel.yml
1
2
3
10.244.0.0/16

imagePullPolicy: IfNotPresent
  • imagePullPolicy 添加在 image 的下一行
  1. 启动
1
kubectl apply -f kube-flannel.yml
  1. 验证
1
kubectl get pods -A -o wide| grep kube-flannel
  1. 删除,(可选)
1
kubectl delete -f kube-flannel.yml

3.4 安装 calico 网络插件

  1. 下载
1
wget https://raw.githubusercontent.com/projectcalico/calico/v3.31.2/manifests/tigera-operator.yaml

​ 加速下载

1
wget https://gh.bravexist.cn/https://raw.githubusercontent.com/projectcalico/calico/v3.31.2/manifests/tigera-operator.yaml
  1. 安装 Tigera Operator
1
kubectl apply -f tigera-operator.yaml
  1. 下载自定义资源配置文件
1
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml

​ 加速下载

1
wget https://gh.bravexist.cn/https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
  1. 修改网段 (非常重要),修改 custom-resources.yaml 中的 cidr,确保它与你执行 kubeadm init 时定义的 --pod-network-cidr 完全一致。
1
vim custom-resources.yaml
1
cidr: 10.244.0.0/16
  1. 启动 Calico 实例
1
kubectl apply -f custom-resources.yaml

​ 启动时自动拉取的镜像列表

1
kubectl get pods -n calico-system -o jsonpath='{.items[*].spec.containers[*].image}' | tr ' ' '\n' | sort | uniq
  1. 验证
1
kubectl get pods -n calico-system -w
  1. 删除,(可选)
1
kubectl delete -f custom-resources.yaml

四、验证 Pod 间互通

  1. 创建资源的配置文件
1
vim test-network-linux-ds.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: linux-ds
spec:
selector:
matchLabels:
school: tyust
class: bitdata
template:
metadata:
labels:
school: tyust
class: bitdata
spec:
containers:
- image: alpine:3.23.2
stdin: true
name: mylinux
  1. 创建资源
1
kubectl apply -f test-network-linux-ds.yaml
  1. 查看资源
1
kubectl get pods -o wide
  1. 测试跨节点Pod之间的通信
1
kubectl exec  xxxxxxxxxx -- ping -c 3 xxxxxxxxxx
  1. 删除资源
1
kubectl delete -f  test-network-linux-ds.yaml 

五、nerdctl 的安装

官方仓库

  1. 下载
1
wget https://github.com/containerd/nerdctl/releases/download/v2.2.1/nerdctl-2.2.1-linux-amd64.tar.gz

​ 加速下载

1
wget https://g.bravexist.cn/https://github.com/containerd/nerdctl/releases/download/v2.2.1/nerdctl-2.2.1-linux-amd64.tar.gz
  1. 解压
1
tar xf nerdctl-2.2.1-linux-amd64.tar.gz -C /usr/local/bin
  1. 命令补全
1
source <(nerdctl completion bash)>
  1. 设置别名
1
vim ~/.bashrc
1
alias docker='nerdctl -n k8s.io'
1
source ~/.bashrc

六、总结

发现和旧版本差不多,唯一的区别就是旧版本使用的 docker ,自己对docker 的镜像拉取很熟悉。

而对 containerd 的镜像加速不了解,并且镜像也难以导出导入。

  1. 导出镜像,注意命名空间 -n k8s.io
1
ctr -n k8s.io images export test.tar ghcr.io/flannel-io/flannel-cni-plugin:v1.8.0-flannel1

​ 批量导出,可读性更好

1
ctr -n k8s.io images list | tail -n +2 | egrep -v '^sha256|@' | awk '{name=$1; gsub(/[/:]/, "_", name); print "ctr -n k8s.io images export " name ".tar", $1}'

​ 命名更加规范

1
ctr -n k8s.io images list | tail -n +2 | egrep -v '^sha256|@' | awk '{name=$1; gsub(/[/:.]/, "_", name); print "ctr -n k8s.io images export " name ".tar", $1}'
  1. 导入镜像
1
ctr images import test.tar

​ 批量导入,注意命名空间 -n k8s.io

1
for i in *.tar;do ctr -n k8s.io images import $i;done
  1. 验证镜像
1
ctr -n k8s.io images ls