Siempre se recomienda tener un registro o repositorio de docker privado en su clúster de Kubernetes. El registro privado de Docker permite a los desarrolladores insertar y extraer sus imágenes de contenedores privados. Una vez que los contenedores de la aplicación se envían al registro privado, los desarrolladores pueden usar la ruta de su registro privado mientras crean e implementan sus archivos yaml.
En este artículo, aprenderemos cómo podemos implementar el registro privado de Docker como una implementación sobre el clúster de Kubernetes. Supongo que el clúster de Kubernetes ya está en funcionamiento.
Detalles del laboratorio de Kubernetes para configurar un registro docker privado
- k8s-maestro – 192.168.1.40 – CentOS 7
- k8s-trabajador-1 – 192.168.1.41 – CentOS 7
- k8s-trabajador-2 – 192.168.1.42 – CentOS 7
- usuario de kadmin con derechos sudo
- Compartir NFS ‘/opt/certs’ & ‘/opt/registry’
Nota: En mi caso, configuré el servidor nfs en el nodo principal y exporté /opt/certs y /opt/registry como recurso compartido nfs.
Antes de comenzar la implementación del registro privado, asegúrese de que estos recursos compartidos nfs estén montados en cada nodo trabajador. Ejecute los siguientes comandos en cada nodo trabajador.
$ 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
Para el montaje permanente, agregue entradas nfs en el archivo /etc/fstab.
En lugar de montar estos recursos compartidos nfs, también podemos crear volúmenes persistentes basados en nfs y luego podemos usar estos volúmenes persistentes en el archivo yaml.
Profundicemos en los pasos de instalación y configuración del registro docker privado en Kubernetes.
Paso 1) Generar certificados autofirmados para registro privado
Inicie sesión en su plano de control o nodo maestro y use el comando openssl para generar certificados autofirmados para el repositorio privado de Docker.
$ cd /opt $ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout ./certs/registry.key -x509 -days 365 -out ./certs/registry.crt
Una vez que se generan la clave y el archivo de certificado, use el comando ls para verificarlos,
[[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]$
Paso 2) Implemente un registro privado como implementación a través de un archivo yaml
En su nodo principal, cree un archivo private-registry.yaml con el siguiente contenido
[[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
guarda y cierra el archivo yaml
Ejecute el siguiente comando kubectl, implemente el registro privado utilizando el archivo yaml creado anteriormente,
[[email protected] docker-repo]$ kubectl create -f private-registry.yaml deployment.apps/private-repository-k8s created [[email protected] docker-repo]$
Ejecute los siguientes comandos de kubectl para verificar el estado de la implementación del registro y su módulo.
[[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] ~]$
Perfecto, la salida anterior confirma que el registro se implementó correctamente. Ahora copie el archivo del certificado de registro en los nodos trabajadores y el nodo maestro en la carpeta «/etc/pki/ca-trust/source/anchors». Ejecute los siguientes comandos en el nodo maestro y en cada nodo trabajador
$ sudo cp /opt/certs/registry.crt /etc/pki/ca-trust/source/anchors/ $ sudo update-ca-trust $ sudo systemctl restart docker
Paso 3) Exponer la implementación del registro como un tipo de servicio de exportación de nodos
Para exponer la implementación del registro como un tipo de servicio de puerto de nodo, cree el siguiente archivo yaml con el contenido a continuación,
[[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
Guarde y cierre el archivo.
Ahora implemente el servicio ejecutando el siguiente comando kubectl,
$ kubectl create -f private-registry-svc.yaml service/private-repository-k8s created $
Ejecute debajo del comando kubectl para verificar el estado del servicio,
[[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] ~]$
Paso 4) Probar y usar el registro docker privado en k8s
Para probar el registro privado, descargaremos la imagen nginx localmente y luego cargaremos esa imagen en el registro privado, desde el nodo maestro ejecute el siguiente conjunto de comandos,
$ sudo docker pull nginx $ sudo docker tag nginx:latest k8s-master:31320/nginx:1.17 $ sudo docker push k8s-master:31320/nginx:1.17
La salida del comando anterior le gustaría a continuación:
Ejecute el siguiente comando docker para verificar si nginx se carga en un repositorio privado o no.
[[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] ~]$
Ahora, implementemos una implementación basada en nginx y, en el archivo yaml, especifique la ruta de la imagen como nuestro registro docker privado. El ejemplo se muestra a continuación:
[[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
Guarde y cierre el archivo
Ejecute los siguientes comandos de 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] ~]$
Intente describir cualquier pod usando el comando ‘kubectl describe’ y verifique la ruta de la imagen
$ kubectl describe pod nginx-test-deployment-f488694b5-2rvmv
La salida del comando anterior sería,
El resultado anterior confirma que la ruta de la imagen del contenedor es nuestro registro docker privado, por lo que significa que la imagen nginx se descargó del registro privado. Eso es todo de este artículo, espero que estos pasos lo ayuden a configurar el registro privado de Docker en su clúster de Kubernetes. Comparta sus comentarios y comentarios en la sección de comentarios a continuación.
Leer también : Cómo configurar el clúster de Kubernetes en Google Cloud Platform (GCP)
Leer también : Cómo configurar el controlador de entrada NGINX en Kubernetes