私有化交付解决方案,Docker Registry 提高交付速度!!

真成运维 2025-8-14 33 8/14
私有化交付解决方案,Docker Registry 提高交付速度!!
我的免费星球,欢迎加入

你好,我是老成。大家都是怎么私有化交付一个项目的呢?

在 K8s 环境下的私有化项目制作过程中,需要将所有服务镜像进行离线打包处理。同时在部署时需要将离线打包的镜像进行重新导入,为了使所有 K8s 节点上的服务都能拉取到镜像,这时你想到在所有节点都导入打包好的离线镜像。这时,你觉得完美解决问题!

然而,这其实有个问题!问题是,需要在每个节点都存放一份完整的离线镜像包,如果你离线镜像包大小为 10G 20G,那需要将离线镜像包同步到各个 K8s 节点中,上传离线包就非常耗时!何况还要再 load 导入一次镜像呢!

为了解决这样的耗时问题。这里的解决方法是,搭建一个离线私有镜像仓库。所有节点,从离线私有镜像仓库中拉取镜像。这样只需要将离线镜像包,上传一次,导出一次,推送一次。从而提高整体的私有化交付部署的速度!

上传一次:上传离线镜像包到一个宿主机

导出一次:load 离线镜像包

推送一次:push 到离线私有镜像仓库中

我们将通过 Docker Registry 来部署离线镜像仓库,因为它足够轻量。如果用Docker部署,只需要docker run 一下就可以了,同时它占用内存约 50-100 MB,可以说进行用来做私有化镜像仓库部署还是非常合适的。

相关地址

Docker hub Registry 镜像:https://hub.docker.com/_/registry

GitHub:https://github.com/distribution/distribution/

Registry 文档:https://distribution.github.io/distribution/

搭建 Registry 不开启密码认证

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: registry
  name: registry
  namespace: yx-tools
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: svc
      k8s.kuboard.cn/name: registry
  template:
    metadata:
      labels:
        k8s.kuboard.cn/layer: svc
        k8s.kuboard.cn/name: registry
    spec:
      containers:
          image: 'registry:3'
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 5
            initialDelaySeconds: 30
            periodSeconds: 15
            successThreshold: 1
            tcpSocket:
              port: 5000
            timeoutSeconds: 1
          name: registry
          ports:
            - containerPort: 5000
              name: port
              protocol: TCP
          resources:
            limits:
              cpu: '2'
              memory: 4Gi
            requests:
              cpu: 50m
              memory: 512Mi
          startupProbe:
            failureThreshold: 5
            initialDelaySeconds: 30
            periodSeconds: 15
            successThreshold: 1
            tcpSocket:
              port: 5000
            timeoutSeconds: 1
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /etc/localtime
              name: host-time
              readOnly: true
            - mountPath: /var/lib/registry
              name: registry-data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
        - hostPath:
            path: /etc/localtime
            type''
          name: host-time
        - name: registry-data
          persistentVolumeClaim:
            claimName: registry-pvc

---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: registry
  name: registry
  namespace: tools
spec:
  ports:
    - name: rw6qas
      port: 5000
      protocol: TCP
      targetPort: 5000
  selector:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: registry

配置 Registry 密码认证

参考教程:https://www.cnblogs.com/chen2ha/p/14787695.html

生成加密的密码

安装 httpd-tools

httpd-tools是 Apache HTTP Server(简称 httpd)的配套工具集,主要提供管理 Web 服务器和实现 HTTP 认证的核心工具。

yum install -y httpd-tools
mkdir -p /var/lib/registry_auth/

用户名:admin 密码:registry。通过 htpasswd 命令进行加密。

htpasswd是一个用于创建和管理 HTTP 基本认证(Basic Authentication) 密码文件的命令行工具,主要与 Apache Web 服务器配合使用。它通过加密存储用户名和密码,实现对 Web 资源的访问控制。

htpasswd -Bbn admin registry > /var/lib/registry_auth/htpasswd

参数解析:

部分 作用
htpasswd Apache 工具,用于管理 HTTP 基本认证密码文件
-B 强制使用 bcrypt 加密算法(更安全,替代传统 MD5)
-b 允许在命令行中直接指定密码(非交互模式)
-n 将结果输出到标准输出(而非直接写入文件)
admin 用户名
registry 密码(此处密码为明文 registry
> /var/lib/registry_auth/htpasswd 将输出重定向到指定文件

创建 k8s secret

将加密过后的密码,再通过 base64 命令编码一次

$ cat /var/lib/registry_auth/htpasswd
admin:$2y$05$H2rqxWYcdHo/JgCmifNoH.XvJ9.Pk3/Y11MGf85CK8egicGH6YOwa

# base 编码
echo -n "admin:$2y$05$H2rqxWYcdHo/JgCmifNoH.XvJ9.Pk3/Y11MGf85CK8egicGH6YOwa" | base64
YWRtaW46eS1iYXNoNS9KZ0NtaWZOb0guWHZKOS5QazMvWTExTUdmODVDSzhlZ2ljR0g2WU93YQ==

# base 解码(不执行解码)
echo "YWRtaW46eS1iYXNoNS9KZ0NtaWZOb0guWHZKOS5QazMvWTExTUdmODVDSzhlZ2ljR0g2WU93YQ==" | base64 -d

拿到上面 base64 命令的编码,创建一个 k8s secret 资源

apiVersion: v1
data:
  HTPASSWD: YWRtaW46eS1iYXNoNS9KZ0NtaWZOb0guWHZKOS5QazMvWTExTUdmODVDSzhlZ2ljR0g2WU93YQ==
  password: ""
kind: Secret
metadata:
  labels:
    name: registry-password
  name: registry-password
  namespace: tools
type: Opaque

修改 Deployment 配置

Deployment 中添加变量,如图:

私有化交付解决方案,Docker Registry 提高交付速度!!

以及挂载 /auth 目录,如图:

私有化交付解决方案,Docker Registry 提高交付速度!!

完整 Deployment 配置如下。配置后我们 Registry 的认证就配置 OK 了,可以实现登录了。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: registry
  name: registry
  namespace: yx-tools
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: svc
      k8s.kuboard.cn/name: registry
  template:
    metadata:
      labels:
        k8s.kuboard.cn/layer: svc
        k8s.kuboard.cn/name: registry
    spec:
      containers:
        - env:
            - name: REGISTRY_AUTH
              value: htpasswd
            - name: REGISTRY_AUTH_HTPASSWD_REALM
              value: Registry Realm
            - name: REGISTRY_AUTH_HTPASSWD_PATH
              value: /auth/htpasswd
          image: 'registry:3'
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 5
            initialDelaySeconds: 30
            periodSeconds: 15
            successThreshold: 1
            tcpSocket:
              port: 5000
            timeoutSeconds: 1
          name: registry
          ports:
            - containerPort: 5000
              name: port
              protocol: TCP
          resources:
            limits:
              cpu: '2'
              memory: 4Gi
            requests:
              cpu: 50m
              memory: 512Mi
          startupProbe:
            failureThreshold: 5
            initialDelaySeconds: 30
            periodSeconds: 15
            successThreshold: 1
            tcpSocket:
              port: 5000
            timeoutSeconds: 1
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /etc/localtime
              name: host-time
              readOnly: true
            - mountPath: /var/lib/registry
              name: registry-data
            - mountPath: /auth
              name: htpasswd
              readOnly: true
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
        - hostPath:
            path: /etc/localtime
            type''
          name: host-time
        - name: registry-data
          persistentVolumeClaim:
            claimName: registry-pvc
        - name: htpasswd
          secret:
            defaultMode: 420
            items:
              - key: HTPASSWD
                path: htpasswd
            secretName: registry-password

---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: registry
  name: registry
  namespace: tools
spec:
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: rw6qas
      port: 5000
      protocol: TCP
      targetPort: 5000
  selector:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: registry
  sessionAffinity: None

在登录之前,给我们 registry 服务创建一个 ingress。

注意:registry.private.com 这个域名可以只通过宿主机的 /etc/hosts 配置 IP 映射即可。

# 所有K8s节点都添加,该域名的IP映射
$ cat /etc/hosts
192.168.1.100 registry.private.com
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: registry.private.com
  namespace: tools
spec:
  ingressClassName: nginx
  rules:
    - host: registry.private.com
      http:
        paths:
          - backend:
              service:
                name: registry
                port:
                  number: 5000
            path: /
            pathType: Prefix

浏览器访问登录 registry,http://registry.private.com/v2/_catalog

如果没有 DNS,需要在 windows 的宿主机加上 hosts 映射,ip 映射写 ingress-controller 所在 K8s运行节点 ip

私有化交付解决方案,Docker Registry 提高交付速度!!

登录完成

私有化交付解决方案,Docker Registry 提高交付速度!!

K8s 使用 Registry

添加一个域名进行 IP 映射解析,域名自定义。

注意:在所有 K8s 节点添加 hosts,这样所有 K8s 节点都等访问该私有镜像仓库地址。

$ cat /etc/hosts
192.168.1.100 registry.private.com

配置 containerd 注册表

配置 containerd 注册表,添加 registry.private.com 域名

配置 containerd 注册表详解:https://www.qiuyl.com/cloudnative/318

cat /etc/containerd/certs.d/registry.private.com/hosts.toml
server = "http://registry.private.com"

[host."http://registry.private.com"]
  capabilities = ["pull""resolve""push"]
  skip_verify = true

nerdctl 命令验证 Registry

登录离线私有化镜像仓库

由于使用的 containerd 运行时,这里实现 nerdctl 命令管理容器与镜像,该可自行安装。

nerdctl login -u admin -p registry registry.private.com
私有化交付解决方案,Docker Registry 提高交付速度!!

推送镜像

私有化交付解决方案,Docker Registry 提高交付速度!!

拉取镜像

私有化交付解决方案,Docker Registry 提高交付速度!!

以上,就是 registry 的安装配置过程了。如果用于私有化项目交付的镜像仓库,剩下的就是通过脚本处理镜像上传到该 registry 镜像仓库了。

END

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

- THE END -

真成运维

8月14日22:30

最后修改:2025年8月14日
0

非特殊说明,本博所有文章均为博主原创。