Cómo configurar el registro privado de Docker en Kubernetes (k8s)

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

Private-Docker-Repo-Key-Certificate-k8s

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

registro privado-implementación-yaml-k8s

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:

Docker-push-comando-ejemplo

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

repositorio-privado-implementación-yaml

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,

kubectl-describe-pod-k8s

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

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *