16.2.3 容器运行时与镜像仓库配置

本节聚焦Kubernetes容器运行时与镜像仓库的基础运维配置,覆盖运行时选型、安装与参数优化、镜像加速、私有仓库部署与认证、镜像安全治理与常见故障排查,并提供完整命令、配置示例与练习。

1. 容器运行时选择与架构认知#

  • 运行时类型:containerd、CRI-O、Docker(通过cri-dockerd)
  • 推荐方案:生产环境优先选用containerd或CRI-O,Docker需配合cri-dockerd
  • 关键组件:kubelet → CRI → runtime → runc → OCI镜像/容器
文章图片

命令解释示例(查看当前kubelet使用的CRI Socket):

# 查看kubelet启动参数中的CRI Socket
ps -ef | grep kubelet | grep -- '--container-runtime-endpoint'

2. containerd安装与基础配置#

2.1 安装与服务管理#

示例:基于CentOS/RHEL系安装

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker仓库(含containerd.io)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装containerd
yum install -y containerd.io

# 启动并设置开机自启
systemctl enable --now containerd
systemctl status containerd --no-pager

预期效果Active: active (running)

2.2 生成与调整配置#

# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 修改关键配置项
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

关键字段解释(示例配置片段):

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

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

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://mirror.example.com"]

生效配置

systemctl restart containerd

2.3 与kubelet对接#

kubeadm初始化指定CRI socket

kubeadm init \
  --cri-socket unix:///run/containerd/containerd.sock \
  --pod-network-cidr=10.244.0.0/16

确认kubelet cgroup驱动一致

# kubelet配置文件
grep -n "cgroupDriver" /var/lib/kubelet/config.yaml
# 期望输出: cgroupDriver: systemd

3. 镜像加速与公共仓库配置#

3.1 镜像加速器#

containerd配置镜像加速

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://mirror.example.com"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
    endpoint = ["https://k8s-mirror.example.com"]

验证镜像拉取

# 使用crictl测试拉取
crictl pull docker.io/library/nginx:1.25
crictl images | grep nginx

3.2 registry mirrors示例#

完整配置示例与解释

[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = "/etc/containerd/certs.d"

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://mirror.example.com"]

预期效果:镜像拉取速度显著提升,crictl pull耗时下降。

4. 私有镜像仓库搭建与接入#

4.1 仓库选型#

  • Docker Registry(轻量、适合小规模)
  • Harbor(企业级,含权限、审计、镜像扫描)

4.2 Harbor基础部署要点#

示例:Harbor离线包快速部署

# 解压安装包
tar xf harbor-offline-installer-v2.10.0.tgz
cd harbor

# 修改harbor.yml关键项
cat > harbor.yml <<'EOF'
hostname: harbor.example.com
https:
  port: 443
  certificate: /data/cert/harbor.crt
  private_key: /data/cert/harbor.key
harbor_admin_password: Harbor12345
database:
  password: Root12345
EOF

# 执行安装
./install.sh

预期效果https://harbor.example.com可访问,登录后创建项目。

4.3 客户端认证#

Docker客户端登录Harbor

docker login harbor.example.com -u admin -p Harbor12345

containerd使用认证文件:见第5节配置。

5. containerd访问私有仓库配置#

5.1 TLS与证书#

自签名证书信任配置

# 创建证书目录
mkdir -p /etc/containerd/certs.d/harbor.example.com

# 放置CA证书
cp /data/cert/ca.crt /etc/containerd/certs.d/harbor.example.com/ca.crt

5.2 registry配置示例#

配置私有仓库认证与TLS

# 文件路径:/etc/containerd/certs.d/harbor.example.com/hosts.toml
server = "https://harbor.example.com"

[host."https://harbor.example.com"]
  capabilities = ["pull", "resolve", "push"]
  ca = "/etc/containerd/certs.d/harbor.example.com/ca.crt"

  [host."https://harbor.example.com".header]
    Authorization = "Basic BASE64(user:pass)"

重启并验证

systemctl restart containerd
crictl pull harbor.example.com/library/busybox:1.36

排错提示:若提示x509: certificate signed by unknown authority,检查CA路径与权限。

6. 镜像命名与拉取策略#

  • 统一命名规范:registry/project/image:tag
  • 默认imagePullPolicy策略:
  • IfNotPresent(生产常用)
  • Always(CI/CD环境)

示例:Deployment中指定策略

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: harbor.example.com/prod/nginx:1.25.3
        imagePullPolicy: IfNotPresent

7. 镜像安全与合规#

  • 启用镜像扫描(Harbor内置或第三方扫描器)
  • 采用最小权限与分项目隔离
  • 禁止生产使用latest标签
  • 可选镜像签名(cosign)

示例:Harbor保留策略

保留最近10个标签,自动清理超过30天未使用镜像

8. 日常运维与故障排查要点#

运行时状态

systemctl status containerd --no-pager
journalctl -u containerd --since "10 minutes ago"

镜像拉取异常排查

# DNS与网络
nslookup harbor.example.com
curl -vk https://harbor.example.com/v2/

# 认证
crictl pull harbor.example.com/prod/nginx:1.25.3

清理无用镜像与容器

# 列出所有镜像与容器
crictl images
crictl ps -a

# 删除未使用镜像
crictl rmi --prune

常见报错与定位
- context deadline exceeded:网络不通/镜像仓库不可达
- unauthorized:认证失败,检查hosts.toml与账号权限
- x509:证书不被信任,检查CA证书路径

9. 运维建议与最佳实践#

  • 统一运行时版本与配置模板(Ansible或脚本分发)
  • 镜像仓库分环境隔离(dev/test/prod)
  • 核心镜像准备离线包(断网可用)
  • 定期审计权限与漏洞
  • 对接CI/CD自动推送与标签管理

练习与实操#

  1. 安装练习:在新节点安装containerd并完成SystemdCgroup=true配置,重启后验证。
  2. 镜像加速练习:配置docker.io镜像加速并对比拉取时间。
  3. 私有仓库练习:部署Harbor并上传一个busybox镜像,使用crictl pull拉取验证。
  4. 排错练习:将证书路径写错,观察错误并修复。