一、nerdctl 配置与容器管理
1. 配置文件与连接顺序
-
配置文件路径 :
- rootful(全局):
/etc/nerdctl/nerdctl.toml - rootless(用户):
~/.config/nerdctl/nerdctl.toml
- rootful(全局):
-
关键配置项 :
tomladdress = "unix:///run/containerd/containerd.sock" hosts_dir = ["/etc/containerd/certs.d", "/etc/docker/certs.d"] namespace = "default" -
Socket 查找顺序 (由高到低):
- 命令行参数
-H/--address - 环境变量
CONTAINERD_ADDRESS - 配置文件
address - 默认值
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 -
网络命令 :
bashnerdctl 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:
bashcrictl 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-1和cri-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.1、kubelet=1.30.2-1.1、kubectl=1.30.2-1.1 - 启用 kubelet(此时尚未启动成功,待初始化后运行)
- 配置各命令行补全(crictl、nerdctl、kubectl、kubeadm)
6. 克隆节点并修改主机名/IP
- 完全克隆模板,分别设置静态 IP 和主机名。
7. 集群初始化(Master)
-
预拉取镜像 :
kubeadm config images pull --kubernetes-version=v1.30.2 -
初始化命令 :
bashkubeadm 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_CIDR为10.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-proxy和pause镜像(可通过预拉取或 join 时自动拉取)。
11. 验证集群
kubectl get nodes全部 Readykubectl get pods -A全部 Runningkubectl cluster-info查看控制平面地址
六、关键注意事项速查
| 要点 | 说明 |
|---|---|
| 命名空间隔离 | nerdctl 默认 default,K8s 使用 k8s.io,务必通过环境变量或 -n 指定,否则镜像不可见 |
| 镜像加速两份配置 | CRI(crictl/kubelet)用 config.toml 的 mirrors;nerdctl 用 certs.d 独立配置 |
| swap 必须关闭 | kubelet 检查强制要求 |
| 网络插件 CIDR 一致 | kubeadm init 的 --pod-network-cidr 必须与 CNI 的 IP 池一致 |
| kubelet 状态 | 初始化前为 activating,初始化完成并部署网络后自动变为 active |
总结:熟练掌握 nerdctl 的日常管理、crictl 的调试技巧,并基于 kubeadm 完成从系统初始化到集群全流程部署,是云原生运维工程师的核心能力。