Preguntas y respuestas comunes sobre el despliegue y la gestión de cargas de trabajo en clústeres de ACK.
¿Cómo despliego una aplicación contenedorizada en un clúster de ACK?
El despliegue de una aplicación contenedorizada consta de cuatro fases:
Escriba el código de su aplicación en cualquier lenguaje.
Compile una imagen de contenedor mediante un Dockerfile, que es un archivo de texto que empaqueta su código y todas sus dependencias en un artefacto de entrega portable. Una imagen de contenedor es más completa que los paquetes tradicionales como archivos JAR, WAR o RPM, ya que agrupa la aplicación con todos los archivos necesarios para el entorno de ejecución del contenedor. Utilice esa imagen para iniciar un contenedor, que representa la aplicación en ejecución. Para obtener instrucciones paso a paso, consulte Build, package, and run images using a Dockerfile.
-
Envíe la imagen a un registro. Container Registry (ACR) almacena, gestiona, distribuye y sirve imágenes. ACR ofrece dos ediciones. Para obtener más información, consulte What is Container Registry ACR.
Personal Edition: para desarrolladores individuales.
Enterprise Edition: para clientes empresariales.
Despliegue cargas de trabajo en ACK para ejecutar su aplicación contenedorizada. ACK gestiona todo el ciclo de vida de las cargas de trabajo contenedorizadas, lo que incluye la programación de pods en nodos específicos, el escalado ante cambios de carga, entre otras funciones. Para obtener más información, consulte Workloads.
¿Por qué la descarga de imágenes tarda demasiado o falla?
Revise los siguientes puntos según el origen desde el cual descarga la imagen:
Descarga a través de la red pública
Compruebe que su clúster tenga acceso a la red pública. Consulte Enable public network access for a cluster.
Verifique que su registro de imágenes también permita el acceso público. Para ver un ejemplo con ACR, consulte Configure public network access control for ACR.
Revise si el ancho de banda de la IP pública está configurado con un valor demasiado bajo.
Descarga desde ACR
Verifique que el secret de descarga de imágenes sea correcto. Consulte How do I use imagePullSecrets?.
Si utiliza el componente de descarga sin contraseña, compruebe que esté configurado correctamente. Consulte Pull images within the same account y Pull images across accounts.
¿Cómo soluciono problemas de aplicaciones en ACK?
Los fallos en las aplicaciones suelen originarse en pods, controladores (Deployment, StatefulSet, DaemonSet) o Services. Comience por identificar qué capa presenta el problema y siga los pasos a continuación.
Compruebe los pods
Consulte Troubleshoot pod anomalies para obtener una guía completa sobre cómo diagnosticar problemas a nivel de pod.
Compruebe los Deployments
Las anomalías en los pods suelen manifestarse cuando se crean controladores como Deployments, DaemonSets, StatefulSets o Jobs. Después de revisar los problemas a nivel de pod, examine los eventos y registros del Deployment:
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en ACK consoleClusters.
En la página Clusters, busque y haga clic en el nombre del clúster. En el panel de navegación izquierdo, elija Workloads > Deployments.
En la página Deployments, haga clic en el nombre del Deployment y luego en Events o Logs para identificar el problema.
El procedimiento para DaemonSets, StatefulSets y Jobs es el mismo.
Compruebe los Services
Un Service distribuye el tráfico entre un grupo de pods mediante balanceo de carga. Siga estos pasos para identificar problemas relacionados con los Services.
Paso 1: Verifique que existan endpoints
Connect to the cluster with kubectl y ejecute:
kubectl get endpoints <service_name>
La cantidad de direcciones en la columna ENDPOINTS debe coincidir con el número esperado de réplicas. Por ejemplo, un Deployment con tres réplicas debería mostrar tres direcciones.
Endpoints de Service faltantes
Si el Service no tiene direcciones de endpoint, es posible que el selector del Service no coincida con ningún pod. Ejecute lo siguiente para comprobarlo:
-
Busque el selector en el YAML del Service:
spec: clusterIP: 1x.xx.xx.33 externalTrafficPolicy: Cluster ports: - name: http nodePort: 30040 port: 30080 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None -
Consulte los pods que usan ese selector:
<app>es el valor de la etiquetaappdel pod.<namespace>es el namespace donde reside el Service. Omita-n <namespace>si el Service se encuentra en el namespace predeterminado.kubectl get pods -l app=<app> -n <namespace> -
Si existen pods coincidentes pero aún no hay endpoints, es posible que el puerto del Service no coincida con el puerto del contenedor. Pruebe la conectividad:
<ip>y<port>son los valores declusterIPyportdel YAML del Service en el paso 1. El método exacto de prueba depende de su entorno.curl <ip>:<port>Confirme que el puerto del contenedor especificado en el Service sea el mismo puerto en el que la aplicación escucha realmente.
Problemas de reenvío de red
Si el cliente puede alcanzar el Service y los endpoints son correctos, pero las conexiones se cierran de inmediato, es posible que el tráfico no esté llegando a los pods. Revise lo siguiente:
¿Está sano el pod? Consulte Troubleshoot pod anomalies.
¿Es accesible la IP del pod? Obtenga las IPs de los pods con
kubectl get pods -o wide, inicie sesión en cualquier nodo y ejecuteping <pod-ip>para verificar la conectividad de red.¿La aplicación escucha en el puerto correcto? En cualquier nodo, ejecute
curl <pod-ip>:<port>para confirmar que el puerto del contenedor en el pod funciona como se espera.
¿Cómo actualizo Helm manualmente?
El componente del lado del servidor Tiller de Helm v2 tiene vulnerabilidades de seguridad conocidas que permiten a atacantes instalar aplicaciones no autorizadas en los clústeres. Actualice a Helm v3. Consulte Upgrading from Helm v2 to Helm v3.
¿Cómo descargo imágenes de una instancia de Container Registry Enterprise Edition en China continental hacia un clúster de ACK fuera de China continental?
Adquiera las siguientes instancias de Container Registry Enterprise Edition:
Instancia Standard o Premium en la región dentro de China continental.
Instancia Basic en la región fuera de China continental.
Luego, utilice una instancia de sincronización para replicar las imágenes desde la región de China continental hacia la región fuera de China continental. Consulte Same-account sync instance. Tras la sincronización, obtenga la dirección del registro de la instancia Enterprise Edition en la región fuera de China continental y utilícela al crear aplicaciones en ACK.
ACR Personal Edition tiene velocidades de sincronización más lentas. Para repositorios autogestionados, debe adquirir Global Acceleration (GA) para acelerar la descarga de imágenes, lo cual incrementa el costo. Se recomienda utilizar Container Registry Enterprise Edition. Consulte Billing information .
¿Cómo realizo actualizaciones continuas sin interrupciones del servicio?
Al reemplazar pods durante una actualización continua, ocurre un retraso de algunos segundos antes de que los cambios en los pods se sincronicen con la instancia de Classic Load Balancer (CLB). Esto puede provocar errores 5XX temporales. Configure el apagado graceful para lograr actualizaciones continuas sin tiempo de inactividad. Consulte Implement zero-downtime rolling deployments.
¿Cómo obtengo una imagen de contenedor para una carga de trabajo?
Para conocer los requisitos previos y obtener orientación sobre cómo descargar una imagen de contenedor, consulte Pull image.
¿Cómo reinicio un contenedor?
Kubernetes no admite el reinicio directo de contenedores individuales. En su lugar, elimine el pod; el controlador (Deployment, DaemonSet, etc.) creará automáticamente un reemplazo.
-
Liste los pods para encontrar el que desea reiniciar:
kubectl get pods -
Elimine el pod:
kubectl delete pod <pod-name> -
Verifique que el nuevo pod esté en ejecución:
kubectl get podsConfirme que el estado del pod sea
Running.
En producción, gestione los contenedores a través de objetos de nivel superior como ReplicaSets y Deployments en lugar de manipular los pods directamente. Esto preserva la consistencia del estado del clúster.
¿Cómo cambio el namespace de un Deployment?
Mover un Deployment a un namespace diferente también requiere actualizar manualmente los recursos dependientes —persistent volume claims (PVCs), ConfigMaps y Secrets— al nuevo namespace.
-
Exporte la configuración del Deployment:
kubectl get deploy <deployment-name> -n <old-namespace> -o yaml > deployment.yaml -
Edite
deployment.yamly reemplace el valor denamespace:apiVersion: apps/v1 kind: Deployment metadata: annotations: generation: 1 labels: app: nginx name: nginx-deployment namespace: new-namespace # Specify the new namespace. ... ... -
Aplique la configuración actualizada:
kubectl apply -f deployment.yaml -
Verifique que el Deployment se esté ejecutando en el nuevo namespace:
kubectl get deploy -n new-namespace
¿Cómo expongo información del pod a los contenedores en ejecución?
ACK sigue las especificaciones nativas de la comunidad de Kubernetes. Se admiten dos métodos:
Variables de entorno: pase información del pod a un contenedor mediante variables de entorno. Consulte Exponer información del pod a los contenedores mediante variables de entorno.
Archivos: monte la información del pod como archivos dentro del contenedor utilizando el volumen Downward API. Consulte Exponer información del pod a los contenedores mediante archivos.
¿Cómo uso imagePullSecrets?
El componente de descarga sin contraseña no admite el campo
imagePullSecretsespecificado manualmente.El Secret debe estar en el mismo namespace que la carga de trabajo.
Las instancias de ACR Personal Edition creadas a partir del 9 de septiembre de 2024 no admiten aliyun-acr-credential-helper. Almacene sus credenciales en un Secret de Kubernetes y refiriéralas mediante imagePullSecrets.
Paso 1: Cree el Secret
kubectl create secret docker-registry image-secret \
--docker-server=<ACR-registry> \
--docker-username=<username> \
--docker-password=<password> \
--docker-email=<email@example.com>
|
Parámetro |
Descripción |
|
|
Endpoint de la instancia de ACR. Debe coincidir con el tipo de red de la dirección del registro (interna o pública). |
|
|
Nombre de usuario de la credencial de acceso a ACR. |
|
|
Contraseña de la credencial de acceso a ACR. |
|
|
Opcional. |
Paso 2: Referencie el Secret
Elija uno de los siguientes métodos:
Uso de una Service Account
Opción 1: Añadir a una ServiceAccount
Todas las cargas de trabajo que utilicen la ServiceAccount podrán descargar imágenes sin necesidad de especificar el Secret individualmente.
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
imagePullSecrets:
- name: image-secret # Enter the ACR Secret
Cualquier Deployment que use esta ServiceAccount podrá entonces descargar imágenes:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: default
labels:
app: nginx
spec:
serviceAccountName: default # If using the default ServiceAccount for the namespace, you do not need to specify it.
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: <acrID>.cr.aliyuncs.com/<repo>/nginx:latest # Replace with the ACR instance link
Uso directo en una carga de trabajo
Opción 2: Especificar directamente en la carga de trabajo
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: default
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
imagePullSecrets:
- name: image-secret # Use the Secret created in the previous step
containers:
- name: nginx
image: <acrID>.cr.aliyuncs.com/<repo>/nginx:latest # Replace with the Registry Address of the ACR repository
Verificación
Después de aplicar la configuración, confirme que el pod esté en ejecución:
kubectl get pods
¿Por qué siguen fallando las descargas después de configurar el componente sin contraseña?
Es posible que el componente de descarga sin contraseña esté mal configurado. Revise estas dos causas comunes:
La información de la instancia en el componente no coincide con la instancia de ACR.
La dirección de imagen utilizada para la descarga no coincide con el nombre de dominio configurado en el componente.
Siga Pull images within the same account para verificar la configuración.
Si la descarga sigue fallando después de confirmar que la configuración es correcta, es posible que un campo imagePullSecrets especificado manualmente en el YAML de la carga de trabajo esté entrando en conflicto con el componente sin contraseña. Elimine el campo imagePullSecrets, elimine el pod y vuelva a crearlo.
¿Por qué los contenedores no se inician en nuevos nodos tras habilitar la aceleración de imágenes del node pool?
Después de habilitar Container Image Acceleration para un node pool, podría aparecer el siguiente error:
failed to create containerd container: failed to attach and mount for snapshot 46: failed to enable target for /sys/kernel/config/target/core/user_99999/dev_46, failed:failed to open remote file as tar file xxxx
Este error ocurre porque Container Image Acceleration requiere que el componente aliyun-acr-acceleration-suite esté instalado y que se hayan configurado las credenciales de descarga para imágenes privadas. Consulte Configure container image pull credentials.
Si el problema persiste después de instalar el componente, siga primero disable container image acceleration para restaurar sus servicios y luego vuelva a configurarlo.