一、环境说明(已明确预装组件及依赖关系)

组件

版本 / 状态

作用与说明

操作系统

Ubuntu 24.04.3 LTS (x86_64)

集群基础运行环境,兼容 apt 包管理,适配后续组件安装

Docker

Docker Engine(已预装,确保正常运行)

提供容器运行环境(创建、管理容器),但需通过 cri-dockerd 与 K8s 通信

cri-dockerd

0.3.19(使用 cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb 安装)

作为 Docker 与 K8s 的 “桥梁”,解决 K8s 1.24+ 移除 dockershim 后的适配问题

Kubernetes 组件

kubeadm=1.28.15-00、kubelet=1.28.15-00、kubectl=1.28.15-00

集群核心组件:初始化集群(kubeadm)、节点管理(kubelet)、集群操作工具(kubectl)

网络插件

Flannel v0.22.2

实现 Pod 间网络互通,适配 10.244.0.0/16 网段

二、核心概念:Docker、cri-dockerd 与 K8s 的关系(为什么需要 cri-dockerd 0.3.19)

1. 关键背景:K8s 与 Docker 的 “适配断层”

K8s 要管理容器,需要通过 容器运行时接口(CRI) 与容器运行时(如 Docker、containerd)通信。但在 K8s 1.24 及以后版本 中,官方移除了内置的 dockershim(之前用于连接 K8s 与 Docker 的组件),导致 K8s 无法直接识别 Docker。

而 Docker 本身并不原生支持 CRI 接口,因此需要一个 “中间件” 来桥接 —— 这就是 cri-dockerd 的核心作用。

2. 为什么选择 cri-dockerd 0.3.19?

  • 版本兼容性:cri-dockerd 0.3.19 适配 K8s 1.28 版本(用户目标版本),同时兼容 Ubuntu 24.04 系统及已预装的 Docker 版本,避免新版本适配问题;

  • deb 包可用性:用户已获取 cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb 包,直接安装无需源码编译,简化流程;

  • 稳定性验证:0.3.19 是经过实践验证的稳定版本,无明显已知 bug,适合生产测试环境使用。

3. 三者工作流程

plaintext

K8s(kubelet) → 调用 CRI 接口 → cri-dockerd(转换接口) → Docker Engine(实际创建/管理容器)

三、全流程操作步骤(基于已装 Docker 的前提)

第一步:前置准备与环境验证

1. 验证已装 Docker 状态(核心前提)

bash

# 检查 Docker 是否正常运行
sudo systemctl status docker

  • 正常结果:输出 active (running),绿色字体标注运行状态,无红色错误日志;

  • 异常处理:若 Docker 未启动,执行 sudo systemctl start docker && sudo systemctl enable docker 启动并设置开机自启。

2. 安装基础工具(编译 / 依赖支持)

bash

sudo apt update && sudo apt install -y git build-essential

  • 正常结果:无 Error 提示,工具安装完成(已安装则提示 already the newest version);

  • 常见错误:若提示 “GPG 签名验证失败”,执行:

    bash

    # 替换 XXXXXXXX 为错误中的公钥编号(如 3B4FE6ACC0B21F32)
    sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com XXXXXXXX
    sudo apt clean && sudo apt update
    

第二步:安装 cri-dockerd 0.3.19(桥接 Docker 与 K8s)

1. 确认 deb 包存在

bash

# 检查当前目录是否有目标 deb 包
ls | grep cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb

  • 正常结果:输出 cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb,确认文件存在。

2. 安装 cri-dockerd 并修复依赖

bash

# 安装 deb 包(Ubuntu 24.04 可能需补充旧版本兼容依赖)
sudo dpkg -i cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb
# 自动修复依赖缺失(关键步骤,避免安装失败)
sudo apt -f install -y

  • 正常结果:输出 Setting up cri-dockerd (0.3.19.3-0.ubuntu-bionic),无 dpkg: error 提示。

3. 启动并验证 cri-dockerd 服务

bash

# 重载服务配置
sudo systemctl daemon-reload
# 启动 cri-dockerd(依赖 Docker 已运行)
sudo systemctl start cri-docker
# 设置开机自启
sudo systemctl enable cri-docker
# 验证状态
sudo systemctl status cri-docker

  • 正常结果status 显示 active (running),日志无 “无法连接 Docker” 的错误。

常见错误与修正

  • 错误 1:cri-dockerd 启动失败,提示 “cannot connect to Docker daemon”
    现象:status 显示 failed,日志含 Cannot connect to the Docker daemon at unix:///var/run/docker.sock
    原因:Docker 未启动或未正常运行;
    修正:

    bash

    sudo systemctl restart docker
    sudo systemctl restart cri-docker
    

    结果:cri-dockerd 成功启动,显示 active (running)

  • 错误 2:deb 包安装提示 “架构不匹配”
    现象:dpkg: error: package architecture (amd64) does not match system (arm64)
    原因:deb 包是 amd64 架构,与机器 arm64 架构不兼容;
    修正:执行 dpkg --print-architecture 确认机器架构,下载对应架构的 cri-dockerd 0.3.19 deb 包后重新安装。

第三步:安装 Kubernetes 1.28 核心组件

1. 配置 K8s 软件源(阿里云源,避免官方源访问问题)

bash

# 下载 K8s 官方密钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
# 添加 K8s 1.28 版本源(适配 Ubuntu 24.04)
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

  • 正常结果:无报错,/etc/apt/sources.list.d/kubernetes.list 文件创建成功。

2. 安装并锁定 1.28 版本组件

bash

# 更新源并安装指定版本(确保三者版本一致)
sudo apt update && sudo apt install -y kubeadm=1.28.15-00 kubelet=1.28.15-00 kubectl=1.28.15-00
# 锁定版本,防止系统自动更新导致版本不兼容
sudo apt-mark hold kubeadm kubelet kubectl

  • 正常结果:组件安装完成,执行 apt-mark showhold 可看到 3 个组件已被锁定。

3. 配置 kubelet 指向 cri-dockerd(关键:让 K8s 找到容器运行时)

bash

# 写入 kubelet 额外参数(指定 cri-dockerd 端点)
sudo tee /etc/default/kubelet <<-'EOF'
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock"
EOF
# 重启 kubelet 使配置生效
sudo systemctl daemon-reload
sudo systemctl restart kubelet

  • 正常结果systemctl restart kubelet 无报错,sudo systemctl status kubelet 显示 active (running)

常见错误与修正

  • 错误 3:安装 K8s 组件提示 “无法定位包”
    现象:E: Unable to locate package kubeadm=1.28.15-00
    原因:源未同步或配置错误;
    修正:

    bash

    sudo rm /etc/apt/sources.list.d/kubernetes.list
    echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo apt update --fix-missing
    


    结果:重新安装组件,正常下载完成。

第四步:初始化 Master 节点(单节点核心步骤)

1. 清理历史残留(若之前初始化失败)

bash

# 强制重置 K8s 环境
sudo kubeadm reset -f
# 删除残留配置与数据(避免“文件已存在/端口占用”错误)
sudo rm -rf /etc/kubernetes/manifests/* /etc/kubernetes/pki/* /etc/cni/net.d /var/lib/etcd /var/lib/kubelet $HOME/.kube
# 释放 K8s 核心端口(10250:kubelet 端口;6443:apiserver 端口)
sudo kill -9 $(sudo lsof -i :10250 | grep LISTEN | awk '{print $2}') 2>/dev/null
sudo kill -9 $(sudo lsof -i :6443 | grep LISTEN | awk '{print $2}') 2>/dev/null

  • 正常结果:无报错,残留文件与占用端口清理完成。

2. 初始化 Master 节点

bash

sudo kubeadm init \
  --cri-socket unix:///var/run/cri-dockerd.sock \  # 明确指向 cri-dockerd 端点
  --pod-network-cidr=10.244.0.0/16                # 适配 Flannel 网络插件

  • 正常结果:1-3 分钟后,输出 Your Kubernetes control-plane has initialized successfully!,并附带 kubeadm join 命令(复制保存,用于后续添加节点)。

3. 配置 kubectl 权限(当前用户操作集群)

bash

# 创建 kubectl 配置目录
mkdir -p $HOME/.kube
# 复制 Master 配置文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 修正文件权限(避免“权限不足”错误)
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证 kubectl 可用性
kubectl get nodes

  • 正常结果kubectl get nodes 显示节点信息,STATUS 为 NotReady(未部署网络插件),无连接错误。

常见错误与修正

  • 错误 4:初始化提示 “[ERROR CRI] container runtime is not running”
    现象:初始化中断,提示 cri-dockerd 未运行;
    原因:cri-dockerd 服务未启动或端点配置错误;
    修正:

    bash

    sudo systemctl restart cri-docker
    # 验证 cri-dockerd 端点是否可用
    sudo ctr --address unix:///var/run/cri-dockerd.sock version
    


    结果:ctr version 输出 Client/Server 信息,重新初始化成功。

第五步:部署 Flannel 网络插件(节点变 Ready 的关键)

bash

# 部署 Flannel 稳定版本(适配 10.244.0.0/16 网段)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.2/Documentation/kube-flannel.yml
# 验证 Flannel 状态(等待 1-2 分钟)
kubectl get pods -n kube-flannel

  • 正常结果:Flannel Pod(名称类似 kube-flannel-ds-xxxx)的 STATUS 为 Running

常见错误与修正

  • 错误 5:Flannel Pod 处于 “ImagePullBackOff”
    现象:拉取 quay.io/coreos/flannel 镜像超时;
    原因:国外镜像源访问受限;
    修正:替换为国内阿里云镜像:

    bash

    # 下载配置文件到本地
    wget https://raw.githubusercontent.com/flannel-io/flannel/v0.22.2/Documentation/kube-flannel.yml
    # 替换镜像地址
    sed -i 's/quay.io\/coreos\/flannel/registry.cn-hangzhou.aliyuncs.com\/google_containers\/flannel/g' kube-flannel.yml
    # 重新部署
    kubectl apply -f kube-flannel.yml
    


    结果:Flannel Pod 成功拉取镜像,STATUS 变为 Running

第六步:允许 Master 节点调度 Pod(单节点专属配置)

默认情况下,Master 节点会添加 “污点”(Taint)禁止调度 Pod,需手动移除,让其同时承担 Worker 功能:

bash

# 移除控制平面污点(适配 K8s 1.24+)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
# 移除旧版本 master 污点(兼容低版本标签)
kubectl taint nodes --all node-role.kubernetes.io/master-

  • 正常结果:执行 kubectl describe node | grep Taint 无输出(无调度限制)。

常见错误与修正

  • 错误 6:创建 Pod 提示 “Pending”,无可用节点
    现象:kubectl run test-nginx --image=nginx 后,Pod 状态为 Pending
    原因:污点未成功移除;
    修正:

    bash

    # 强制覆盖移除污点
    kubectl taint nodes --all node-role.kubernetes.io/control-plane- --overwrite
    


    结果:Pod 调度成功,STATUS 变为 Running

第七步:集群最终验证

bash

# 1. 验证节点状态(需为 Ready)
kubectl get nodes
# 2. 验证 K8s 核心组件状态(均为 Running)
kubectl get pods -n kube-system
# 3. 验证容器调度功能(可选)
kubectl run test-nginx --image=nginx:alpine
kubectl get pods

  • 正常结果

    1. 节点 STATUS 为 ReadyROLES 为 control-plane(Master+Worker 合一);

    2. kube-apiserverkube-controller-managerkube-scheduleretcdflannel 均为 Running

    3. 测试 Pod test-nginx 状态为 Running

四、单节点升级为多节点集群(添加 Master/Worker)

(一)添加 Worker 节点(扩展计算资源)

前提条件

  1. 新节点:Ubuntu 24.04.3 LTS(x86_64),与 Master 网络互通;

  2. 新节点已预装:Docker(正常运行)、cri-dockerd 0.3.19(步骤同第二步)、K8s 1.28 组件(kubeadm=1.28.15-00、kubelet=1.28.15-00)。

操作步骤

  1. Master 节点生成加入命令(若之前的命令过期):

    bash

    kubeadm token create --print-join-command
    

    输出示例:kubeadm join 192.168.31.19:6443 --token abc123.def456 --discovery-token-ca-cert-hash sha256:xxxxxxxx

  2. 新 Worker 节点执行加入命令

    bash

    # 替换为 Master 生成的实际命令
    sudo kubeadm join 192.168.31.19:6443 --token abc123.def456 --discovery-token-ca-cert-hash sha256:xxxxxxxx
    

    • 正常结果:输出 This node has joined the cluster

  3. Master 节点验证

    bash

    kubectl get nodes
    

    • 正常结果:新节点显示在列表中,STATUS 为 ReadyROLES 为 <none>(可手动添加标签:kubectl label node 节点名 node-role.kubernetes.io/worker=worker)。

(二)添加 Master 节点(构建高可用集群)

前提条件

  1. 新节点配置与现有 Master 一致,网络互通;

  2. 部署负载均衡器(如 HAProxy),统一入口地址(如 192.168.31.100),指向所有 Master 的 6443 端口;

  3. 为 etcd 配置共享存储(如 NFS),确保多 Master 数据同步。

操作步骤

  1. 现有 Master 节点导出证书与配置

    bash

    mkdir -p /tmp/k8s-certs
    # 复制核心证书(用于新 Master 接入)
    sudo cp /etc/kubernetes/pki/{ca.crt,ca.key,sa.pub,sa.key,front-proxy-ca.crt,front-proxy-ca.key} /tmp/k8s-certs/
    sudo cp /etc/kubernetes/pki/etcd/ca.crt /tmp/k8s-certs/etcd-ca.crt
    sudo cp /etc/kubernetes/admin.conf /tmp/k8s-certs/
    

  2. 复制证书到新 Master 节点(替换 新节点IP 和 用户名):

    bash

    scp -r /tmp/k8s-certs/* 用户名@新节点IP:/tmp/
    

  3. 新 Master 节点准备证书与配置

    bash

    sudo mkdir -p /etc/kubernetes/pki/etcd
    sudo cp /tmp/{ca.crt,ca.key,sa.pub,sa.key,front-proxy-ca.crt,front-proxy-ca.key} /etc/kubernetes/pki/
    sudo cp /tmp/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
    # 配置 kubectl
    mkdir -p $HOME/.kube
    sudo cp /tmp/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

  4. 新 Master 节点加入集群

    bash

    # 替换为负载均衡器地址、实际 token 和 hash
    sudo kubeadm join 192.168.31.100:6443 \
      --token abc123.def456 \
      --discovery-token-ca-cert-hash sha256:xxxxxxxx \
      --control-plane \
      --certificate-key $(sudo kubeadm certs certificate-key)
    

    • 正常结果:输出 This node has joined the cluster as a control-plane node

  5. 验证

    bash

    kubectl get nodes
    

    • 正常结果:新 Master 节点 STATUS 为 ReadyROLES 为 control-plane

五、关键注意事项

  1. Docker 状态优先检查:cri-dockerd 完全依赖 Docker,所有节点必须确保 Docker 正常运行,避免 cri-dockerd 启动失败;

  2. 版本严格一致:所有节点的 kubeadm、kubelet、kubectl、cri-dockerd 版本必须与 Master 一致(如均为 1.28.15、0.3.19),否则会出现兼容性错误;

  3. 网络互通:节点间需开放 6443(apiserver)、2379/2380(etcd)、10250(kubelet)端口,或关闭防火墙(测试环境);

  4. 多 Master 高可用:必须配置负载均衡器和 etcd 共享存储,否则多 Master 无法同步数据,集群不稳定。