如何在 Kubernetes (k8s) 中设置私有 Docker Registry

[ad_1]

始终建议在您的 Kubernetes 集群中拥有私有 docker 注册表或存储库。 Docker 私有注册表允许开发人员推送和拉取他们的私有容器镜像。 一旦应用程序的容器被推送到私有注册表,开发人员就可以在创建和部署他们的 yaml 文件时使用他们私有注册表的路径。

在本文中,我们将学习如何将私有 docker 注册表部署为 Kubernetes 集群之上的部署。 我假设 Kubernetes 集群已经启动并运行。

用于设置私有 Docker 注册表的 Kubernetes 实验室详细信息

  • k8s-master – 192.168.1.40 – CentOS 7
  • k8s-worker-1 – 192.168.1.41 – CentOS 7
  • k8s-worker-2 – 192.168.1.42 – CentOS 7
  • kadmin 用户 sudo 权利
  • NFS 共享“/opt/certs”和“/opt/registry”

笔记: 就我而言,我在主节点上设置了 nfs 服务器并导出 /选择/证书/选择/注册表 作为 nfs 共享。

在开始部署私有注册表之前,请确保这些 nfs 共享已安装在每个工作节点上。 在每个工作节点上运行以下命令。

$ sudo mkdir /opt/certs /opt/registry
$ sudo mount 192.168.1.40:/opt/certs /opt/certs
$ sudo mount 192.168.1.40:/opt/registry /opt/registry

对于永久安装,添加 nfs 条目 /etc/fstab 文件。

代替挂载这些 nfs 共享,我们还可以创建 基于 nfs 的持久卷 稍后我们可以在 yaml 文件中使用这些持久卷。

让我们深入了解 Kubernetes 中私有 docker 注册表的安装和配置步骤。

步骤 1) 为私有注册表生成自签名证书

登录您的控制平面或主节点并使用 openssl 命令为私有 docker 存储库生成自签名证书。

$ cd /opt 
$ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout 
 ./certs/registry.key -x509 -days 365 -out ./certs/registry.crt

生成密钥和证书文件后,使用 ls 命令 验证它们,

[[email protected] opt]$ ls -l certs/
total 8
-rw-r--r--. 1 root root 2114 Sep 26 03:26 registry.crt
-rw-r--r--. 1 root root 3272 Sep 26 03:26 registry.key
[[email protected] opt]$

第 2 步)通过 yaml 文件部署私有注册表作为部署

在您的主节点上,创建一个 私有注册表.yaml 包含以下内容的文件

[[email protected] ~]$ mkdir docker-repo
[[email protected] ~]$ cd docker-repo/
[[email protected] docker-repo]$ vi private-registry.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: private-repository-k8s
  labels:
    app: private-repository-k8s
spec:
  replicas: 1
  selector:
    matchLabels:
      app: private-repository-k8s
  template:
    metadata:
      labels:
        app: private-repository-k8s
    spec:
      volumes:
      - name: certs-vol
        hostPath:
          path: /opt/certs
          type: Directory
      - name: registry-vol
        hostPath:
          path: /opt/registry
          type: Directory

      containers:
        - image: registry:2
          name: private-repository-k8s
          imagePullPolicy: IfNotPresent
          env:
          - name: REGISTRY_HTTP_TLS_CERTIFICATE
            value: "/certs/registry.crt"
          - name: REGISTRY_HTTP_TLS_KEY
            value: "/certs/registry.key"
          ports:
            - containerPort: 5000
          volumeMounts:
          - name: certs-vol
            mountPath: /certs
          - name: registry-vol
            mountPath: /var/lib/registry

保存并 close yaml 文件

运行以下 kubectl 命令,使用上面创建的 yaml 文件部署私有注册表,

[[email protected] docker-repo]$ kubectl create -f private-registry.yaml
deployment.apps/private-repository-k8s created
[[email protected] docker-repo]$

执行以下 kubectl 命令以验证注册表部署及其 pod 的状态。

[[email protected] ~]$ kubectl get deployments private-repository-k8s
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
private-repository-k8s   1/1     1            1           3m32s
[[email protected] ~]$
[[email protected] ~]$ kubectl get pods | grep -i private-repo
private-repository-k8s-85cf76b9d7-qsjxq   1/1     Running   0          5m14s
[[email protected] ~]$

完美,上面的输出确认registry已经部署成功,现在将registry证书文件复制到worker节点和master节点下的文件夹“/etc/pki/ca-trust/source/anchors“。 在master节点和每个worker节点上执行以下命令

$ sudo cp /opt/certs/registry.crt /etc/pki/ca-trust/source/anchors/
$ sudo update-ca-trust
$ sudo systemctl restart docker

步骤 3) 将注册中心部署公开为 nodeport 服务类型

要将注册中心部署公开为 nodeport 服务类型,请使用以下内容创建以下 yaml 文件,

[[email protected] ~]$ cd docker-repo/
[[email protected] docker-repo]$ vi private-registry-svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: private-repository-k8s
  name: private-repository-k8s
spec:
  ports:
  - port: 5000
    nodePort: 31320
    protocol: TCP
    targetPort: 5000
  selector:
    app: private-repository-k8s
  type: NodePort

保存并 close 文件。

现在通过运行以下 kubectl 命令来部署服务,

$ kubectl create -f private-registry-svc.yaml
service/private-repository-k8s created
$

在 kubectl 命令下运行以验证服务状态,

[[email protected] ~]$ kubectl get svc private-repository-k8s
NAME                   TYPE     CLUSTER-IP    EXTERNAL-IP PORT(S)        AGE
private-repository-k8s NodePort 10.100.113.39 <none>      5000:31320/TCP 2m1s
[[email protected] ~]$

第 4 步)在 k8s 中测试和使用私有 docker 注册表

为了测试私有注册表,我们将在本地下载 nginx 映像,然后将该映像上传到私有注册表,从主节点运行以下命令集,

$ sudo docker pull nginx
$ sudo docker tag nginx:latest k8s-master:31320/nginx:1.17
$ sudo docker push k8s-master:31320/nginx:1.17

上述命令的输出如下:

在 docker 命令下运行以验证 nginx 是否已上传到私有存储库。

[[email protected] ~]$ sudo docker image ls | grep -i nginx
nginx                     latest   7e4d58f0e5f3        2 weeks ago      133MB
k8s-master:31320/nginx    1.17     7e4d58f0e5f3        2 weeks ago      133MB
[[email protected] ~]$

现在,让我们部署一个基于 nginx 的部署,并在 yaml 文件中将图像的路径指定为我们的私有 docker 注册表。 示例如下所示:

[[email protected] ~]$ vi nginx-test-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-1-17
        image: k8s-master:31320/nginx:1.17
        ports:
        - containerPort: 80

Save 并关闭文件

运行以下 kubectl 命令,

[[email protected] ~]$ kubectl create -f nginx-test-deployment.yaml
deployment.apps/nginx-test-deployment created
[[email protected] ~]$ kubectl get deployments  nginx-test-deployment
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
nginx-test-deployment   3/3     3            3           13s
[[email protected] ~]$
[[email protected] ~]$ kubectl get  pods | grep nginx-test-deployment
nginx-test-deployment-f488694b5-2rvmv     1/1     Running   0      80s
nginx-test-deployment-f488694b5-8kb6c     1/1     Running   0      80s
nginx-test-deployment-f488694b5-dgcxl     1/1     Running   0      80s
[[email protected] ~]$

尝试使用 ‘ 来描述任何 podkubectl 描述‘ 命令并验证图像路径

$ kubectl describe pod nginx-test-deployment-f488694b5-2rvmv

上述命令的输出将是,

上面的输出确认容器的镜像路径是我们的私有 docker 注册表,所以这意味着已经从私有注册表下载了 nginx 镜像。 这就是本文的全部内容,我希望这些步骤可以帮助您在 Kubernetes 集群上设置私有 docker 注册表。 请在下面的评论部分分享您的反馈和评论。

还阅读如何在 Google 上设置 Kubernetes 集群 Cloud 平台 (GCP)

还阅读如何在 Kubernetes 中设置 NGINX 入口控制器

[ad_2]

Related Posts