始终建议在您的 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 入口控制器