Kubernetes 1.25 高可用集群部署实战:从 Docker 到 Calico 全链路详解
Kubernetes 1.24+ 版本移除了对 Docker 的原生支持(dockershim),但这并不意味着 Docker 无法继续使用。通过 cri-dockerd 这一兼容层,我们依然可以构建一个稳定、高性能的 K8s 集群。本文将手把手教你完成整个部署过程,并深入解析关键配置背后的原理。
为什么选择此方案?
- ✅ 平滑过渡:现有 Docker 生态无缝迁移
- ✅ 生产就绪:Calico 提供企业级网络与安全策略
- ✅ 版本锁定:精确控制组件版本,避免兼容性问题
一、环境准备:夯实基础
1.1 主机规划
| 角色 | 主机名 | IP | 配置 |
|---|---|---|---|
| Master | k8s-master01 | 172.16.110.114 | 4C/8G/100GB |
| Worker | k8s-worker01 | 172.16.110.115 | 4C/8G/100GB |
| Worker | k8s-worker02 | 172.16.110.116 | 4C/8G/100GB |
1.2 系统初始化(所有节点)
步骤 1:主机名与解析
bash
# 设置主机名(各节点执行)
hostnamectl set-hostname k8s-master01 # master 节点
hostnamectl set-hostname k8s-worker01 # worker01 节点
# 配置 /etc/hosts
cat >> /etc/hosts <<EOF
172.16.110.114 k8s-master01
172.16.110.115 k8s-worker01
172.16.110.116 k8s-worker02
EOF
步骤 2:系统优化
bash
# 关闭防火墙与 SELinux
systemctl disable --now firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 时间同步
yum install -y chrony
echo "server time1.aliyun.com iburst" >> /etc/chrony.conf
systemctl enable --now chronyd
# 内核升级(可选但推荐)
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
grub2-set-default 0 && grub2-mkconfig -o /boot/grub2/grub.cfg
reboot # 重启生效
步骤 3:K8s 必需内核参数
bash
# 网络与转发配置
cat > /etc/sysctl.d/k8s.conf < /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
# 永久关闭 Swap
sed -i '/swap/s/^/#/' /etc/fstab
swapoff -a
🔍 关键点解析:
br_netfilter:确保 iptables 能正确处理网桥流量IPVS:替代 iptables 实现 O(1) 复杂度的 Service 负载均衡- Swap 必须关闭:K8s 调度器依赖内存压力驱逐机制
二、容器运行时:Docker + cri-dockerd
2.1 安装 Docker
bash
# 配置源
wget https://mirrors.163.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 安装最新版
yum install -y docker-ce
# 配置 systemd cgroup 驱动
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl enable --now docker
2.2 安装 cri-dockerd(K8s 1.24+ 必备)
bash
# 下载并安装
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.3/cri-dockerd-0.3.3-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.3-3.el7.x86_64.rpm
# 配置服务(关键!指定 pause 镜像)
sed -i 's|ExecStart=/usr/bin/cri-dockerd.*|ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.k8s.io/pause:3.8|' /usr/lib/systemd/system/cri-docker.service
# 启动服务
systemctl daemon-reload
systemctl enable --now cri-docker.socket
⚠️ 为什么需要 cri-dockerd ?
Kubernetes 1.24+ 移除了 dockershim,而 Docker 本身不支持 CRI(容器运行时接口)。cri-dockerd 作为 shim 层,将 CRI 请求转换为 Docker API 调用,实现兼容。
三、Kubernetes 组件安装
3.1 配置 YUM 源
bash
# 使用阿里云镜像(推荐)
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
3.2 安装指定版本
bash
# 锁定 1.25.0 版本(避免碎片化)
yum install -y kubeadm-1.25.0 kubelet-1.25.0 kubectl-1.25.0
# 配置 kubelet 使用 systemd cgroup
echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" > /etc/sysconfig/kubelet
# 启用服务(此时会报错,属正常现象)
systemctl enable kubelet
3.3 预拉取镜像(解决网络问题)
bash
# 定义镜像列表
images=(
kube-apiserver:v1.25.0
kube-controller-manager:v1.25.0
kube-scheduler:v1.25.0
kube-proxy:v1.25.0
pause:3.8
etcd:3.5.4-0
coredns:v1.9.3
)
# 从阿里云拉取并重命名
for img in "${images[@]}"; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$img
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$img registry.k8s.io/$img
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$img
done
# 特殊处理 CoreDNS
docker tag registry.k8s.io/coredns:v1.9.3 registry.k8s.io/coredns/coredns:v1.9.3
docker rmi registry.k8s.io/coredns:v1.9.3
💡 镜像加速技巧 :
若阿里云无对应版本,可使用
docker.io/mirrorgooglecontainers或手动导入离线包
四、集群初始化与节点加入
4.1 初始化 Master 节点
bash
kubeadm init \
--apiserver-advertise-address=172.16.110.114 \
--kubernetes-version=v1.25.0 \
--service-cidr=10.16.0.0/16 \
--pod-network-cidr=10.26.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
🔑 参数详解:
--cri-socket:必须指定,否则 kubeadm 无法识别容器运行时--pod-network-cidr:必须与后续 Calico CIDR 一致--ignore-preflight-errors=all:跳过部分检查(如 swap)
4.2 配置 kubectl
bash
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf # 临时生效
4.3 加入 Worker 节点
在 k8s-worker01 和 k8s-worker02 上执行:
bash
kubeadm join 172.16.110.114:6443 \
--token \
--discovery-token-ca-cert-hash sha256: \
--cri-socket unix:///var/run/cri-dockerd.sock
💡 Token 管理:
- Token 默认 24 小时过期
- 重新生成:
kubeadm token create --print-join-command
五、网络插件:Calico 部署
5.1 安装 Tigera Operator
bash
# 下载 Operator 清单
wget https://docs.projectcalico.org/manifests/tigera-operator.yaml
# 应用清单
kubectl create -f tigera-operator.yaml
5.2 配置 Calico(关键步骤)
bash
# 下载自定义资源文件
wget https://docs.projectcalico.org/manifests/custom-resources.yaml
# 修改 CIDR(必须与 pod-network-cidr 一致!)
sed -i 's|cidr: 192.168.0.0/16|cidr: 10.26.0.0/16|' custom-resources.yaml
# 应用配置
kubectl apply -f custom-resources.yaml
5.3 验证网络状态
bash
# 监控 Calico Pod 启动
watch kubectl get pods -n calico-system
# 预期输出(全部 Running):
# calico-kube-controllers-xxx 1/1 Running
# calico-node-xxx 1/1 Running
# calico-typha-xxx 1/1 Running
# 检查 CoreDNS(联网成功标志)
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 应为 Running 状态
🌐 Calico 优势:
- 基于 BGP 的纯三层网络,无 Overlay 开销
- 支持 NetworkPolicy 实现微隔离
- Typha 组件提升大规模集群性能
六、集群验证与调优
6.1 基础验证
bash
# 节点状态
kubectl get nodes
# 输出:所有节点应为 Ready 状态
# 组件健康
kubectl get cs
# 注意:v1.19+ ComponentStatus 已弃用,仅作参考
# Pod 网络测试
kubectl run test --image=busybox --rm -it --restart=Never -- ping k8s-worker01
6.2 Master 节点调度(可选)
bash
# 移除 Master 污点(仅测试环境!)
kubectl taint node k8s-master01 node-role.kubernetes.io/control-plane:NoSchedule-
⚠️ 生产环境警告 :
切勿在生产环境移除 Master 污点!这会导致应用 Pod 调度到 Master 节点,影响集群稳定性。
6.3 Calicoctl 安装(高级管理)
bash
# 下载客户端
curl -L https://github.com/projectcalico/calico/releases/download/v3.26.1/calicoctl-linux-amd64 -o /usr/bin/calicoctl
chmod +x /usr/bin/calicoctl
# 验证连接
DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes
七、故障排查指南
常见问题 1:[ERROR CRI]: container runtime is not running
-
原因:cri-dockerd 未启动或 socket 路径错误
-
解决 :
bashsystemctl status cri-docker.socket ls -l /var/run/cri-dockerd.sock
常见问题 2:节点 NotReady
- 排查步骤 :
- 检查 Calico Pod 状态:
kubectl get pods -n calico-system - 检查 kubelet 日志:
journalctl -u kubelet -f - 验证网络连通性:
ping 172.16.110.115(跨节点)
- 检查 Calico Pod 状态:
常见问题 3:CoreDNS CrashLoopBackOff
-
原因:网络插件未就绪或 DNS 配置冲突
-
解决 :
bash# 检查 CoreDNS 日志 kubectl logs -n kube-system -l k8s-app=kube-dns # 临时增加副本数 kubectl scale -n kube-system deployment/coredns --replicas=2
八、总结:K8s 1.25 部署 Checklist
| 阶段 | 关键动作 | 验证命令 |
|---|---|---|
| 系统初始化 | 关闭 Swap、加载内核模块 | swapon --show, lsmod |
| 容器运行时 | 安装 cri-dockerd、配置 socket | systemctl status cri-docker.socket |
| 组件安装 | 锁定版本、预拉取镜像 | kubeadm config images list |
| 集群初始化 | 指定 --cri-socket、CIDR |
kubectl get nodes |
| 网络插件 | Calico CIDR 与 pod-network 一致 | kubectl get pods -n calico-system |
掌握 Kubernetes 1.25 集群部署,你就拥有了构建现代化云原生平台的核心能力。现在,你的容器化应用终于有了一个强大、安全、可扩展的运行环境!