1. 容器化集群的镜像管理痛点
在RKE2和K3s这类轻量级Kubernetes发行版中,镜像拉取策略直接影响着集群的部署效率和稳定性。实际运维中常遇到这样的场景:当你在内网环境部署应用时,每次创建Pod都需要从Docker Hub拉取基础镜像,不仅耗时耗带宽,还可能因网络波动导致部署失败。更糟的是,当Docker Hub限流时(2020年11月起对匿名用户实施100次/6小时的拉取限制),整个集群的运维工作可能陷入瘫痪。
我曾管理过一个生产级K3s集群,某次凌晨紧急扩容时,就因基础镜像拉取失败导致业务中断。事后排查发现,30%的节点因并发拉取镜像触发Docker Hub的速率限制。这个教训让我深刻认识到:合理配置集群默认注册表不是可选项,而是生产环境的基础保障。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. RKE2/K3s的镜像仓库配置体系
2.1 架构设计差异解析
虽然RKE2和K3s都源自Rancher的Kubernetes发行版家族,但它们的镜像仓库处理机制存在微妙差异:
-
K3s:采用轻量化设计,通过
--system-default-registry参数直接覆盖所有系统组件的镜像仓库地址。例如设置--system-default-registry=registry.example.com后,kube-apiserver的镜像路径会自动从k8s.gcr.io/kube-apiserver:v1.23.5改写为registry.example.com/kube-apiserver:v1.23.5 -
RKE2:作为CNCF认证的发行版,更强调与标准K8s的兼容性。它通过
system-default-registry和mirrors两个配置段实现更精细的控制。例如在/etc/rancher/rke2/config.yaml中可以这样定义:yaml复制system-default-registry: "registry.example.com" mirrors: "docker.io": endpoint: - "https://mirror.example.com"
2.2 关键配置文件路径
两种发行版的配置文件位置有所不同:
| 发行版 | 主配置文件路径 | 环境文件路径 |
|---|---|---|
| K3s | /etc/rancher/k3s/config.yaml | /etc/systemd/system/k3s.service |
| RKE2 | /etc/rancher/rke2/config.yaml | /etc/systemd/system/rke2-server.service |
提示:修改配置后需要重启服务才能生效,建议在维护窗口期操作
3. 生产级配置实战指南
3.1 配置默认注册表(Air-Gap环境方案)
对于完全离线的内网环境,需要分三步完成配置:
-
镜像预加载(以nginx为例):
bash复制# 从公网拉取镜像 docker pull nginx:1.21 # 重新打标签 docker tag nginx:1.21 registry.internal/nginx:1.21 # 推送到内网仓库 docker push registry.internal/nginx:1.21 -
K3s配置示例:
yaml复制# /etc/rancher/k3s/config.yaml system-default-registry: "registry.internal" private-registry: "/etc/rancher/k3s/registries.yaml" -
RKE2配置示例:
yaml复制# /etc/rancher/rke2/config.yaml system-default-registry: "registry.internal"
3.2 注册表命名空间的高级用法
当企业使用多租户镜像仓库时,命名空间配置能有效隔离不同团队的应用镜像。以下是两种典型场景的实现:
场景一:按项目划分命名空间
yaml复制# registries.yaml 配置片段
mirrors:
"registry.example.com/project-a":
endpoint:
- "https://registry.example.com/v2/project-a"
"registry.example.com/project-b":
endpoint:
- "https://registry.example.com/v2/project-b"
场景二:地域镜像分流
yaml复制mirrors:
"registry.example.com/beijing":
endpoint:
- "https://bj-mirror.example.com"
"registry.example.com/shanghai":
endpoint:
- "https://sh-mirror.example.com"
3.3 TLS证书配置要点
当使用自签名证书的私有仓库时,需要在每个节点配置证书信任:
-
将CA证书放入指定目录:
bash复制# K3s/RKE2通用 sudo mkdir -p /etc/rancher/ssl sudo cp ca.crt /etc/rancher/ssl/ -
修改daemon.json(Docker运行时):
json复制{ "insecure-registries": [], "registry-mirrors": [], "tlscacert": "/etc/rancher/ssl/ca.crt" } -
Containerd配置(RKE2默认运行时):
toml复制# /var/lib/rancher/rke2/agent/etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.example.com".tls] ca_file = "/etc/rancher/ssl/ca.crt"
4. 故障排查与性能优化
4.1 常见错误代码速查表
| 错误码 | 可能原因 | 解决方案 |
|---|---|---|
| ERR_IMAGE_PULL | 镜像不存在或权限不足 | 检查镜像tag和pull secret |
| 401 Unauthorized | 认证信息错误 | 更新registry secret |
| x509: certificate signed by unknown authority | 证书未信任 | 安装CA证书到系统信任库 |
| 408 Request Timeout | 网络连接不稳定 | 配置仓库镜像或重试机制 |
4.2 镜像拉取性能优化
-
P2P镜像分发方案:
yaml复制# 使用Dragonfly进行P2P分发 helm install dragonfly dragonfly/dragonfly \ --set dfdaemon.config.proxies.registry_mirror.url=https://registry.example.com -
节点级缓存配置:
bash复制# 修改containerd配置 sudo cat <<EOF | sudo tee /var/lib/rancher/rke2/agent/etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://registry.example.com"] EOF -
预加载关键镜像:
bash复制# K3s专用命令 k3s crictl pull registry.example.com/nginx:1.21 # RKE2专用命令 rke2 crictl pull registry.example.com/nginx:1.21
5. 安全加固最佳实践
5.1 镜像签名验证
通过cosign实现镜像签名验证:
bash复制# 在CI/CD管道中添加签名步骤
cosign sign --key cosign.key registry.example.com/app:v1.0
# 集群端验证配置
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: cosign-validator
webhooks:
- name: validator.cosign.sigstore.dev
rules:
- operations: ["CREATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
5.2 网络访问控制
使用NetworkPolicy限制镜像仓库访问:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-registry-access
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
component: registry
ports:
- protocol: TCP
port: 443
5.3 审计日志配置
启用镜像拉取审计:
yaml复制# RKE2 审计策略示例
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["pods"]
verbs: ["create"]
6. 混合云场景下的特殊处理
6.1 多集群镜像同步方案
使用Skopeo实现跨云仓库同步:
bash复制skopeo sync --src docker --dest docker \
registry.example.com/prod \
registry.aliyun.com/prod \
--scoped
6.2 地域敏感型配置模板
yaml复制# 通过Kustomize实现地域差异化配置
bases:
- ../../base
patches:
- path: region/aws-eu-central-1.yaml
target:
kind: Deployment
name: image-puller
6.3 灾备恢复流程
-
导出关键镜像列表:
bash复制k3s crictl images -o json | jq -r '.images[].repoTags[]' > backup.txt -
批量迁移镜像:
bash复制while read img; do skopeo copy docker://$img docker://backup-registry/$img done < backup.txt -
恢复时批量导入:
bash复制while read img; do k3s crictl pull backup-registry/$img done < backup.txt
