温馨提示×

Linux环境下K8S如何进行容器镜像管理

小樊
46
2026-01-01 01:58:54
栏目: 智能运维

Linux环境下K8S容器镜像管理

一 基础流程与常用命令

  • 构建与推送
    • 构建镜像:docker build -t <registry>/<ns>/<repo>:<tag> .
    • 登录仓库:docker login <registry>
    • 打标签:docker tag <repo>:<tag> <registry>/<ns>/<repo>:<tag>
    • 推送镜像:docker push <registry>/<ns>/<repo>:<tag>
  • 在集群中使用
    • 创建资源:kubectl apply -f deploy.yaml
    • 查看状态:kubectl get pods, kubectl describe pod <name>
    • 查看事件:kubectl get events --sort-by=.metadata.creationTimestamp
  • 说明
    • 镜像的构建与推送通常在开发机或CI环境完成;Kubernetes仅负责拉取与运行镜像。

二 节点侧镜像查看与导入导出 containerd

  • 查看节点镜像(CRI 工具)
    • 配置 crictl 端点(常见 CRI 为 containerd):
      • crictl config runtime-endpoint unix:///run/containerd/containerd.sock
      • crictl config image-endpoint unix:///run/containerd/containerd.sock
    • 列出镜像:crictl images
  • 导入导出镜像(containerd 命名空间)
    • 导入:ctr -n k8s.io image import <image>.tar.gz
    • 导出:ctr -n k8s.io image export <image>.tar.gz <registry>/<ns>/<repo>:<tag>
    • 注意:Kubernetes 使用 containerd 的 k8s.io 命名空间,未指定命名空间将无法被 crictl 看到。
  • 权限与兼容性
    • 若报权限错误,使用 sudo 或配置合适的容器运行时 socket 权限。
    • v1.22+ 起,Kubernetes 默认不再内置 dockershim,推荐使用 containerd/CRI-O 并通过 crictl 与 CRI 交互。

三 镜像拉取策略与最佳实践

  • 三种策略
    • Always:每次都从仓库拉取;适合需要强一致最新镜像的 CI/CD 场景。
    • IfNotPresent:本地有则直接用,否则拉取;生产常用,配合固定版本标签。
    • Never:仅用本地镜像;适用于离线/内网且节点已预装镜像的场景。
  • 默认规则
    • 未显式设置时:非 :latest 标签默认 IfNotPresent;** :latest** 默认 Always
  • 生产建议
    • 禁用 :latest,使用不可变标签(如 v1.2.3git-commit)。
    • 结合节点预热(如 DaemonSet 拉取基础镜像、或工具 kube-fledged)降低首启时延。
    • 对私有仓库统一配置 imagePullSecrets,避免散落在多个 Pod 中。

四 私有仓库认证与多命名空间分发

  • 创建镜像拉取密钥
    • 直接基于本地 Docker 配置创建:
      • kubectl create secret generic regcred --from-file=.dockerconfigjson=$HOME/.docker/config.json
    • 命令行创建(指定服务器、用户名、密码):
      • kubectl create secret docker-registry <secret-name> --docker-server=<registry> --docker-username=<user> --docker-password=<pwd>
  • 在 Pod 中使用
    • 在 Pod/Deployment 中引用:
      • spec.imagePullSecrets: [{ name: <secret-name> }]
  • 在多命名空间复用
    • 将 Secret 拷贝到目标命名空间:
      • kubectl get secret <secret-name> --namespace=default --export -o yaml | kubectl apply --namespace=<ns> -f -
    • 或在 ServiceAccount 上挂载 imagePullSecrets,使该命名空间下 Pod 自动继承。

五 常见问题快速排查

  • 状态与事件定位
    • kubectl describe pod <name> 查看 Events,关注 Failed to pull imageImagePullBackOffCrashLoopBackOff 等关键信息。
  • 常见根因
    • 认证失败(未配置或错误的 imagePullSecrets)。
    • 镜像或标签不存在(如 manifest unknown)。
    • 网络不通(仓库域名/端口被防火墙或安全组阻断)。
    • 节点磁盘空间不足(清理镜像缓存或扩容)。
    • 仓库证书过期(更新节点 CA 证书或修复仓库证书)。
    • 镜像过大导致超时(调整 kubelet 的 –image-pull-progress-deadline–runtime-request-timeout)。
  • 节点侧进一步诊断
    • 使用 crictl images 检查镜像是否已落盘;必要时用 ctr -n k8s.io image import 导入离线镜像包。

0