Skip to content

升级

1.23.6 升级到 1.24.17

运行时升级

Kubernetes 1.24 开始,dockershim 被彻底移除了,所以 kubelet/kubeadm 不再支持通过 dockershim.sock 拉取镜像。你的环境现在还在用 Docker (dockershim),所以 kubeadm 升级时会失败。

  • 安装 containerd
bash
apt-get install -y containerd.io
  • 初始化配置:
bash
containerd config default | tee /etc/containerd/config.toml
  • 编辑 /etc/containerd/config.toml,找到:
toml
[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"
  • 然后设置默认 runtime 为 systemd cgroup:
toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
 SystemdCgroup = true
  • 设置 crictl 的配置文件
shell
cat >/etc/crictl.yaml<<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
  • 重启:
bash
systemctl restart containerd
systemctl enable containerd
  • 修改 kubelet 配置,指向 containerd

编辑 /var/lib/kubelet/kubeadm-flags.env,把 --container-runtime-endpoint 改成:

yaml
--container-runtime-endpoint=unix:///run/containerd/containerd.sock
  • 注意子节点需要额外增加
yaml
--container-runtime=remote
  • 重启 kubelet:
bash
systemctl daemon-reexec
systemctl restart kubelet
  • 确认 kubelet 已使用 containerd:
bash
crictl info
  • 再执行升级:
bash
kubeadm upgrade apply v1.24.17

Step 1.3 执行升级

bash
kubeadm upgrade apply v1.24.17

kubeadm upgrade apply v1.24.17 --ignore-preflight-errors=all

执行成功后,control-plane 组件(apiserver、controller、scheduler、coredns 等)会自动升级。

Step 1.4 升级 kubelet / kubectl

bash
apt-mark unhold kubelet kubectl
apt-get install -y kubelet=1.24.17-00 kubectl=1.24.17-00
apt-mark hold kubelet kubectl
systemctl daemon-reexec
systemctl restart kubelet

确认:

bash
kubectl get nodes

0. 前置准备

  1. 确认当前版本:

    bash
    kubeadm version
    kubectl version --short
    kubelet --version
  2. 检查集群健康:

    bash
    kubectl get nodes -o wide
    kubectl get pods -n kube-system -o wide

    所有节点必须是 Ready,系统 Pod(apiserver、scheduler、etcd、coredns 等)都要 Running。 ❗如果 master 是 NotReady,先修复(一般是 kubelet/apiserver 没起来)。

  3. 备份 etcd(推荐):

    bash
    ETCDCTL_API=3 etcdctl \
      --endpoints=https://127.0.0.1:2379 \
      --cacert=/etc/kubernetes/pki/etcd/ca.crt \
      --cert=/etc/kubernetes/pki/etcd/server.crt \
      --key=/etc/kubernetes/pki/etcd/server.key \
      snapshot save /root/etcd-snapshot.db

1. 升级 Master 节点

Step 1.1 更新 kubeadm

bash
apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=1.24.17-00
apt-mark hold kubeadm

确认版本:

bash
kubeadm version

Step 1.2 计划升级

bash
kubeadm upgrade plan

确认会显示 v1.24.17 为可升级目标。

2. 升级 Worker 节点

逐个节点操作,不要一次性全搞,避免集群不可用。

Step 2.1 将节点排空

在 master 上执行:

bash
kubectl drain <worker-node-name> --ignore-daemonsets --delete-emptydir-data

Step 2.2 SSH 到 worker 节点,升级 kubeadm

bash
apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=1.24.17-00
apt-mark hold kubeadm

执行节点升级:

bash
kubeadm upgrade node

Step 2.3 升级 kubelet / kubectl

bash
apt-mark unhold kubelet kubectl
apt-get install -y kubelet=1.24.17-00 kubectl=1.24.17-00
apt-mark hold kubelet kubectl
systemctl daemon-reexec
systemctl restart kubelet

Step 2.4 解除节点隔离

在 master 上执行:

bash
kubectl uncordon <worker-node-name>

确认 worker 已恢复 Ready

3. 验证

  • 检查节点状态:

    bash
    kubectl get nodes

    所有节点应该显示 v1.24.17、状态 Ready

  • 检查系统 Pod:

    bash
    kubectl get pods -n kube-system -o wide
  • 检查集群版本:

    bash
    kubectl version --short