如何在Kubernetes(k8s)中设置Docker的私有仓库


原文地址:如何在Kubernetes(k8s)中设置Docker的私有仓库

Docker私有仓库允许开发人员推送和提取其私有容器映像。在本文中,我们将学习如何将私有Docker仓库部署在Kubernetes集群之上。

始终建议您在Kubernetes集群中拥有私有Docker仓库或存储库。Docker私有仓库允许开发人员推送和提取其私有容器映像。将应用程序的容器推送到专用仓库后,开发人员可以在创建和部署yaml文件时使用其专用仓库的路径。

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

Kubernetes实验室详细信息,用于设置私有Docker仓库

  • 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
  • 具有sudo权限的kadmin用户
  • NFS共享“ / opt / certs”和“ / opt / registry”

注意: 在我的情况下,我在主节点上设置了nfs服务器,并将/opt/certs/opt/registry导出为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

要进行永久挂载,请在/etc/fstab文件中添加nfs条目。

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

让我们深入研究Kubernetes中私有Docker仓库的安装和配置步骤。

步骤1)为私人仓库生成自签名证书

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

[kadmin@k8s-master ~]$ cd /opt
[kadmin@k8s-master opt]$ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout ./certs/registry.key -x509 -days 365 -out ./certs/registry.crt

如何在Kubernetes(k8s)中设置Docker的私有仓库

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

[kadmin@k8s-master 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
[kadmin@k8s-master opt]$

步骤2)将私有仓库部署为通过yaml文件进行部署

在主节点上,创建具有以下内容的private-registry.yaml文件

[kadmin@k8s-master ~]$ mkdir docker-repo
[kadmin@k8s-master ~]$ cd docker-repo/
[kadmin@k8s-master 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

保存并关闭yaml文件

如何在Kubernetes(k8s)中设置Docker的私有仓库

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

[kadmin@k8s-master docker-repo]$ kubectl create -f private-registry.yaml
deployment.apps/private-repository-k8s created
[kadmin@k8s-master docker-repo]$

执行以下kubectl命令以验证仓库部署及其pod的状态。

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

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

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

步骤3)将仓库部署公开为节点端口服务类型

要将仓库部署公开为节点端口服务类型,请使用以下内容创建以下yaml文件,

[kadmin@k8s-master ~]$ cd docker-repo/
[kadmin@k8s-master 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

保存并关闭文件。

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

[kadmin@k8s-master docker-repo]$ kubectl create -f private-registry-svc.yaml
service/private-repository-k8s created
[kadmin@k8s-master docker-repo]$

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

[kadmin@k8s-master ~]$ 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
[kadmin@k8s-master ~]$

步骤4)在K8s中测试和使用私有Docker仓库

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

[kadmin@k8s-master ~]$ sudo docker pull nginx
[kadmin@k8s-master ~]$ sudo docker tag nginx:latest k8s-master:31320/nginx:1.17
[kadmin@k8s-master ~]$ sudo docker push k8s-master:31320/nginx:1.17

上面命令的输出如下:

如何在Kubernetes(k8s)中设置Docker的私有仓库

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

[kadmin@k8s-master ~]$ 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
[kadmin@k8s-master ~]$

现在,让我们部署一个基于nginx的部署,并在yaml文件中将映像的路径指定为我们的私有Docker仓库。示例如下所示:

[kadmin@k8s-master ~]$ 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

保存并关闭文件

如何在Kubernetes(k8s)中设置Docker的私有仓库

运行以下kubectl命令,

[kadmin@k8s-master ~]$ kubectl create -f nginx-test-deployment.yaml
deployment.apps/nginx-test-deployment created
[kadmin@k8s-master ~]$ kubectl get deployments  nginx-test-deployment
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
nginx-test-deployment   3/3     3            3           13s
[kadmin@k8s-master ~]$
[kadmin@k8s-master ~]$ 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
[kadmin@k8s-master ~]$

尝试使用“ kubectl describe ”命令描述任何pod并验证图像路径

[kadmin@k8s-master ~]$ kubectl describe pod nginx-test-deployment-f488694b5-2rvmv

以上命令的输出为

如何在Kubernetes(k8s)中设置Docker的私有仓库

上面的输出确认容器的映像路径是我们的私有Docker仓库,因此这意味着nginx映像已从私有仓库下载。这就是本文的全部内容,我希望这些步骤可以帮助您在Kubernetes集群上设置私有Docker仓库。请在下面的评论部分中分享您的反馈和评论。

评论

登录后评论

服务器优惠活动

Top