Un colega creó un clúster K8s para mí. Puedo ejecutar servicios en ese clúster sin ningún problema. Sin embargo, no puedo ejecutar servicios que dependan de una imagen de Amazon ECR, que realmente no entiendo. Probablemente, cometí un pequeño error en mi archivo de implementación y por lo tanto causé este problema.
Aquí está mi archivo de implementación:
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment labels: app: hello spec: replicas: 3 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello image: xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest ports: - containerPort: 5000Aquí está mi archivo de servicio:
apiVersion: v1 kind: Service metadata: name: hello-svc labels: app: hello spec: type: NodePort ports: - port: 5000 nodePort: 30002 protocol: TCP selector: app: helloEn el nodo maestro, ejecuté esto para asegurarme de que kubernetes conozca la implementación y el servicio.
kubectl create -f dep.yml kubectl create -f service.ymlUsé la extensión K8s en vscode para verificar los registros de mis pods.
Este es el error que me sale:
Error del servidor (Solicitud incorrecta): el contenedor "hola" en el pod "hola-implementación-xxxx-49pbs" está esperando para comenzar: intento y error al extraer la imagen.
Aparentemente, tirar es un problema... Esto no sucede cuando se usa una imagen pública desde el centro de la ventana acoplable pública. Lógicamente, esto sería una cuestión de derechos. Pero parece que no lo es. No recibo ningún mensaje de error cuando ejecuto este comando en el nodo maestro:
docker pull xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latestEste comando simplemente extrae mi imagen.
Yo estoy confundido ahora. Puedo extraer mi imagen con docker pull en el nodo maestro. Pero K8s falla al tirar. ¿Me estoy perdiendo algo en mi archivo de implementación? ¿Alguna propiedad que diga: "repositoryIsPrivateButDoNotComplain"? Simplemente no lo entiendo.
¿Cómo solucionar esto para que los K8 puedan usar fácilmente mi imagen de Amazon ECR?
Debe crear y utilizar secretos para la autorización ECR.
Esto es lo que necesitas hacer.
#!/bin/bash ACCOUNT=<AWS_ACCOUNT_ID> REGION=<REGION> SECRET_NAME=<SECRETE_NAME> EMAIL=<SOME_DUMMY_EMAIL> TOKEN=`/usr/local/bin/aws ecr --region=$REGION --profile <AWS_PROFILE> get-authorization-token --output text --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2` kubectl delete secret --ignore-not-found $SECRET_NAME kubectl create secret docker-registry $SECRET_NAME \ --docker-server=https://${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com \ --docker-username=AWS \ --docker-password="${TOKEN}" \ --docker-email="${EMAIL}" apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment labels: app: hello spec: replicas: 3 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello image: xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest ports: - containerPort: 5000 imagePullSecrets: - name: SECRET_NAMECree los pods y el servicio.
SI tiene éxito, entonces el secreto caducará en 12 horas, para superar eso, configure un crone (para recrear los secretos en el clúster de Kubernetes periódicamente. Para configurar el crone, use el mismo script que se proporciona arriba.
Para obtener una imagen completa de cómo sucede debajo del capó, consulte el diagrama a continuación.
Saludos Amit Meena
Para el problema de 12 horas, si está utilizando Kubernetes 1.20, configure y use el proveedor de credenciales de imagen de Kubelet
https://kubernetes.io/docs/tasks/kubelet-credential-provider/kubelet-credential-provider/
Debe habilitar la puerta de características alfa KubeletCredentialProviders en su kubelet
Si usa la versión inferior de Kubernetes y esta función no está disponible, use https://medium.com/@damitj07/how-to-configure-and-use-aws-ecr-with-kubernetes-rancher2-0-6144c626d42c