Kubernetes学习路径——3. Kubernetes 1.25 高可用集群部署实战:从 Docker 到 Calico 全链路详解

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-worker01k8s-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 路径错误

  • 解决

    bash 复制代码
    systemctl status cri-docker.socket
    ls -l /var/run/cri-dockerd.sock

常见问题 2:节点 NotReady

  • 排查步骤
    1. 检查 Calico Pod 状态:kubectl get pods -n calico-system
    2. 检查 kubelet 日志:journalctl -u kubelet -f
    3. 验证网络连通性:ping 172.16.110.115(跨节点)

常见问题 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 集群部署,你就拥有了构建现代化云原生平台的核心能力。现在,你的容器化应用终于有了一个强大、安全、可扩展的运行环境!

相关推荐
bukeyiwanshui1 小时前
20260512 docker笔记
linux·运维·笔记·docker·容器
dhashdoia1 小时前
Claude Code /goal功能深度解析:从自动化编程到目标驱动开发
运维·人工智能·自动化·claude
黑贝是条狗1 小时前
Excel批量处理工具
linux·运维·excel
实心儿儿1 小时前
Linux —— 进程间通信 - 匿名管道
linux·运维·服务器
LuDvei1 小时前
Ubuntu 20.04 安装 Android Studio 详细指南
linux·ubuntu·android studio
枕星而眠1 小时前
Linux 共享内存与信号量全解析:原理、实践与避坑指南
linux·c语言·开发语言·后端·ubuntu
今天也是元气满满的一天呢1 小时前
20260512-SQL学习大览
数据库·sql·学习
小新同学^O^1 小时前
简单学习 --> Cookie 和Session
学习
wgl6665201 小时前
进程间通信
linux·运维·服务器