En los clústeres mixtos donde coexisten nodos reales y nodos virtuales, programar pods en Elastic Container Instance (ECI) y habilitar funciones específicas de ECI suele requerir modificar los archivos YAML de los pods. Esto difumina la línea entre las operaciones de la plataforma y la configuración de la aplicación. El eci-profile elimina esta carga. Como administrador del clúster, usted define las reglas de programación y la inyección de anotaciones en un único ConfigMap a nivel de clúster. De este modo, los pods reciben la configuración adecuada automáticamente, sin necesidad de modificar el YAML de la aplicación.
Funcionamiento
Cuando se crea un pod, ack-virtual-node lee el ConfigMap llamado eci-profile en el namespace kube-system. Después, aplica al pod la configuración que se encuentra en su sección data.
El eci-profile ofrece tres capacidades:
ECI Scheduler: dirige los pods hacia ECI según las etiquetas de los pods o de los namespaces mediante un mecanismo de mutating webhook. Así se evita agregar directivas de programación a cada archivo YAML de los pods.
ECI Effect: inyecta automáticamente anotaciones y etiquetas en los pods coincidentes. Esto permite habilitar funciones avanzadas de ECI, como especificar tipos de instancia de Elastic Compute Service (ECS), habilitar cachés de imágenes y configurar el servicio Network Time Protocol (NTP). Para consultar la lista completa de anotaciones compatibles, consulte ECI Pod Annotation.
Actualizaciones en caliente: los cambios de configuración en el eci-profile (dirección IP del clúster, nube híbrida, recopilación de registros, vSwitches) surten efecto de inmediato en los pods recién creados. No es necesario reiniciar ack-virtual-node. Los pods existentes adoptan los cambios solo después de una actualización continua (rolling update).
Requisitos previos
Antes de empezar, compruebe lo siguiente:
El complemento ack-virtual-node del clúster está en la versión más reciente. Para actualizarlo, consulte Manage components.
Los mutating webhooks están habilitados en el clúster (obligatorio para ECI Scheduler). En los clústeres ACK Serverless, los pods se programan en ECI automáticamente, por lo que no se requiere ECI Scheduler.
Notas de uso
Después de actualizar el eci-profile, los pods de ECI recién creados usan la nueva configuración de inmediato. Los pods existentes la aplican solo tras una actualización continua.
Si no configura
namespaceSelectorniobjectSelectorpara un selector, pero sí configuraeffect, los ajustes de effect se aplican a todos los pods programados en ECI.Si varios selectores coinciden con un pod, se evalúan en orden. Las anotaciones y etiquetas de los selectores que coinciden primero tienen prioridad sobre las de los selectores posteriores. Las anotaciones y etiquetas existentes del pod siempre tienen prioridad sobre cualquier elemento inyectado por
effect.
Consultar el eci-profile
Ejecute el siguiente comando para consultar el ConfigMap actual del eci-profile:
kubectl get cm -n kube-system eci-profile -o yaml
La sección data del ConfigMap contiene dos tipos de configuración:
|
Parámetro |
Descripción |
|
|
Define las reglas de ECI Scheduler y ECI Effect. Consulte Configure selectors. |
|
Otros parámetros ( |
Parámetros a nivel de clúster que se aplican cuando no existe una anulación a nivel de pod. Admiten actualizaciones en caliente. Consulte Actualizar parámetros a nivel de clúster. |
Un eci-profile predeterminado tiene el siguiente aspecto:
apiVersion: v1
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
featureGates: "WaitForFirstConsumer=false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****
kind: ConfigMap
metadata:
creationTimestamp: "2023-01-11T08:28:14Z"
name: eci-profile
namespace: kube-system
resourceVersion: "356"
uid: b345fa8c-919e-41fc-a981-57864b1a****
Editar el eci-profile
Utilice uno de los siguientes métodos para editar el eci-profile.
kubectl
kubectl edit configmap eci-profile -n kube-system
Consola de ACK
Inicie sesión en Container Service ACK console.
En la página Clusters, haga clic en el nombre del clúster de destino.
En el panel de navegación izquierdo, seleccione Configurations > ConfigMaps.
Seleccione kube-system en la lista desplegable Namespace.
Busque eci-profile y haga clic en Edit YAML en la columna Actions.
Configurar selectores
Los selectores definen qué pods se dirigen a ECI (ECI Scheduler) y qué anotaciones o etiquetas se inyectan en dichos pods (ECI Effect). Cuando se crea un pod, el sistema evalúa cada selector en secuencia y aplica las reglas coincidentes.
Cada selector admite los siguientes campos:
name(obligatorio): un nombre único para el selector.namespaceSelector(opcional): hace coincidir los pods según las etiquetas del namespace. Especifique las etiquetas dentro dematchLabels. Si hay varias etiquetas, se usa lógica AND.objectSelector(opcional): hace coincidir los pods según sus etiquetas. Especifique las etiquetas dentro dematchLabels. Si hay varias etiquetas, se usa lógica AND.effect(opcional): las anotaciones y etiquetas que se inyectan en los pods coincidentes. Los valores inyectados no sobrescriben las anotaciones ni las etiquetas existentes del pod.
Cuando se configuran tanto namespaceSelector como objectSelector, un pod debe cumplir ambos criterios para coincidir con el selector. Si no se configura ninguno de los dos, pero sí se configura effect, el efecto se aplica a todos los pods programados en ECI.
Plantilla de selector
data:
selectors: |
[
{
"name": "selector-demo1", # Required. Unique selector name.
"namespaceSelector": { # Optional. Matches by namespace labels.
"matchLabels": { # AND logic among multiple labels.
"eci": "true"
}
},
"objectSelector": { # Optional. Matches by pod labels.
"matchLabels": { # AND logic among multiple labels.
"eci": "true"
}
},
"effect": { # Optional. Annotations and labels to inject.
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
},
"labels": {
"created-by-eci": "true"
}
}
},
{
"name": "selector-demo2",
"objectSelector": {
"matchLabels": {
"eci": "test"
}
}
}
]
En el ejemplo anterior, selector-demo1 coincide con los pods que tienen la etiqueta eci: true y pertenecen a un namespace con la etiqueta eci: true. Los pods coincidentes se programan en ECI y reciben la anotación k8s.aliyun.com/eci-use-specs: ecs.c6.xlarge junto con la etiqueta created-by-eci: true.
Elimine los comentarios en línea ( # ) antes de aplicar la configuración. JSON no admite comentarios.
Comprobar que los selectores surtan efecto
Después de actualizar los selectores, ejecute el siguiente comando para confirmar que están registrados:
kubectl get mutatingwebhookconfigurations -o yaml vk-webhook
Si la salida contiene los selectores configurados, la configuración está activa. De lo contrario, compruebe que el formato JSON del selector sea correcto.
Ejemplos de configuración
Ejemplo 1: Dirigir pods específicos a ECI
El siguiente selector dirige un pod a ECI cuando el pod tiene la etiqueta created-by-eci: true y su namespace tiene la etiqueta type: eci.
data:
selectors: |
[
{
"name": "eci-selector",
"namespaceSelector": {
"matchLabels": {
"type": "eci"
}
},
"objectSelector": {
"matchLabels": {
"created-by-eci": "true"
}
}
}
]
Ejemplo 2: Dirigir pods a ECI con un tipo de instancia acelerada por GPU
El siguiente selector dirige a ECI los pods cuyo namespace tiene la etiqueta gpu: true. Utiliza el tipo de instancia acelerada por GPU ecs.gn6v-c8g1.2xlarge y agrega la etiqueta gpu: test a los pods coincidentes.
data:
selectors: |
[
{
"name": "gpu-namespace-selector",
"namespaceSelector": {
"matchLabels": {
"gpu": "true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.gn6v-c8g1.2xlarge"
},
"labels": {
"gpu": "test"
}
}
}
]
Ejemplo 3: Dirigir pods a ECI con coincidencia automática de caché de imágenes
El siguiente selector dirige a ECI los pods con la etiqueta imc: auto y habilita la coincidencia automática de caché de imágenes.
data:
selectors: |
[
{
"name": "autoimc-object-selector",
"objectSelector": {
"matchLabels": {
"imc": "auto"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-auto-imc": "true"
}
}
}
]
Actualizar parámetros a nivel de clúster
A continuación se muestran los parámetros de la sección data que actúan como valores predeterminados a nivel de clúster. Cuando se crea un pod sin una anulación a nivel de pod, se utilizan los valores del eci-profile. Todos los parámetros admiten actualizaciones en caliente; los cambios surten efecto de inmediato sin necesidad de reiniciar ack-virtual-node.
Estos parámetros se aplican únicamente cuando ninguna configuración a nivel de pod los anula.
|
Parámetro |
Valor predeterminado |
Descripción |
|
|
|
Indica si se admite la dirección IP del clúster. |
|
|
|
Indica si se habilita el modo de nube híbrida. |
|
|
|
Indica si se habilitan los nodos basados en ARM. Consulte Schedule pods to an ARM-based virtual node. |
|
|
|
Indica si se utiliza la definición de recursos personalizados (CRD) de Simple Log Service para recopilar los registros de los pods. Si se establece en |
|
|
|
Indica si se habilita la expansión de discos en línea. Si se establece en |
|
|
|
Indica si se utiliza PrivateZone para la resolución de nombres de dominio. |
|
|
|
Indica si se reutilizan las claves SSL entre los pods. De forma predeterminada, ack-virtual-node emite un certificado SSL único para cada pod. Si se establece en |
|
|
|
Feature gate canario. Solo se puede configurar |
|
|
— |
El security group para los pods de ECI. Ejemplo: |
|
|
— |
El grupo de máquinas para los pods de ECI. Obligatorio cuando |
|
|
— |
Los ID de los vSwitches para los pods de ECI. Separe varios ID con comas. Ejemplo: |
|
|
— |
El ID de la Virtual Private Cloud (VPC) donde se despliegan los pods de ECI. Ejemplo: |
Acerca de featureGates: WaitForFirstConsumer
Cuando WaitForFirstConsumer se establece en "true":
El complemento csi-provisioner debe estar en la versión más reciente antes de habilitar esta opción.
Los PersistentVolumes (PV) y el almacenamiento de backend se crean solo después de programar el pod. La zona y la región especificadas en StorageClass ya no se utilizan. En su lugar, se emplean la zona y la región del nodo donde se programó el pod para crear los recursos de almacenamiento. Esto garantiza que los recursos de cómputo se programen de manera prioritaria.
Para obtener más información, consulte Modo de vinculación de volúmenes.
A continuación se muestra un ejemplo completo de la sección data:
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****