En esta página, se explica cómo crear clústeres mediante imágenes extraídas de una duplicación de registro en lugar de un registro público, como gcr.io
.
Una duplicación de registro es una copia local de un registro público que copia o duplica la estructura de archivos del registro público. Por ejemplo, supongamos que la ruta a la duplicación de tu registro local es 172.18.0.20:5000
. Cuando containerd
encuentra una solicitud para extraer una imagen como gcr.io/kubernetes-e2e-test-images/nautilus:1.0
, containerd
intenta extraer esa imagen, no de gcr.io
, sino de tu registro local en la siguiente ruta: 172.18.0.20:5000/kubernetes-e2e-test-images/nautilus:1.0
. Si la imagen no está en esta ruta de registro local, la imagen se extrae automáticamente del registro público gcr.io
.
El uso de una duplicación de registro proporciona los siguientes beneficios:
- Te protege de las interrupciones de registros públicos.
- Acelera la creación de Pods.
- Te permite realizar tu propio análisis de vulnerabilidades.
- Evita los límites que imponen los registros públicos sobre la frecuencia con la que puedes enviarles comandos.
Antes de comenzar
- Debes tener un servidor de registro de contenedores configurado en tu red.
- Si el servidor de registro ejecuta un certificado TLS privado, debes tener el archivo de autoridad certificadora (CA).
- Si el servidor de registro necesita autenticación, debes tener las credenciales de acceso o el archivo de configuración de Docker adecuados.
- Para usar una duplicación de registro, debes configurar el entorno de ejecución del contenedor como containerd.
Descarga todas las imágenes necesarias para GKE en Bare Metal
Descarga la última versión de la herramienta bmctl
y el paquete de imágenes de la página Descargar.
Sube imágenes de contenedor a tu servidor de registro
Ejecuta el siguiente comando para subir las imágenes del paquete de imágenes a tu servidor de registro:
[HTTPS_PROXY=http://PROXY_IP:PORT] ./bmctl push images \
--source=./bmpackages_VERSION.tar.xz \
--private-registry=REGISTRY_IP:PORT \
[--cacert=CERT_PATH] \
[--need-credential=false]
Reemplaza lo siguiente:
PROXY_IP:PORT
por la dirección IP y el puerto del proxy si necesitas un proxy para subir las imágenes de la estación de trabajo al servidor de registroVERSION
por la versión del paquete de imágenes que descargaste de la página Descargas.REGISTRY_IP:PORT
por la dirección IP y el puerto del servidor de registro privadoCERT_PATH
por la ruta del archivo de certificado de CA si tu servidor de registro usa un certificado TLS privado
Ingresa tu nombre de usuario y contraseña cuando se te solicite o selecciona un archivo de configuración de Docker. Si tu servidor de registro no requiere credenciales, especifica --need-credential=false
.
Para obtener más información sobre el uso del comando bmctl push images
, consulta:
bmctl push images --help
Usa tu propio espacio de nombres
Si deseas usar tu propio espacio de nombres en tu servidor de registro en lugar del espacio de nombres raíz, containerd
puede extraer de este espacio de nombres si proporcionas el extremo de la API para tu registro privado en registryMirrors.endpoint
. Por lo general, el extremo tiene el formato <REGISTRY_IP:PORT>/v2/<NAMESPACE>
. Consulta la guía del usuario de tu registro privado para obtener detalles específicos.
Por ejemplo, si solo tienes acceso a 172.18.0.20:5000/test-namespace/
, puedes usar el comando siguiente para subir todas las imágenes en el espacio de nombres test-namespace
:
./bmctl push images \
--source=./bmpackages_VERSION.tar.xz \
--private-registry=172.18.0.20:5000/test-namespace
--username=<USERNAME>
--password=<PASSWORD>
--cacert <path/to/cert.crt>
Luego, en el archivo de configuración del clúster, puedes agregar lo siguiente para que containerd
extraiga del espacio de nombres:
registryMirrors:
- endpoint: https://172.18.0.20:5000/v2/test-namespace
Crea clústeres desde la duplicación del registro
En el siguiente archivo de configuración de clúster de muestra, se especifica que las imágenes se deben extraer de una duplicación del registro local cuyo extremo es https://172.18.0.20:5000
.
En las siguientes secciones, se describen algunos de los campos que aparecen al comienzo de este archivo de configuración.
# Sample cluster config with registry mirror:
---
gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json
sshPrivateKeyPath: /root/ssh-key/id_rsa
registryMirrors:
- endpoint: https://172.18.0.20:5000
caCertPath: /root/ca.crt
pullCredentialConfigPath: /root/.docker/config.json
hosts:
- somehost.io
- otherhost.io
---
apiVersion: v1
kind: Namespace
metadata:
name: cluster-admin1
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: admin1
namespace: cluster-admin1
spec:
nodeConfig:
containerRuntime: containerd
...
Campo hosts
containerd
verifica la sección hosts
del archivo de configuración del clúster para descubrir qué hosts se duplican de manera local. En el archivo de configuración de ejemplo, los registros públicos que se enumeran en la sección hosts
son somehost.io
y otherhost.io
. Debido a que estos registros públicos aparecen en la sección hosts
, containerd
verifica primero la duplicación del registro privado cuando encuentra solicitudes de extracción de imágenes de somehost.io
o otherhost.io
.
Por ejemplo, supongamos que containerd
recibe un comando de extracción para somehost.io/kubernetes-e2e-test-images/nautilus:1.0
. Debido a que somehost.io
aparece como uno de los hosts en la sección hosts
del archivo de configuración del clúster, containerd
busca la imagen de kubernetes-e2e-test-images/nautilus:1.0
en la duplicación del registro local. Si somehost.io
no aparece en la sección hosts
, containerd
no sabe que existe una duplicación local de somehost.io
. En ese caso, containerd
no verifica la duplicación en busca de la imagen y solo extrae la imagen del registro público somehost.io
.
Ten en cuenta que, de forma predeterminada, GKE en Bare Metal duplica automáticamente las imágenes de gcr.io
, por lo que no necesitas enumerar gcr.io
como host en la sección hosts
.
Campo gcrKeyPath
Si deseas que GKE en Bare Metal use Container Registry (gcr.io
) de forma automática para extraer imágenes que no aparecen en tu registro local, debes especificar la ruta a la clave de la cuenta de servicio de Container Registry. GKE en Bare Metal no tiene un mecanismo para proporcionar claves a otros registros públicos.
Si no planeas usar la función en la que las imágenes se extraen de gcr.io
cuando no aparecen en el registro local, no es necesario que agregues un gcrKeyPath
al archivo de configuración del clúster.
Campo caCertPath
Si tu registro requiere un certificado de seguridad de la capa de transporte privada (TLS), este campo toma la ruta al archivo del certificado de la AC raíz del servidor. Este archivo de certificado debe estar en la estación de trabajo de administrador, la máquina que ejecuta los comandos bmctl
. Si tu registro no requiere un certificado TLS privado, puedes dejar el campo caCertPath
en blanco.
Campo pullCredentialConfigPath
Si el servidor de registro no requiere un archivo de configuración de Docker de autenticación, puedes dejar el campo pullCredentialConfigPath
en blanco. Ten en cuenta que esta es la ruta al archivo de configuración en la máquina que ejecuta los comandos bmctl
.
Crea un clúster de usuario desde la duplicación del registro
Los clústeres de usuario no extraen imágenes de una duplicación de registro de forma automática si su clúster de administrador se configuró para hacerlo. Para que los clústeres de usuarios extraigan una duplicación de registro, debes configurarlos de forma individual como se describe en Crea clústeres desde la duplicación del registro.
Actualiza extremos de registro duplicado, certificados y credenciales de extracción
Para actualizar los extremos de duplicación del registro, los certificados o las credenciales de extracción, sigue estos pasos:
En el archivo de configuración del clúster, actualiza el extremo, el archivo del certificado de CA y la ruta de acceso del archivo de configuración de la credencial.
Ejecuta el siguiente comando para aplicar los cambios:
bmctl update cluster -c CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
Reemplaza lo siguiente:
- CLUSTER_NAME por el nombre del clúster que deseas actualizar
- ADMIN_KUBECONFIG por la ruta de acceso del archivo de configuración de su clúster de administrador
Verifica que las imágenes se extraigan de la duplicación del registro
En esta sección, se describen dos métodos que puedes usar para verificar si containerd
extrae imágenes de tu duplicación del registro local en lugar de un registro público.
Método 1: Compara los resúmenes de los repositorios
Este método implica comparar los resúmenes de los repositorios para determinar si una imagen se extrajo de tu duplicación del registro.
Ten en cuenta que un registro tiene un identificador único llamado resumen del repositorio, y una imagen tiene un identificador único llamado resumen de la imagen del contenedor. Dos imágenes que son idénticas tienen el mismo resumen de imagen de contenedor, incluso si las imágenes provienen de registros diferentes. Sin embargo, si las imágenes provienen de diferentes registros, tienen diferentes resúmenes de repositorios.
Accede a un nodo del clúster mediante SSH.
Elige una imagen cuyo origen desees verificar.
Extrae la imagen del registro público que usas mediante la ejecución del siguiente comando:
crictl pull PUBLIC_ENDPOINT
Reemplaza
PUBLIC_ENDPOINT
por la ruta de acceso de la imagen en el registro público. Por ejemplo:gcr.io/anthos-baremetal-release/kube-rbac-proxy:v0.6.0-gke.0
.Extrae la misma imagen de tu duplicación de registro mediante la ejecución del siguiente comando:
crictl pull MIRROR_ENDPOINT
Reemplaza
MIRROR_ENDPOINT
por la ruta de acceso de la imagen en tu duplicación de registro. Por ejemplo:10.168.15.224:5007/test-namespace/anthos-baremetal-release/kube-rbac-proxy:v0.6.0-gke.0
.Ejecuta el comando siguiente para mostrar los resúmenes del repositorio de las dos imágenes que extrajiste en los pasos anteriores:
crictl inspecti PUBLIC_OR_MIRROR_ENDPOINT | grep -A 3 repoDigests
Reemplaza
PUBLIC_OR_MIRROR_ENDPOINT
por el extremo público de la imagen o el extremo de duplicación del registro de la imagen. Cualquiera de los dos está bien, porque el comandocrictl inspecti
observa el resumen de la imagen del contenedor del argumento que le pasas. Dado que la imagen del registro público es idéntica a la imagen de la duplicación del registro, ambas tienen el mismo resumen de imagen de contenedor.El resultado del comando podría verse de la siguiente manera:
"repoDigests": [ "gcr.io/anthos-baremetal-release/kube-rbac-proxy@sha256:27be66fb9140d83c4af8794a234b998c90e844e3414108ce72db603f4f6ea0b3", "10.168.15.224:5007/test-namespace/anthos-baremetal-release/kube-rbac-proxy@sha256:27be66fb9140d83c4af8794a234b998c90e844e3414108ce72db603f4f6ea0b3" ],
Compara los resúmenes del repositorio que aparecen en negrita en el resultado del paso anterior. Si los resúmenes son idénticos, los nodos de tu clúster se extraen de tu duplicación de registro. De lo contrario, los nodos del clúster extraen imágenes de un registro público.
Método 2: Examina el archivo config.toml
Para determinar si containerd
extrae imágenes de tu registro local, examina los contenidos de un archivo config.toml
como se muestra en los pasos siguientes:
Accede a un nodo y examina el contenido del siguiente archivo:
/etc/containerd/config.toml
.Verifica la sección
plugins."io.containerd.grpc.v1.cri".registry.mirrors
del archivoconfig.toml
para ver si el servidor de registro aparece en el campoendpoint
. Este es un extracto de un archivoconfig.toml
de ejemplo en el que el campoendpoint
aparece en negrita:
version = 2
root = "/var/lib/containerd"
state = "/run/containerd"
...
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."gcr.io"]
[plugins."io.containerd.grpc.v1.cri".registry.configs."privateregistry2.io".tls]
ca_file = '/etc/containerd/certs.d/privateregistry2.io/ca.crt'
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
endpoint = ["http://privateregistry.io", "http://privateregistry2.io"]
...
Si la duplicación del registro aparece en el campo endpoint
, el nodo extrae imágenes de la duplicación del registro en lugar de un registro público.