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

相关推荐
Linux-18743 小时前
分布式链路追踪系统之二进制安装skywalking
elasticsearch·云原生·skywalking·分布式链路追踪系统·应用程序性能监控
一叶龙洲4 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
敖行客 Allthinker6 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
BullSmall7 小时前
Anolis OS 8.10 完整安装 Docker CE(生产可用,解决 podman 冲突)
docker·容器·podman
keyipatience7 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
heimeiyingwang8 小时前
【架构实战】可观测性三支柱:日志、指标、链路的融合
elasticsearch·架构·kubernetes
观山岳五楼8 小时前
Ubuntu 24 怎么使用Ubuntu 20 的镜像源
linux·运维·ubuntu
辰痕~9 小时前
物理机装Linux操作系统(Ubuntu为例)
linux·ubuntu
梦梦代码精10 小时前
开源AI应用平台BuildingAI解析:插件化架构、应用市场与热门案例
人工智能·机器学习·docker·开源
阿里云云原生10 小时前
阿里云 AgentTeams 7月第二周产品动态
云原生