麒麟10部署基于CRI为containerd,CNI为calico的k8s集群全流程

0 阅读5分钟

环境初始化

更换防火墙规则

# 关闭firewalld
systemctl stop firewalld
systemctl disable firewalld

# 开启iptables
yum -y install iptables-services
systemctl enable --now iptables

# 删除所有规则持久化保存
iptables -F
service iptables save

禁用SELinux

添加集群节点映射

cat >> /etc/hosts <<EOF

# Kubernetes Cluster Nodes
10.10.156.239 k8s01
10.10.156.240 k8s02
10.10.156.241 k8s03
EOF

安装ipvs

yum install -y ipvsadm

开启路由转发

# 配置路由转发
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf  

# 应用/etc/sysctl.conf中配置
sysctl -p

安装网桥管理工具

# 安装epel仓库
yum install -y epel-release
# 提供官方源中没有的软件包,/etc/yum.repo.d目录下有新的repo文件
# 麒麟系统默认源有网桥就不需要安装这个仓库

# 从epel源中安装网桥管理工具
yum install -y bridge-utils
# 为虚拟化做准备
# 提供brctl命令,用于管理 Linux 网桥。kubeadm/kubelet 初始化时创建网络插件(比如 Calico)可能需要用到网桥,但通常不是必须的。

加载模块

# 加载模块

# 让所有经过网桥(bridge)的流量经过iptables的规则处理
modprobe br_netfilter
# 提供 OverlayFS 联合文件系统支持
modprobe overlay

# 查看模块是否已加载
lsmod | grep br_netfilter overlay

# 将模块添加到开机自启
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

添加内核参数

# 开启路由转发
# ipv4下所有流量需要被防火墙回调
# ipv6下所有流量需要被防火墙回调

cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 应用/etc/sysctl.d/k8s.conf中配置
sysctl -system
# 此命令会先加载/etc/sysctl.conf/*.conf文件,最后加载/etc/sysctl.conf优先级最高主配置文件用来覆盖重名内核参数
# sysctl -p只会加载/etc/sysctl.conf主配置文件

安装Containerd

添加docker-ce源

# 安装三个依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2

# 从阿里镜像网站下载docker-ce.repo
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 将里面地址换为阿里镜像
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

安装containerd

# 麒麟V10默认可能预装Podman,需要先卸载 
yum remove -y podman

# 安装containerd.io
yum -y install containerd.io-1.6.33
# 或者containerd

# 验证runc是否作为依赖被安装
runc --version

配置containerd

# 生成默认配置 
mkdir -p /etc/containerd 
containerd config default > /etc/containerd/config.toml

# 注意文件中是否有下面内容
version = 3
imports = ['/etc/containerd/conf.d/*.toml']
# 如果有,就可以在该目录下独立编辑配置文件,**合并加载**,不必在主配置文件中修改
# 遇到相同键,import引入的值会覆盖主配置文件的值

# 独立编辑配置文件,将要修改项放入
vi /etc/containerd/conf.d/k8s.toml
# 记得加入主配置文件中提到的version
version = 3
# SystemdCgroup 的路径
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runc.options]
  SystemdCgroup = true
# sandbox_image 的路径
[plugins."io.containerd.cri.v1.images".pinned_images]
  sandbox = "registry.aliyuncs.com/google_containers/pause:3.9"
# mirrors 的路径
[plugins."io.containerd.cri.v1.images".registry.mirrors."docker.io"]
  endpoint = ["https://docker.m.daocloud.io"]
[plugins."io.containerd.cri.v1.images".registry.mirrors."registry.k8s.io"]
  endpoint = ["https://registry.aliyuncs.com/google_containers"]
—————————此内容为在主配置文件中修改(且对应containerd版本为1.x版本)—————————————————————

# 1. 修改SystemdCgroup(重要!)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true  # 将false改为true

# 2. 修改pause镜像为国内源
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
# 如果本地有,填错了也无所谓,优先本地

# 3. 配置镜像加速器
[plugins."io.containerd.grpc.v1.cri".registry]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    # 这里配置不同registry的镜像加速器
    
    # 1. docker.io 的加速器(最重要!)
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
      endpoint = ["https://docker.m.daocloud.io"]
      # docker.io的国内镜像加速器
    
    # 2. registry.k8s.io 的加速器(K8s镜像)
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
      endpoint = ["https://registry.aliyuncs.com/google_containers"]
      # registry.k8s.io的国内镜像仓库
      # 后续kubeadm初始化的时候 image-registry的值也得填这个,优先级比这个高
# 可在启动后验证合并配置是否生效
containerd config dump | grep -A 5 "SystemdCgroup|sandbox_image|mirrors"

启动containerd

systemctl enable --now containerd
systemctl status containerd

添加k8s的yum源

cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装crictl-tools

# 安装cri-tools也就是ctictl,官方提供的CRI调试工具
yum install -y cri-tools

# 验证
crictl --version
crictl info

# 看到
"RuntimeReady": true   // ✅ CRI插件已正常工作
"NetworkReady": false  // ⚠️ CNI未配置(但kubeadm会自动处理)

开始部署

安装k8s组件

————————————————————————----——在三个节点都执行————————————————————————————————————

# 安装kubelet、kubeadm、kubectl
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes
# 基础仓库(如 BaseOS)可能会设置exclude或includepkg规则,把 `kubeadm`, `kubelet` 等划为“非系统原生包”,在安装时直接被排除。所以需要--disableexcludes防范干扰
# 通常不会这么做

# 启用并设置开机自启kubelet服务
systemctl enable --now kubelet

# 验证安装
kubeadm version
kubelet --version
kubectl version --client

初始化集群

---------------------------只在k8s01上执行------------------------------------

# 初始化集群(使用阿里云镜像源)
kubeadm init \
  --apiserver-advertise-address=10.10.156.239 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket=unix:///run/containerd/containerd.sock
  # 如果节点上装有多个容器运行时(如 containerd 和 Docker),可此参数指定一个特定的CRI套接字

# 得到join命令,用于另外两个节点加入集群
kubeadm join 10.10.156.239:6443 --token 8ot8a5.p60omx6ptm7gejak \
        --discovery-token-ca-cert-hash sha256:964c898f6f40f0020a2db47372508a928a4a1ffa4ad56a3694b85bcfdc19495d


# 验证kubelet状态
systemctl status kubelet
# 在kubeadm init前,会出现“故障”,并非报错,而是先挂起等待配置文件
# kubeadm init会自动生成配置文件
# 配置文件生成后,会主动重启kubelet
# 如果不提前开启kubelet,初始化时会不识别该服务导致失败

# 配置kubectl(在哪个节点配置,哪个节点能使用)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 查看集群状态
kubectl get nodes

Q

为什么2,3工作节点无法get nodes?

因为没有.kube/config文件,所以这是正常的,不推荐工作节点使用kubectl

在Node节点执行 kubeadm join

--------------------------在 k8s02 和 k8s03 上执行-------------------------------

# 执行 join 命令(使用上面复制的命令)
kubeadm join 10.10.156.239:6443 --token 8ot8a5.p60omx6ptm7gejak \
        --discovery-token-ca-cert-hash sha256:964c898f6f40f0020a2db47372508a928a4a1ffa4ad56a3694b85bcfdc19495d
        

# 验证kubelet状态
systemctl status kubelet
# 应该在加入集群后kubelet状态才正常,因为加入过程中才会创建配置文件

Q

为什么三个节点状态都是notready?

A

因为必须处于扁平化网络,所以部署CNI插件之前,这是正常的

部署CNI插件

Q

coredns为pending状态,etcd,scheduler只有一个,是不是因为没有部署CNI插件?那为什么kubeproxy有三个?

A

导入镜像包

-----------------------------三个节点都导入----------------------------------------

# 导入镜像
for img in calico-images/*.tar; do
    echo ">>> 正在导入: $img"
    ctr -n k8s.io images import "$img"
done

# 查看 k8s.io 命名空间下的 calico 相关镜像
ctr -n k8s.io images ls | grep calico

应用calico yaml文件

# 修改	
CALICO_IPV4POOL_CIDR	指定为 pod 地址
	
# 修改为 BGP 模式
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
  value: "Always"  #改成Off

k apply -f calico-typha.yaml