Containerd 工具链与 Kubernetes 集群搭建核心实战

一、nerdctl 配置与容器管理

1. 配置文件与连接顺序

  • 配置文件路径

    • rootful(全局):/etc/nerdctl/nerdctl.toml
    • rootless(用户):~/.config/nerdctl/nerdctl.toml
  • 关键配置项

    toml 复制代码
    address = "unix:///run/containerd/containerd.sock"
    hosts_dir = ["/etc/containerd/certs.d", "/etc/docker/certs.d"]
    namespace = "default"
  • Socket 查找顺序 (由高到低):

    1. 命令行参数 -H / --address
    2. 环境变量 CONTAINERD_ADDRESS
    3. 配置文件 address
    4. 默认值 unix:///run/containerd/containerd.sock

2. 容器生命周期管理命令(与 Docker 高度兼容)

操作 命令示例
运行容器 nerdctl run -d --name nginx nginx
交互式运行 nerdctl run -it ubuntu bash
列出容器 nerdctl ps -a
停止/启动 nerdctl stop/start nginx
重启 nerdctl restart nginx
暂停/恢复 nerdctl pause/unpause nginx
删除容器 nerdctl rm nginx
清理未运行容器 nerdctl container prune --force
重命名 nerdctl rename old new
进入执行 nerdctl exec -it nginx bash
复制文件 nerdctl cp /host/path nginx:/container/path
查看日志 nerdctl logs nginx
端口映射 nerdctl port nginx
提交镜像 nerdctl commit nginx mynginx:v1
查看详情 nerdctl inspect nginx

二、网络与存储管理

1. 网络

  • 默认网络bridge(对应主机 nerdctl0 网桥),子网 10.4.0.0/24,网关 10.4.0.1

  • 网络命令

    bash 复制代码
    nerdctl network ls           # 查看网络列表
    nerdctl network inspect bridge  # 查看桥接详情
    nerdctl network create       # 创建自定义网络
    nerdctl network rm / prune   # 删除/清理
  • 容器网络原理 :每容器一对 veth pair,一端在容器内(eth0),另一端挂载到 nerdctl0 网桥。

2. 存储

  • 绑定挂载nerdctl run -v /host/data:/container/data ...
  • 命名卷nerdctl run -v volume_name:/data ...
    • 卷默认存放在 /var/lib/nerdctl/<ID>/volumes/<namespace>/<volume_name>/_data
  • 卷管理命令nerdctl volume create/ls/inspect/rm/prune

3. 命名空间(Containerd 级别)

  • 注意:不同于 Linux 或 Kubernetes 命名空间,是 containerd 自身隔离资源(镜像/容器/卷)的逻辑单元。
  • 常用命令:nerdctl namespace ls/create/remove
  • 关键 :Kubernetes 默认使用 k8s.io 命名空间,因此 nerdctl 需设置 CONTAINERD_NAMESPACE=k8s.io 或通过 -n 指定,否则 kubelet 无法识别镜像。

三、crictl 工具(Kubernetes CRI 调试)

1. 定位

  • 遵循 CRI 接口,用于检查和调试 kubelet 管理的容器与 Pod(不作为日常创建工具)。

  • 配置 endpoint:

    bash 复制代码
    crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
  • 配置文件 /etc/crictl.yaml

2. 常用命令分组

类别 命令
镜像 crictl images, pull, rmi, inspecti
容器 crictl ps, create, start/stop, rm, exec, logs, stats
Pod(沙箱) crictl pods, runp, stopp, rmp, inspectp
其他 crictl version, info, completion

四、Kubernetes 核心概念与架构

1. 应用部署演进

  • 物理机 → 虚拟机 → 容器(轻量、可移植、资源隔离、环境一致)

2. Kubernetes 概述

  • 名称:源于希腊语"舵手",简称 K8s(ubernete → 8 个字母)。
  • 出身:Google Borg/Omega 系统的开源版,2014 年发布,2017 年战胜 Docker Swarm 和 Mesos,成为容器编排事实标准。
  • 定义:自动化容器部署、扩缩、管理的开源平台。

3. 核心特性

  • 自动化上线与回滚、服务发现与负载均衡、存储编排、Secret/配置管理、自动装箱、自我修复、水平扩缩、IPv6 双栈、扩展性强。

4. 架构组件

  • 控制平面(Master)
    • kube-apiserver:集群统一 API 入口
    • kube-scheduler:Pod 调度
    • kube-controller-manager:维护集群状态(副本、故障、滚动更新等)
    • etcd:高可用键值数据库,存储所有集群数据
  • Worker 节点
    • kubelet:节点代理,管理容器生命周期(唯一非容器化组件)
    • kube-proxy:网络代理,实现 Service 负载均衡
    • Container Runtime:如 containerd,负责运行容器
  • 插件(Addons):CoreDNS、Dashboard、监控、日志、网络插件(CNI)等。

五、Kubernetes 集群部署(kubeadm 生产级方案)

1. 安装方式对比与选型

  • 推荐:kubeadm(官方标准,无魔改,适合学习与生产)。
  • 其他:Sealos(快速)、k3s(轻量)、二进制(原理研究)、云托管(免运维)等。

2. 环境准备(模板节点)

  • 硬件:2C4G,NAT 网卡,100G 磁盘。
  • 节点规划
    • master30(10.1.8.30)
    • worker31(10.1.8.31)
    • worker32(10.1.8.32)

3. 系统初始化关键步骤

项目 操作
软件源 配置华为云 Ubuntu 源 + Docker CE 源 + Kubernetes 阿里云源(v1.30)
基础包 vim, lrzsz, bash-completion, open-vm-tools, sshpass
网络 Netplan 配置静态 IP,/etc/hosts 添加主机解析
关闭 swap swapoff -a 并清理 /etc/fstab
时间同步 安装 chrony
SSH 优化 禁用反向解析、跳过主机密钥检查、生成密钥并免密本机
内核模块与参数 加载 overlay、br_netfilter、IPVS 相关模块;设置 bridge-nf-call、ip_forward、swappiness=0

4. 容器运行时(containerd)配置

  • 安装 containerd.io=1.7.20-1cri-tools
  • 生成默认配置,修改:
    • SystemdCgroup = true(适配 systemd)
    • sandbox_image = "registry.k8s.io/pause:3.9"
    • 配置 registry.mirrors(CRI 专用,供 crictl/kubelet 使用)
  • crictl 配置 endpoint。
  • nerdctl 与 CNI 插件安装,并额外配置 certs.d 加速(独立于 CRI 配置)。
  • 重要 :设置 CONTAINERD_NAMESPACE=k8s.io 使 nerdctl 默认操作 k8s 命名空间。

5. 安装 Kubernetes 组件

  • 安装 kubeadm=1.30.2-1.1kubelet=1.30.2-1.1kubectl=1.30.2-1.1
  • 启用 kubelet(此时尚未启动成功,待初始化后运行)
  • 配置各命令行补全(crictl、nerdctl、kubectl、kubeadm)

6. 克隆节点并修改主机名/IP

  • 完全克隆模板,分别设置静态 IP 和主机名。

7. 集群初始化(Master)

  • 预拉取镜像kubeadm config images pull --kubernetes-version=v1.30.2

  • 初始化命令

    bash 复制代码
    kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16
    • --pod-network-cidr 需与后续 CNI 网络插件一致。
  • 初始化成功后会输出加入集群 token 与命令。

8. 配置 kubectl 凭据

  • 复制 /etc/kubernetes/admin.conf~/.kube/config,或设置 KUBECONFIG 环境变量。

9. 部署 CNI 网络(Calico)

  • 下载 calico.yaml,修改 CALICO_IPV4POOL_CIDR10.224.0.0/16
  • 所有节点提前拉取 Calico 镜像(cni、node、kube-controllers)。
  • 应用配置:kubectl apply -f calico.yaml
  • 验证所有 Pod Running,节点状态变为 Ready。

10. Worker 节点加入

  • 在 worker 上执行 master 输出的 kubeadm join 命令。
  • 若 token 过期,可在 master 重新生成:kubeadm token create --print-join-command
  • 加入后需确保 worker 已拉取 kube-proxypause 镜像(可通过预拉取或 join 时自动拉取)。

11. 验证集群

  • kubectl get nodes 全部 Ready
  • kubectl get pods -A 全部 Running
  • kubectl cluster-info 查看控制平面地址

六、关键注意事项速查

要点 说明
命名空间隔离 nerdctl 默认 default,K8s 使用 k8s.io,务必通过环境变量或 -n 指定,否则镜像不可见
镜像加速两份配置 CRI(crictl/kubelet)用 config.tomlmirrors;nerdctl 用 certs.d 独立配置
swap 必须关闭 kubelet 检查强制要求
网络插件 CIDR 一致 kubeadm init--pod-network-cidr 必须与 CNI 的 IP 池一致
kubelet 状态 初始化前为 activating,初始化完成并部署网络后自动变为 active

总结:熟练掌握 nerdctl 的日常管理、crictl 的调试技巧,并基于 kubeadm 完成从系统初始化到集群全流程部署,是云原生运维工程师的核心能力。