k8s containerd

为将 Kubernetes v1.26.3 从 Docker(cri-dockerd)迁移为 containerd,并自定义 containerd 的 runc 路径与数据目录,以下是完整操作步骤、配置说明、验证方法以及 crictl/containerd 常用维护命令


🧱 原始 kubelet 配置

你当前的 kubelet 参数为:

KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd \
--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock \
--pod-infra-container-image=registry.k8s.io/pause:3.9 \
--tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"

将 cri-dockerd 替换为 containerd,并配置额外要求。


✅ 总体目标

项目描述
运行时切换 从 cri-dockerd 切换为 containerd
runc 路径 指定为 /opt/mytools/runc
containerd 数据目录 迁移至 /data/containerd/{root,state}
crictl 使用 containerd
配置验证 socket、runtimeType、pod 运行等

📌 1. 安装 containerd + runc

🧩 安装 containerd(推荐用官方二进制)

wget https://github.com/containerd/containerd/releases/download/v1.7.13/containerd-1.7.13-linux-amd64.tar.gz
tar -xvf containerd-1.7.13-linux-amd64.tar.gz
sudo cp bin/* /usr/local/bin/

🧩 安装 runc 到指定目录 /opt/mytools/runc

wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
sudo mkdir -p /opt/mytools/
sudo mv runc.amd64 /opt/mytools/runc
sudo chmod +x /opt/mytools/runc

🛠️ 2. 配置 containerd

✅ 创建目录结构

sudo mkdir -p /data/containerd/{root,state,snapshot-overlayfs}

✅ 生成配置文件

containerd config default | sudo tee /etc/containerd/config.toml

✅ 修改 /etc/containerd/config.toml

version = 2

# 自定义数据目录
root = "/data/containerd/root"
state = "/data/containerd/state"

[grpc]
  address = "/run/containerd/containerd.sock"

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.k8s.io/pause:3.9"

  [plugins."io.containerd.grpc.v1.cri".containerd]
    snapshotter = "overlayfs"
    default_runtime_name = "runc"

    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
      runtime_type = "io.containerd.runc.v2"

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
        BinaryName = "/opt/mytools/runc"

  [plugins."io.containerd.grpc.v1.cri".cni]
    bin_dir = "/opt/cni/bin"
    conf_dir = "/etc/cni/net.d"

[plugins."io.containerd.snapshotter.v1.overlayfs"]
  root_path = "/data/containerd/snapshot-overlayfs"

🔁 3. 重启 containerd 并验证 socket

✅ 重启服务

sudo systemctl daemon-reexec
sudo systemctl restart containerd

✅ 验证监听 socket 是否为 /run/containerd/containerd.sock

ss -lxnp | grep containerd.sock

输出应类似:

u_str LISTEN 0 4096 /run/containerd/containerd.sock 1234/containerd

⚙️ 4. 修改 kubelet 配置切换为 containerd

✅ 编辑配置文件(Ubuntu 为例)

sudo nano /etc/default/kubelet

替换原参数为:

KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd \
--container-runtime-endpoint=unix:///run/containerd/containerd.sock \
--pod-infra-container-image=registry.k8s.io/pause:3.9 \
--tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"

✅ 重启 kubelet

sudo systemctl daemon-reexec
sudo systemctl restart kubelet

🧪 5. 配置并使用 crictl

✅ 安装 crictl

VERSION="v1.29.0"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/${VERSION}/crictl-${VERSION}-linux-amd64.tar.gz
tar zxvf crictl-${VERSION}-linux-amd64.tar.gz
sudo mv crictl /usr/local/bin/

✅ 配置 /etc/crictl.yaml

sudo tee /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

✅ 验证 crictl 使用 containerd

crictl info | grep runtimeType
# 输出: "runtimeType": "io.containerd.runc.v2"

✅ 6. 验证 Kubernetes 使用 containerd 成功

kubectl get nodes -o wide
kubectl run test --image=busybox -- sleep 3600
kubectl get pods
kubectl describe pod test

🧰 7. containerd / crictl 常用维护命令

🔍 查看镜像

crictl images

📦 拉取镜像

crictl pull registry.k8s.io/pause:3.9

📦 查看容器

crictl ps -a

🔧 进入容器(使用 sandbox/container ID)

crictl exec -it <container-id> sh

🧹 删除容器和镜像

crictl rm -f $(crictl ps -a -q)
crictl rmi -f $(crictl images -q)

✅ 总结顺序(脚本化流程)

# 安装 containerd / runc / crictl
# 生成 containerd 配置文件,指定 root/state 和 runc 路径
# 启动 containerd,验证 socket
# 修改 kubelet 使用 containerd
# 配置 crictl 指向 containerd
# 验证 containerd 正常工作(crictl info、kubectl run)

是否需要我生成:

  • 一键 shell 安装与配置脚本?

  • systemd override.conf 文件用于 containerd 自定义启动路径?

  • 备份/迁移旧的 cri-dockerd 配置?

欢迎继续告知需求。

 

/data/containerd/
├── root/ # 存储镜像、元数据、容器元信息(containerd root)
├── state/ # 存储运行时 socket、pid 文件等(containerd state)
├── snapshot-overlayfs/ # overlayfs 的快照元数据(存储增量层)
/opt/mytools/runc # 指定 runc 路径
/etc/containerd/config.toml # 主配置文件

posted on 2025-07-02 17:57  吃草的青蛙  阅读(151)  评论(0)    收藏  举报

导航