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安全实践中保护私有镜像访问的重要部分。

相关推荐
MIXLLRED4 分钟前
随笔——Ubuntu固定IP方法
ubuntu·网络ip
m_136878 分钟前
OpenClaw v2026.3.12 离线源码构建与 Docker 部署完整教程
运维·docker·容器·openclaw
wongHome16 分钟前
Ubuntu的Anaconda环境如何安装安装rasterio
linux·ubuntu
圥忈&&丅佽&&扗虖24 分钟前
ubuntu 安装git
linux·git·ubuntu
赴前尘35 分钟前
docker buildx进行多架构镜像仓库迁移
docker·容器·架构
江畔何人初41 分钟前
Gateway API 的核心组件与作用
运维·网络·云原生·kubernetes·gateway
劲墨难解苍生苦1 小时前
docker 和k8s 环境下达梦数据库开启ssl连接配置流程
数据库·docker·kubernetes
Andy Dennis1 小时前
1panel阿里云部署
阿里云·docker·云计算·1panel
无级程序员1 小时前
k8s部署nacos 3.1.1服务,java.net.UnknownHostException问题终极解决方案
java·nacos·kubernetes
从入门到放弃-咖啡豆1 小时前
服务器部署docker 运行.NET 8 项目
服务器·docker·容器