k8s集群中运行docker registry镜像仓库实践

 更新时间:2025年12月19日 09:31:03   作者:月巴左耳东  
本文介绍了如何使用Dockerfile构建一个支持认证登录的Docker Registry,并通过静态Pod方式部署在Kubernetes集群中,重点包括配置认证、增加镜像删除功能、设置持久化路径及验证登录和推送镜像的过程
  • docker registry 相对于 harbor 来说,安全性会更低有点,不过对于一些内网场景(不需要和公网有互通)来说,其实 docker registry 更轻量化一些
  • 本文仅作学习参考,至于实际的选择,还是以各自实际需求和场景为准

编写 Dockerfile

  • 为了让 docker registry 支持认证登录,需要安装 htpasswd 命令
  • 为了方便后期维护 docker registry,增加镜像删除的功能
  • config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  # 增加这里的 delete 和 enabled 
  ## 启用 registry 镜像删除的功能
  delete:
    enabled: true
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
  • Dockerfile
FROM registry:2
RUN rm -f /etc/docker/registry/config.yml && \
    apk add apache2-utils && \
    apk cache clean
ADD ./config.yml /etc/docker/registry/
  • 构建镜像(需要构建成什么样的镜像名字,可以自己定义)
docker build -t registry:2_auth .

编写 k8s yaml 文件

  • 以静态 pod 的方式来部署,这里就直接使用 kind: Pod ,而不是其他的控制集
  • 不同 k8s 版本,apiVersion 版本可能会不一样,可以使用 kubectl explain pod.apiVersion 命令查看 pod 这个 kindapiVersion
---
apiVersion: v1
kind: Pod
metadata:
  # pod 名称前缀
  name: docker-registry
  # 指定 namespace
  namespace: kube-system
spec:
  # 使用主机网络模式
  hostNetwork: true
  tolerations:
  - key: node-role.kubernetes.io/master
    effect: NoSchedule
  - key: "CriticalAddonsOnly"
    operator: "Exists"
  - key: "node.alpha.kubernetes.io/notReady"
    operator: "Exists"
  initContainers:
  # 这里注意修改成自己 build 的镜像名称
  - image: registry:2_auth
    # docker 容器的名字
    name: docker-registry-init
    imagePullPolicy: IfNotPresent
    # 配置用户名和密码
    command:
    - sh
    - "-c"
    - "htpasswd -Bbn admin adminpasswd > /auth/htpasswd"
    volumeMounts:
    - mountPath: /auth
      name: docker-registry-auth
  containers:
  # 这里注意修改成自己 build 的镜像名称
  - image: registry:2_auth
    # docker 容器的名字
    name: registry
    imagePullPolicy: IfNotPresent
    # 资源限制以自己的实际需求为准
    resources:
      limits:
        cpu: 3000m
        memory: 3000Mi
    env:
    # registry 访问的端口,静态 pod 会暴露出来对应的端口
    - name: REGISTRY_HTTP_ADDR
      value: ":35000"
    # registry 存储路径
    - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
      value: /var/lib/registry
    # 以 htpasswd 的方式认证
    - name: REGISTRY_AUTH
      value: htpasswd
    # 注册认证
    - name: REGISTRY_AUTH_HTPASSWD_REALM
      value: Registry
    # 认证文件路径
    - name: REGISTRY_AUTH_HTPASSWD_PATH
      value: /auth/htpasswd
    volumeMounts:
    - mountPath: /var/lib/registry
      name: docker-registry-storage
    - mountPath: /auth
      name: docker-registry-auth
  volumes:
  # 将 registry 存储路径持久化到本地,path 指定的路径可以自己修改
  - name: docker-registry-storage
    hostPath:
      path: /data/k8s-data/registry-data
      type: Directory
  # 认证文件的持久化访问为 emptyDir,每次重启都会重新生成
  - name: docker-registry-auth
    emptyDir: {}

kubelet 配置静态 pod 路径

  • kubeadm 部署的,默认就配置了静态 pod 的存放路径,可以不进行下面的操作
  • 二进制部署的,一般没有配置静态 pod 的存放路径,需要 kubelet 增加 --pod-manifest-path 指定路径(提前创建好路径),然后重启 kubelet
--pod-manifest-path=/etc/kubernetes/manifests

启动静态 pod

创建持久化路径,这里的路径要和 yaml 文件里面的 volumes 下面的 docker-registry-storage 指定的 path 一致

mkdir -p /data/k8s-data/registry-data

将 yaml 文件放到上面 kubelet 配置的静态 pod 路径下,然后等 pod 启动(如果想快点,可以直接重启 kubelet 组件)

查看 pod 是否创建成功

kubectl get pod -n kube-system | grep registry

静态 pod 会以 yaml 文件里面的 name 加上当前节点 ip 作为 pod 的名称

docker-registry-172.72.0.95   1/1     Running   0          33s

docker 配置增加 registry 地址

vim /etc/docker/daemon.json

注意 json 语法格式

如果重启 docker 失败,日志有如下输出,表示 daemon.json 文件的格式有错误,注意最后是否需要加上逗号

unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '"' after object key:value pair

# 增加下面的信息
"insecure-registries": ["ip:端口"]

拿我的举个例子

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "insecure-registries": ["172.72.0.95:35000"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "data-root": "/approot/data/crt-data",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "200m",
    "max-file": "5"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

重启 docker 服务

systemctl restart docker

验证 docker registry 仓库

登录 docker registry 仓库,这里的用户名,密码以及登录的 ip 和端口都需要以自己的为准

docker login -u admin -p adminpasswd 172.72.0.95:35000

登录成功后,就会返回对应的 success 了

WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

修改镜像 tag,然后尝试上传镜像

docker tag registry:2_auth 172.72.0.95:35000/registry:2_auth

推送镜像到 docker registry

docker push 172.72.0.95:35000/registry:2_auth

返回类似如下的信息,说明推送成功了,可以去其他节点使用 docker login 登录(也需要 docker 配置文件加上 docker registry 的地址),然后直接 docker pull <仓库地址>:<仓库端口>/registry:2_auth

The push refers to repository [172.72.0.95:35000/registry]
f586723f1e87: Pushed
b14c705d6378: Pushed
6e5160500bc7: Pushed
744dbed40ffa: Pushed
f8dc4f9c98a6: Pushed
4984fbd72df1: Pushed
bb01bd7e32b5: Pushed
2_auth: digest: sha256:3b215dad8c5b7704b0b84a3ee46971314b8db9e65fb82a62204cf8497587377a size: 1781

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k8s按需创建PV和使用PVC详解

    k8s按需创建PV和使用PVC详解

    Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收策略和绑定模式
    2025-09-09
  • 使用k8tz解决pod内的时区问题(坑的解决)

    使用k8tz解决pod内的时区问题(坑的解决)

    时区的不一致,会带来很多困扰。即使代码与时区无关,但容器日志与系统日志时间相关联排查问题也会让人头疼,这篇文章主要介绍了使用k8tz优雅的解决pod内的时区问题,需要的朋友可以参考下
    2022-10-10
  • Rainbond上部署API Gateway Kong及环境配置教程

    Rainbond上部署API Gateway Kong及环境配置教程

    这篇文章主要为大家介绍了Rainbond上部署API Gateway Kong及环境配置教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • K8S中设置JVM堆栈大小实现方式

    K8S中设置JVM堆栈大小实现方式

    这篇文章主要介绍了K8S中设置JVM堆栈大小实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • Nacos-K8s部署全过程

    Nacos-K8s部署全过程

    Nacos-K8s项目提供了多种在Kubernetes环境中部署Nacos的方案,包括快速启动、NFS持久化、Ceph持久化、Helm和Operator部署,每种方式都有其适用的场景和特点,如快速启动适用于测试,NFS和Ceph持久化支持数据持久化,Helm和Operator提供更高级的运维功能
    2026-02-02
  • Kubernetes(K8S)彻底卸载详细教程

    Kubernetes(K8S)彻底卸载详细教程

    网络上有很多的K8S安装安装教程,但是唯独很少有卸载教程,有也讲得不清不楚,下面这篇文章主要给大家介绍了关于Kubernetes(K8S)彻底卸载的相关资料,需要的朋友可以参考下
    2024-01-01
  • Rainbond配置组件自动构建部署官方文档讲解

    Rainbond配置组件自动构建部署官方文档讲解

    这篇文章主要为大家介绍了Rainbond配置组件自动构建部署官方文档讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • k8s高可用集群安装教程

    k8s高可用集群安装教程

    本文给大家介绍k8s高可用集群安装教程,本文通过图文示例相结合给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-03-03
  • k8s如何使用NFS作为StorageClass提供动态存储

    k8s如何使用NFS作为StorageClass提供动态存储

    本文主要介绍了k8s中的StorageClass,包括其定义、引入的原因、实现方式、定义方法以及回收策略对数据的影响等,首先,StorageClass是在K8s集群中创建用于动态PV的管理,可以链接至不同的后端存储,对存储的请求可以指向StorageClass
    2024-09-09
  • Kubernetes集群中Calico网络插件报错问题分析及解决过程

    Kubernetes集群中Calico网络插件报错问题分析及解决过程

    Kubernetes集群中Calico网络插件报错(如FailedCreatePodSandBox)通常由配置错误、RBAC权限缺失或组件故障导致,解决方法包括重启Calico组件、验证配置和权限,定期监控与维护以确保网络正常运行
    2025-10-10

最新评论