Kubernetes从私有镜像仓库拉取容器镜像时的身份验证

1. 访问私有镜像仓库

当你的Docker镜像存储在私有镜像仓库(如私有Docker Hub、Harbor、ACR、ECR等)时,需要凭据才能拉取镜像。

当Pod被调度到某个节点上时,kubelet会尝试拉取Pod中指定的镜像。如果镜像位于私有仓库,kubelet就会使用private-registry-auth这个Secret中的凭证去拉取。

注意:如果Pod中指定了多个镜像,且来自不同的私有仓库,那么可能需要多个imagePullSecret,每个对应一个仓库。或者,也可以创建一个包含多个仓库凭证的Secret(但一个Secret通常只对应一个仓库)。

另外,除了在Pod级别指定imagePullSecrets,还可以在ServiceAccount级别指定,这样所有使用该ServiceAccount的Pod都会自动使用这些imagePullSecrets,避免了在每个Pod中重复配置。

2. 提供认证凭据

private-registry-auth 是一个提前创建的Secret对象,包含:

  • 用户名和密码

  • 或Docker配置JSON文件

  • 或访问令牌

创建对应的Secret

需要提前创建这个Secret:

bash 复制代码
# 方法1:使用用户名密码创建
kubectl create secret docker-registry private-registry-auth \
  --docker-server=<registry-url> \
  --docker-username=<username> \
  --docker-password=<password> \
  --docker-email=<email>

# 方法2:使用已有的docker config文件
kubectl create secret generic private-registry-auth \
  --from-file=.dockerconfigjson=/path/to/.docker/config.json \
  --type=kubernetes.io/dockerconfigjson

使用场景示例

yaml

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  template:
    spec:
      imagePullSecrets:
      - name: private-registry-auth  # 引用之前创建的Secret
      containers:
      - name: app
        image: private-registry.example.com/mycompany/app:v1.0  # 私有镜像

工作原理

  1. Pod创建时:kubelet从私有仓库拉取镜像

  2. 身份验证 :使用imagePullSecrets中的凭据进行认证

  3. 镜像拉取:认证成功后拉取镜像到节点

最佳实践

yaml

bash 复制代码
# 可以将imagePullSecrets绑定到ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
imagePullSecrets:
- name: private-registry-auth  # 所有使用这个SA的Pod都会自动继承

# 然后在Pod中引用这个ServiceAccount
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  serviceAccountName: default  # 自动获得imagePullSecrets
  containers:
  - name: app
    image: private.registry/app:v1

替代方案比较

方式 优点 缺点
Pod级imagePullSecrets 灵活,不同Pod可用不同凭据 每个Pod都要配置
ServiceAccount级 统一管理,减少重复配置 所有使用该SA的Pod共享凭据
节点级配置 在节点docker daemon配置 不推荐,安全性差

这个配置是现代Kubernetes安全实践中保护私有镜像访问的重要部分。

相关推荐
阿里云云原生12 小时前
Agent 数据飞轮平台的选型和实践
云原生
做运维的阿瑞13 小时前
云项目可观测性与成本治理:告警、日志、Dashboard 与预算标签
大数据·云原生·云计算·terraform
无人生还别怕14 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
知已难寻14 小时前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack
分布式存储与RustFS15 小时前
模型权重散落在每台 GPU?用 RustFS 给 vLLM 做共享权重库
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
杨浦老苏15 小时前
把项目管理搬回自己服务器:Windshift部署与避坑
docker·项目管理·群晖
易点云徐源15 小时前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
木雷坞15 小时前
Baserow Docker部署:导入设备借用CSV,再用表单新增登记
运维·docker·容器
fb_1234516 小时前
从探针到权限:一篇吃透 Kubernetes 健康检查、RBAC 认证授权与 Dashboard 可视化管理
云原生·容器·kubernetes
wefg116 小时前
【Docker】基本指令
运维·docker·容器