Uso de Karpenter Provider para OCI (KPO)
Descubre cómo Karpenter Provider for OCI (KPO) trabaja con Kubernetes Engine (OKE) para aprovisionar, escalar y gestionar nodos de trabajador.
Obtenga más información sobre cómo utilizar Karpenter Provider for OCI (KPO) para integrar Karpenter en clusters que cree con Kubernetes Engine para aprovisionar y escalar nodos de trabajador:
Uso de Karpenter Provider para OCI (KPO) con Kubernetes Engine (OKE)
Karpenter es una herramienta de aprovisionamiento y escalado de nodos de Kubernetes de código abierto. Karpenter se utiliza para agregar y eliminar nodos de trabajador automáticamente en función de la demanda de programación. Cuando los pods no se pueden programar, Karpenter aprovisiona nodos de trabajador que cumplen los requisitos de los pods. También puede configurar los valores de interrupción para que Karpenter consolide la capacidad y sustituya los nodos de trabajador de forma controlada.
Puedes usar Karpenter para:
-
Amplíe los nodos de trabajador según la demanda de carga de trabajo.
-
Seleccione tipos de instancia según los requisitos de programación, como CPU, memoria, arquitectura y dominio de disponibilidad.
-
Controle el comportamiento del ciclo de vida de los nodos, como los presupuestos de consolidación e interrupción.
-
Reducir el trabajo operativo de la gestión de pools de nodos de tamaño fijo.
Para obtener más información sobre Karpenter, consulte la documentación de Karpenter.
Karpenter Provider for OCI (KPO) integra Karpenter con OCI Kubernetes Engine (OKE) para que pueda aprovisionar y escalar nodos de trabajador mediante instancias informáticas de OCI. En resumen, debe configurar los valores de nodo de trabajador específicos de OCI en OCINodeClass y, a continuación, configurar la intención de programación y escala en Karpenter NodePool.
Con más detalle, KPO utiliza los siguientes recursos personalizados de Kubernetes para configurar el comportamiento de aprovisionamiento y ampliación. Los recursos se definen mediante definiciones de recursos personalizados (CRD) instaladas con Karpenter y KPO:
NodePool: el CRD se instala con Karpenter. Puede crear recursosNodePoolpara definir los requisitos de programación, el comportamiento de las interrupciones y los límites de ampliación. UnaNodePooldescribe el tipo de capacidad que pueden utilizar las cargas de trabajo y hace referencia a unaOCINodeClasspara proporcionar valores específicos de OCI para esa capacidad.OCINodeClass: el CRD se instala con Karpenter Provider para OCI. Los recursosOCINodeClassse crean para definir la configuración del nodo de trabajador específica de OCI, como la selección de imágenes, la configuración del volumen de inicio y la configuración de VNIC.NodeClaim: el CRD se instala con Karpenter. Karpenter crea recursosNodeClaimcuando los pods pendientes necesitan capacidad, y cadaNodeClaimrepresenta una solicitud para un nodo de trabajador.
Cuando no se pueden programar pods, el aprovisionamiento sigue esta secuencia:
- Karpenter selecciona un
NodePoolcompatible y crea unNodeClaim. NodeClaimincluye unnodeClassRefque apunta alOCINodeClassal que hace referenciaNodePool.- KPO lee
NodeClaimy elOCINodeClassal que se hace referencia y, a continuación, aprovisiona recursos de OCI como la instancia informática, las VNIC y el volumen de inicio. - La instancia se inicia y se une al cluster como nodo de trabajador.
KPO se integra con la interfaz de proveedor en la nube estándar de Karpenter y está alineado con la versión 1.11.1 de Karpenter ascendente. Configure el comportamiento específico de OCI mediante OCINodeClass, que incluye:
-
Unidades de computación de OCI (VM y hardware dedicado) y etiquetas de programación correspondientes.
-
Configuraciones de tamaño múltiple para unidades flexibles.
-
Configuración ampliable para unidades flexibles (
baselineOcpuUtilization). -
Instancias preferentes (asignadas desde el tipo de capacidad Karpenter
spot). -
Imágenes predefinidas de OKE (Oracle Linux y Ubuntu).
-
Personalización de volumen de inicio (clave de KMS, tamaño, VPU por GB, cifrado PV en tránsito).
-
Opciones de direcciones IPv4 e IPv6 en las VNIC del nodo de trabajador.
-
Compatibilidad con grupos de seguridad de red (NSG) en VNIC de nodo de trabajador.
-
Configuración de VNIC secundaria (solo clusters que utilizan el complemento CNI nativo de IP de la VCN de OCI).
-
Reservas de capacidad, grupos de colocación de cluster y clusters de recursos informáticos.
-
Configuración de instancias (como metadatos, etiquetas, opciones de inicio, claves autorizadas SSH).
-
Sustituciones de configuración de Kubelet.
-
Selección de imágenes por filtro para detectar automáticamente una imagen de OKE compatible.
-
Detección de deriva para que Karpenter pueda reemplazar los nodos que se desvían de la configuración deseada.
-
Políticas de reparación de nodos opcionales (requiere que la reparación de nodos de Karpenter esté activada).
KPO también admite funciones upstream de Karpenter, como:
-
Pools de nodos estáticos para mantener un número fijo de nodos de trabajador.
-
Soporte de NodeOverlay para influir en las decisiones de programación con superposiciones de capacidad o precios.
Complete las siguientes tareas para configurar KPO, IAM e iniciar el aprovisionamiento de nodos de trabajador con Karpenter:
-
Instale KPO en el plano de datos del cluster (consulte Instalación de Karpenter Provider para OCI).
-
Otorgue permisos de IAM para que KPO pueda gestionar los recursos de OCI necesarios (consulte Otorgamiento de permisos de IAM a Karpenter Provider para OCI).
-
Otorgue permisos de IAM para permitir que las instancias iniciadas por KPO se unan al cluster (consulte Activación del registro de nodos para nodos de trabajador iniciados por KPO).
-
Cree uno o más recursos
OCINodeClass(consulte Creación de Recursos de OCINodeClass). -
Cree uno o más recursos
NodePoolde Karpenter que hagan referencia a los recursosOCINodeClass(consulte Creación de Recursos de NodePool que Hacen referencia a los Recursos de OCINodeClass).
Instalación de Karpenter Provider para OCI
Requisitos
Antes de instalar KPO, confirme que la configuración de cluster y red admite nodos de trabajador aprovisionados por Karpenter. Tenga en cuenta que es posible que la instalación se realice correctamente, pero que el aprovisionamiento posterior de nodos de trabajador falle debido a que faltan requisitos.
Versión de Kubernetes que se ejecuta en el cluster: utilice una versión de KPO compatible con la versión de Kubernetes que se ejecuta en el cluster, como se muestra en la tabla:
Versión de Kubernetes Versión de KPO Kubernetes version 1.31 v1.0.0or laterVersión de Kubernetes 1.32 v1.0.0o posteriorVersión de Kubernetes 1.33 v1.0.0o posteriorVersión de Kubernetes 1.34 v1.0.0o posteriorVersión de Kubernetes 1.35 v1.1.0o posteriorCapacidad de nodo de trabajador: ejecute al menos un pool de nodos gestionado existente o nodos de trabajador autogestionados para que KPO se pueda ejecutar en el plano de datos.
-
Complemento de cluster de CNI de plugin de red de pod nativo de VCN de OCI (también conocido como complemento de CNI nativo de IP de VCN de OCI): si el cluster está utilizando el complemento de CNI nativo de IP de VCN de OCI, el complemento debe ser de la versión 3.0.0 o posterior. Recomendamos encarecidamente el uso de la versión 3.2.0 o posterior. Si el cluster utiliza una versión del complemento anterior a la versión 3.2.0, las VNIC secundarias admiten un máximo de 16 direcciones IP (
ipCountno debe superar las 16). Cliente de Helm instalado: instale el cliente de Helm en el entorno donde desea ejecutar los comandos de Helm.
Agregar el repositorio de Helm de KPO
Para agregar el repositorio de KPO Helm, introduzca:
helm repo add karpenter-provider-oci https://oracle.github.io/karpenter-provider-oci/charts
Descargue el último índice para el repositorio karpenter-provider-oci introduciendo:
helm repo update karpenter-provider-oci
Para mostrar las versiones de historia clínica disponibles, escriba:
helm search repo karpenter-provider-oci/karpenter --versions
Revisión y configuración de valores de Helm
Revise los valores de configuración de Helm (a menudo simplemente denominados valores de Helm) para la versión de gráfico que sea compatible con la versión de Kubernetes que se ejecuta en el cluster introduciendo:
helm show values karpenter-provider-oci/karpenter --version <chart-version>En la siguiente tabla se muestran los valores de Helm más importantes:
| Valor | Obligatorio | Descripción |
|---|---|---|
settings.clusterCompartmentId |
Sí | OCID de compartimento por defecto utilizado para resolver los recursos de OCI a los que se hace referencia en OCINodeClass. En la mayoría de los casos, utilice el OCID del compartimento del cluster. |
settings.vcnCompartmentId |
Sí | OCID de compartimento por defecto utilizado para resolver los recursos de red a los que se hace referencia en OCINodeClass. En la mayoría de los casos, utilice el OCID del compartimento de VCN del cluster. |
settings.apiserverEndpoint |
Sí |
Punto final de servidor de API (privateIP) que los nodos de trabajador utilizan para comunicarse con el servidor de API de Kubernetes. Por ejemplo, |
settings.ociVcnIpNative |
No | Defina esta opción en true si el cluster utiliza el complemento CNI nativo de IP de la VCN de OCI. Valores aceptados: true o false. |
settings.ipFamilies |
No | Familias de IP asignadas a una VNIC de nodo de trabajador. Valor por defecto: ["IPv4"]. Valores aceptados: "IPv4", "IPv6" o ambos. Asegúrese de que las subredes a las que se hace referencia incluyen bloques CIDR coincidentes. |
settings.flexibleShapeConfigs |
No | Configuraciones de tamaño por defecto para unidades flexibles. Cada entrada puede especificar ocpu, memoryInGbs y baselineOcpuUtilization. Defina esto en formato YAML (el gráfico convierte YAML en JSON). |
settings.repairPolicies |
No | Una lista de las políticas de reparación de nodos de Karpenter (para obtener más información, consulte Karpenter cloudprovider.RepairPolicy). Cada entrada especifica un tipo y estado de condición de nodo más un umbral de duración antes de que Karpenter repare el nodo. Defina esto en formato YAML (el gráfico convierte YAML en JSON). Requiere que la función de reparación de nodos de Karpenter esté activada.Por ejemplo: donde |
image.registry |
No |
Registro de contenedor en el que se ha publicado la imagen de KPO. Valor por defecto: |
settings.featureGates.staticCapacity |
No |
Activa pools de nodos estáticos ascendentes. Cuando se activa, |
settings.featureGates.nodeOverlay |
No |
Activa |
Debe definir los valores de Helm necesarios para permitir que KPO resuelva los recursos de OCI y los nodos de trabajador de inicialización de datos. También puede definir los valores opcionales de Helm para que coincidan con el modelo de red y la estrategia de nodo de trabajador.
Los valores de Helm se definen en un archivo de configuración (denominado archivo de valores de Helm).
Instalar KPO
Despliegue el controlador de KPO en el plano de datos de OKE. Instale KPO en un espacio de nombres que pueda gestionar y supervisar con las herramientas de operaciones del cluster.
Seleccione el espacio de nombres en el que desea desplegar KPO.
-
Cree un archivo de valores de Helm en formato YAML que incluya los valores necesarios y los valores opcionales que desee sustituir. Por ejemplo:
settings: clusterCompartmentId: "<cluster-compartment-id>" vcnCompartmentId: "<cluster-vcn-compartment-id>" ociVcnIpNative: false apiserverEndpoint: 10.0.0.14 # Optional: override image location/tag (example for OCIR) image: registry: "<registry>" repositoryName: "<repository-name>" tag: "<version>" -
Instale el gráfico introduciendo:
helm install karpenter karpenter-provider-oci/karpenter \ --version <chart-version> \ --values <path-to-helm-values-file> \ --namespace <karpenter-namespace> \ --create-namespaceSi no especifica un espacio de nombres en el que desplegar KPO, se utiliza el espacio de nombres
default.
Para obtener más información sobre la instalación de KPO, consulte la documentación de instalación de KPO en Github.
Comprobación de la Instalación
Una vez instalado el KPO, confirme que el controlador de KPO se inicie correctamente antes de crear los recursos OCINodeClass y NodePool.
-
Confirme que los pods se están ejecutando introduciendo:
kubectl get pods --namespace <karpenter-namespace> -
Si los pods no se están ejecutando, inspeccione los eventos y logs de pod introduciendo:
kubectl describe pod --namespace <karpenter-namespace> <pod-name>kubectl logs --namespace <karpenter-namespace> <pod-name>
Otorgamiento de permisos de IAM a Karpenter Provider para OCI
Para permitir que KPO cree y gestione los recursos de OCI necesarios para los nodos de trabajador, debe otorgar a la carga de trabajo de KPO los permisos de IAM necesarios. Utilice el patrón de política que se muestra en Patrón de política de identidad de carga de trabajo para agregar las sentencias de política necesarias que se muestran en Políticas básicas necesarias para la operación de KPO. Agregue sentencias adicionales para funciones específicas que active en OCINodeClass, como se muestra en Optional Policies (Feature-Specific).
Patrón de Política de Identidad de Carga de Trabajo
Utilice el siguiente patrón para especificar las condiciones de identidad de la carga de trabajo en las políticas de IAM, de modo que los permisos de OCI solo se apliquen a la carga de trabajo de KPO del cluster:
Allow any-user to <verb> <resource> in <location> where all {
request.principal.type = 'workload',
request.principal.namespace = '<namespace-name>',
request.principal.service_account = '<service-account-name>',
request.principal.cluster_id = '<cluster-ocid>'
}<verb>es la acción que se permite (varía según el recurso de OCI).<location>es el nombre del compartimento del recurso o especifiquetenancypara todos los compartimentos.<namespace-name>es el espacio de nombres de Kubernetes donde se despliega el KPO (por defecto, el KPO se despliega en el espacio de nombresdefault).<service-account-name>es la cuenta de servicio que utilizan los pods de KPO (por defecto, los pods de KPO utilizan la cuenta de serviciokarpenter).<cluster-ocid>es el OCID del cluster.
Políticas básicas necesarias para la operación de KPO
Otorgue permisos a KPO para gestionar los recursos informáticos, de almacenamiento y de red necesarios para los nodos de trabajador mediante la inclusión de sentencias de política similares a las siguientes en una política de IAM (mediante el patrón que se muestra en Patrón de política de identidad de carga de trabajo):
Allow any-user to manage instance-family in compartment <compartment-name> where all { ... }
Allow any-user to manage volumes in compartment <compartment-name> where all { ... }
Allow any-user to manage volume-attachments in compartment <compartment-name> where all { ... }
Allow any-user to manage virtual-network-family in compartment <compartment-name> where all { ... }
Allow any-user to inspect compartments in compartment <compartment-name> where all { ... }Tenga en cuenta que si activa las funciones opcionales en OCINodeClass, también tiene que definir políticas adicionales (consulte Políticas opcionales (específicas de funciones)).
Políticas opcionales (específicas de funciones)
Además de las sentencias de política que se muestran en Políticas básicas necesarias para la operación de KPO, si activa las funciones opcionales en OCINodeClass, también tiene que definir políticas adicionales.
| Función | Sentencias de política de ejemplo |
|---|---|
| Reserva de capacidad | Allow any-user to use compute-capacity-reservations in compartment <compartment-name> where all { ... } |
| Cluster de recursos informáticos | Allow any-user to use compute-clusters in compartment <compartment-name> where all { ... } |
| Grupo de colocación de cluster | Allow any-user to use cluster-placement-groups in compartment <compartment-name> where all { ... } |
| Etiquetas definidas | Allow any-user to use tag-namespaces in compartment <compartment-name> where all { ... } |
Agregue solo las políticas necesarias para las funciones que active en OCINodeClass.
Activación del registro de nodos para nodos de trabajador iniciados por KPO
Los nodos de trabajador iniciados por KPO deben unirse al cluster. Otorgue CLUSTER_JOIN mediante un grupo dinámico para las instancias. Cree un grupo dinámico (con una regla que incluya las instancias informáticas que se van a agregar al cluster) y una política para el grupo dinámico (con una sentencia de política que permita a los miembros del grupo dinámico unirse al cluster).
-
Cree un nuevo grupo dinámico que contenga las instancias informáticas en el compartimento donde KPO inicia los nodos:
- Siga las instrucciones de Para crear un grupo dinámico en la documentación de IAM y asígneles un nombre al grupo dinámico nuevo (por ejemplo,
kpo-nodes-dyn-grp). -
Introduzca una regla que incluya las instancias informáticas en el compartimento con el formato:
ALL {instance.compartment.id = '<compartment-ocid>'}donde
<compartment-ocid>es el OCID del compartimento en el que KPO inicia nodos.Por ejemplo:
ALL {instance.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa23______smwa'} - Seleccione Crear.
- Siga las instrucciones de Para crear un grupo dinámico en la documentación de IAM y asígneles un nombre al grupo dinámico nuevo (por ejemplo,
- Cree una política para el grupo dinámico, con una sentencia de política para permitir que las instancias informáticas del grupo dinámico se unan al cluster:
- Siga las instrucciones de Para crear una política en la documentación de IAM y asignE un nombre a la política nueva (por ejemplo,
kpo-nodes-policy). -
Introduzca una sentencia de política para permitir que las instancias informáticas del grupo dinámico se unan al cluster, con el formato:
Allow dynamic-group <dynamic-group-name> to {CLUSTER_JOIN} in compartment <compartment-name>donde:
<dynamic-group-name>es el nombre del grupo dinámico que ha creado antes. Por ejemplo,kpo-nodes-dyn-grp. Tenga en cuenta que si un grupo dinámico no está en el dominio de identidad por defecto, agregue al nombre del grupo dinámico el nombre del dominio de identidad con el formatodynamic-group '<identity-domain-name>'/'<dynamic-group-name>'. También puede especificar el grupo dinámico mediante su OCID, con el formatodynamic-group id <dynamic-group-ocid>.<compartment-name>es el nombre del compartimento al que pertenece el cluster. Por ejemplo,oke-cluster-compartment
Por ejemplo:
Allow dynamic-group kpo-nodes-dyn-grp to {CLUSTER_JOIN} in compartment oke-cluster-compartmentSi considera que esta sentencia de política es demasiado permisiva, puede restringir los permisos para especificar explícitamente el cluster al que desea que se unan los nodos de trabajador iniciados por KPO, introduciendo una sentencia de política en el formato:
Allow dynamic-group <dynamic-group-name> to {CLUSTER_JOIN} in compartment <compartment-name> where { target.cluster.id = "<cluster-ocid>" } - Seleccione Crear para crear la nueva política.
- Siga las instrucciones de Para crear una política en la documentación de IAM y asignE un nombre a la política nueva (por ejemplo,
Creación de Recursos de OCINodeClass
Utilice OCINodeClass para definir la configuración de infraestructura de OCI para los nodos de trabajador aprovisionados por Karpenter. KPO aprovisiona los recursos informáticos y de red de OCI para esos nodos. Haga referencia a OCINodeClass desde Karpenter NodePool mediante nodeClassRef.
Para obtener más información sobre cada campo OCINodeClass y valor de estado, consulte Referencia de OCINodeClass.
Para crear un recurso OCINodeClass:
- Cree un archivo YAML que contenga un manifiesto
OCINodeClass. Por ejemplo:apiVersion: oci.oraclecloud.com/v1beta1 kind: OCINodeClass metadata: name: my-ocinodeclass spec: shapeConfigs: - ocpus: 2 memoryInGbs: 8 - ocpus: 4 memoryInGbs: 16 volumeConfig: bootVolumeConfig: imageConfig: imageType: OKEImage imageId: <OKE-Image-OCID> networkConfig: primaryVnicConfig: subnetConfig: subnetId: <Subnet-OCID> - Aplique el manifiesto introduciendo:
kubectl apply -f <ocinodeclass-file> - Compruebe el estado y las condiciones del nuevo recurso
OCINodeClassintroduciendo:kubectl describe ocinodeclass <name>
Creación de recursos de pool de nodos que hacen referencia a recursos de OCINodeClass
Cree uno o más recursos de Karpenter NodePool para definir la capacidad del nodo de trabajador que Karpenter puede aprovisionar, incluidos los requisitos de la unidad de instancia, los daños, la configuración de interrupciones y los límites de ampliación.
En cada NodePool, defina spec.template.spec.nodeClassRef para que haga referencia a un OCINodeClass para que Karpenter Provider for OCI pueda aplicar la configuración específica de OCI (como la selección de imágenes, la configuración del volumen de inicio y la configuración de VNIC) cuando aprovisione nodos. Cree recursos NodePool independientes cuando las cargas de trabajo necesiten diferentes reglas de programación o diferentes configuraciones OCINodeClass.
Para crear un recurso NodePool:
-
Cree un archivo YAML que contenga un manifiesto
NodePoolque haga referencia a unOCINodeClassmediantenodeClassRef. Por ejemplo:apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: my-nodepool spec: template: spec: expireAfter: Never nodeClassRef: group: oci.oraclecloud.com kind: OCINodeClass name: my-ocinodeclass requirements: - key: karpenter.sh/capacity-type operator: In values: - on-demand - key: oci.oraclecloud.com/instance-shape operator: In values: - VM.Standard.E5.Flex terminationGracePeriod: 120m disruption: budgets: - nodes: 5% consolidateAfter: 60m consolidationPolicy: WhenEmpty limits: cpu: 64 memory: 256Gi - Aplique el manifiesto introduciendo:
kubectl apply -f <nodepool-file> - Confirme que
NodePoolexiste introduciendo:kubectl get nodepools
Referencia de OCINodeClass
Utilice OCINodeClass para definir la configuración de infraestructura de OCI que KPO utiliza cuando aprovisiona recursos de OCI para nodos de trabajador aprovisionados por Karpenter. Haga referencia a OCINodeClass desde Karpenter NodePool mediante nodeClassRef.
Especificación de Clase de OCINode
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
volumeConfig | Configuración del volumen de inicio | Obligatorio | Consulte VolumeConfig. |
networkConfig | Subred de VNIC y NSG opcionales para la instancia informática | Obligatorio | Consulte NetworkConfig. |
shapeConfigs | Configuraciones de unidades adicionales para unidades flexibles y ampliables. Al omitir esto, se excluyen las unidades flexibles de la programación. | Opcional | Consulte ShapeConfig. |
nodeCompartmentId | Iniciar instancia en un compartimento diferente del cluster | Opcional | OCID de compartimento. |
capacityReservationConfigs | Matriz de reservas de capacidad | Opcional | Consulte CapacityReservationConfig. |
clusterPlacementGroupConfigs | Matriz de grupos de colocación de cluster (CPG). Solo se permite un CPG como máximo por dominio de disponibilidad | Opcional | Consulte ClusterPlacementGroupConfig. |
computeClusterConfig | Configuración de cluster de recursos informáticos. Inmutable después de creación | Opcional | Consulte ComputeClusterConfig. |
metadata | Datos de usuario (clave/valor) para la instancia informática | Opcional | { "foo": "bar" } |
freeformTags | Etiquetas de formato libre para aplicarlas a la instancia | Opcional | { "env": "prod" } |
definedTags | Etiquetas definidas que aplicar a la instancia | Opcional | { "Department": { "CostCenter": "42" } } |
kubeletConfig | Sustituciones de Kubelet | Opcional | Consulte KubeletConfig. |
postBootstrapInitScript | Secuencia de comandos Base64 que se ejecutará después de la inicialización de OKE | Opcional | Secuencia de comandos de shell Base64. |
preBootstrapInitScript | Secuencia de comandos Base64 que se debe ejecutar antes de la inicialización de OKE | Opcional | Secuencia de comandos de shell Base64. |
sshAuthorizedKeys | Lista de claves SSH públicas autorizadas | Opcional | [ "<ssh-public-key>" ] |
launchOptions | Opciones de inicio transferidas a la instancia informática | Opcional | Consulte LaunchOptions. |
Configuración de volumen
Utilice volumeConfig para controlar cómo KPO crea el volumen de inicio para cada nodo de trabajador.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
bootVolumeConfig | Configuración del volumen de inicio | Obligatorio | Consulte BootVolumeConfig. |
Configuración de volumen de inicio
Utilice bootVolumeConfig para seleccionar la imagen y configurar el tamaño y el rendimiento del volumen de inicio.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
imageConfig | Referencia a imágenes mediante OCID o filtro | Obligatorio | Consulte ImageConfig. |
sizeInGBs | Tamaño en GB (min 50) | Opcional | 50 |
vpusPerGB | Unidades de rendimiento de volúmenes (VPU) por GB | Opcional | 20 |
kmsKeyConfig | Referencia a una clave de KMS para cifrado | Opcional | Consulte KmsKeyConfig. |
pvEncryptionInTransit | Active el cifrado PV en tránsito. Valores aceptados: true o false. Valor por defecto: false | Opcional | true |
Configuración de imagen
Utilice imageConfig para seleccionar la imagen de OKE para los nodos de trabajador. Seleccione una imagen por OCID o por filtro. Para obtener más información sobre las imágenes de OKE, consulte Imágenes de OKE.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
imageType | Tipo de imagen | Obligatorio | Aceptado: OKEImage. |
imageFilter | Filtro para seleccionar imagen | Necesario si imageId está vacío | Consulte ImageSelectorTerm. |
imageId | OCID de imagen | Necesario si imageFilter está vacío | ocid1.image.oc1..xxxx |
Configuración de KmsKey
Utilice kmsKeyConfig para cifrar los volúmenes de inicio con su propia clave.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
kmsKeyId | OCID de clave de KMS | Opcional | ocid1.key.oc1..xxxx |
Término del selector de imágenes
Utilice ImageSelectorTerm para seleccionar una imagen por sistema operativo, versión, compartimento y etiquetas.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
osFilter | Filtro de nombre de sistema operativo | Opcional | Oracle Linux |
osVersionFilter | Filtro de versión de SO | Opcional | 8 |
compartmentId | OCID de compartimento de imagen | Opcional | ocid1.compartment... |
freeformTags | Coincidir con etiquetas de formato libre | Opcional | { "key": "val" } |
definedTags | Coincidencia de etiquetas definidas | Opcional | { "namespace": { "key": "val" } } |
Configuración de Red
Utilice networkConfig para colocar las VNIC del nodo de trabajador en las subredes correctas y conectar los NSG cuando sea necesario.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
primaryVnicConfig | Subred de VNIC principal y NSG | Obligatorio | Consulte PrimaryVnicConfig. |
secondaryVnicConfigs | Configuraciones de VNIC secundaria | Opcional | Consulte SecondaryVnicConfigs. |
Configuración de VNIC principal
Utilice primaryVnicConfig para definir la subred principal y los NSG opcionales para el nodo de trabajador.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
subnetConfig | Configuración de la subred | Obligatorio | Consulte SubnetConfig. |
networkSecurityGroupConfigs | Configuraciones de NSG | Opcional | Consulte NetworkSecurityGroupConfigs. |
assignIpV6Ip | Asignar dirección IP IPv6 | Opcional | false |
assignPublicIp | Asignar dirección IP pública | Opcional | false |
vnicDisplayname | Nombre mostrado de VNIC | Opcional | my-vnic |
ipv6AddressIpv6SubnetCidrPairDetails | Pares subred-CIDR y dirección IPv6 | Opcional | Consulte Ipv6AddressIpv6SubnetCidrPairDetails. |
skipSourceDestCheck | Omitir comprobación de origen/destino | Opcional | false |
securityAttributes | Asignación de atributos de seguridad | Opcional | { "s": "v" } |
Configuración de subred
Seleccione una subred por OCID o por selector.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
subnetId | OCID de subred | Necesario si subnetFilter está vacío | ocid1.subnet... |
subnetFilter | Selector de subred | Necesario si subnetId está vacío | Consulte OciResourceSelectorTerm. |
NetworkSecurityGroupConfigs
Seleccione un NSG por OCID o por selector.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
networkSecurityGroupId | NSG OCID | Necesario si networkSecurityGroupFilter está vacío | ocid1.networksecuritygroup... |
networkSecurityGroupFilter | Selector de NSG | Necesario si networkSecurityGroupId está vacío | Consulte OciResourceSelectorTerm. |
Ipv6DirecciónIpv6SubredCidrPairDetails
Utilice este campo cuando necesite controlar la asignación de CIDR de la subred IPv6.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
ipv6SubnetCidr | CIDR de subred IPv6 | Opcional | 2001:0db8::/64 |
OciResourceSelectorTerm
Utilice campos de selector cuando desee seleccionar una subred o NSG por nombre o por etiquetas, en lugar de por OCID.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
compartmentId | Compartimento de recursos | Opcional | ocid1.compartment... |
displayName | Nombre mostrado de coincidencia | Opcional | mysubnet |
freeformTags | Hacer coincidir etiquetas de formato libre | Opcional | { "key": "val" } |
definedTags | Coincidir con etiquetas definidas | Opcional | { "namespace": { "key": "val" } } |
Configuración de VNIC secundaria
Utilice secondaryVnicConfigs cuando el cluster utilice el complemento CNI nativo de IP de la VCN de OCI y necesite una VNIC secundaria para las direcciones IP de pod. Tiene todos los campos PrimaryVnicConfig y algunos campos adicionales.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
(Todos los campos de PrimaryVnicConfig) | (Igual que PrimaryVnicConfig) | (Varía) | (no aplicable) |
applicationResource | Identificador de aplicación | Opcional | blue |
ipCount | Máximo de IP por VNIC (valores de potencia de 2 entre 1 y 16, por lo que los valores permitidos son 1, 2, 4, 8 o 16). Consulte Cómo configurar VNIC secundarias | Opcional | 8 |
nicIndex | Índice de ranuras NIC para hosts con varias tarjetas | Opcional | 0 |
Configuración de unidades
Utilice shapeConfigs para definir el tamaño de las unidades flexibles y las configuraciones ampliables.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
ocpus | OCPU para unidades flexibles (mínimo de 1) | Obligatorio | 4 |
baselineOcpuUtilization | Ratio de utilización para unidades ampliables. Valores aceptados: BASELINE_1_8 , BASELINE_1_2 , BASELINE_1_1 | Opcional | BASELINE_1_8 |
memoryInGbs | Memoria para unidades flexibles (GB) | Opcional | 16 |
Configuración de CapacityReservation
Utilice capacityReservationConfigs cuando desee que los nodos de trabajador se ejecuten en la capacidad reservada en OCI.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
capacityReservationId | OCID de reserva | Necesario si capacityReservationFilter está vacío | ocid1.reservation... |
capacityReservationFilter | Filtro de reserva | Necesario si capacityReservationId está vacío | Consulte OciResourceSelectorTerm. |
ClusterPlacementGroupConfigs
Utilice clusterPlacementGroupConfigs cuando necesite que los nodos de trabajador se coloquen juntos para redes de baja latencia.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
clusterPlacementGroupId | OCID de grupo de colocación de cluster (CPG) | Necesario si clusterPlacementGroupFilter está vacío | ocid1.cpg... |
clusterPlacementGroupFilter | Filtro para grupo de colocación | Necesario si clusterPlacementGroupId está vacío | Consulte OciResourceSelectorTerm. |
Configuración de ComputeCluster
Utilice computeClusterConfig cuando desee que los nodos de trabajador se ejecuten en un cluster de recursos informáticos.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
computeClusterId | OCID de cluster informático | Necesario si computeClusterFilter está vacío | ocid1.cluster... |
computeClusterFilter | Filtro para cluster de recursos informáticos | Necesario si computeClusterId está vacío | Consulte OciResourceSelectorTerm. |
KubeletConfig
Utilice kubeletConfig para sustituir la configuración de kubelet en los nodos de trabajador aprovisionados por Karpenter. Karpenter Provider for OCI (KPO) aplica esta configuración durante el aprovisionamiento de nodos.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
clusterDNS | Lista de IP de DNS de cluster | Opcional | [ "10.0.0.10" ] |
extraArgs | Argumentos adicionales de Kubelet | Opcional | --fail-swap-on=false |
nodeLabels | Etiquetas de nodo de Kubelet | Opcional | { "role": "worker" } |
maxPods | Máximo de pods por instancia (mínimo 1) | Opcional | 110 |
podsPerCore | Pods por núcleo de CPU | Opcional | 20 |
systemReserved | Reservas de recursos del sistema | Opcional | { "cpu": "1" } |
kubeReserved | Reservas de componentes de Kubernetes | Opcional | { "cpu": "1" } |
evictionHard | Umbrales de expulsión estrictos | Opcional | { "memory.available": "200Mi" } |
evictionSoft | Umbrales de expulsión temporal | Opcional | { "memory.available": "500Mi" } |
evictionSoftGracePeriod | Períodos de gracia para el desalojo suave | Opcional | { "memory.available": "30s" } |
evictionMaxPodGracePeriod | Terminación controlada máxima de pod (segundos) | Opcional | 60 |
imageGCHighThresholdPercent | Porcentaje de uso de disco de agua alta que dispara la recopilación de elementos no utilizados de imágenes (GC) | Opcional | 85 |
imageGCLowThresholdPercent | Porcentaje de uso de disco de agua baja como destino para la recopilación de elementos no utilizados de imágenes (GC) | Opcional | 75 |
IniciarOpciones
Utilice launchOptions para definir las opciones de inicio de instancia.
| Campo | Descripción | Obligatorio | Ejemplo/Notas |
|---|---|---|---|
bootVolumeType | Tipo de volumen de inicio (ISCSI, SCSI, IDE, VFIO, PARAVIRTUALIZED) | Opcional | "ISCSI" |
remoteDataVolumeType | Tipo de volumen de datos remoto | Opcional | "PARAVIRTUALIZED" |
firmware | Firmware (BIOS o UEFI_64) | Opcional | "UEFI_64" |
networkType | Emulación NIC (VFIO, E1000, PARAVIRTUALIZED) | Opcional | "E1000" |
consistentVolumeNamingEnabled | Función de nomenclatura de volumen consistente | Opcional | false (el ejemplo muestra true). |
Estado de Clase de OCINode
Utilice los campos status para solucionar problemas de validación y configuración resuelta.
| Campo | Tipo | Descripción |
|---|---|---|
Conditions | []status.Condition | Condiciones de preparación, imagen y red. Puede incluir capacityReservation, clusterPlacementGroup, computeCluster |
Volume | Volume | Configuración y estado del volumen |
Network | Network | Configuración y estado de red |
CapacityReservations
| []CapacityReservation | Detalles de reserva de capacidad, si existen |
ClusterPlacementGroups | []ClusterPlacementGroup | Detalles de grupo de colocación de clusters, si están presentes |
ComputeCluster | ComputeCluster | Calcular detalles de cluster, si están presentes |
Programación, etiquetas y contaminantes
Etiquetas de programación
Utilice etiquetas de nodo en NodePool.spec.template.spec.requirements y en reglas de programación de carga de trabajo (por ejemplo, selectores de nodos y afinidad de nodos). Utiliza etiquetas estándar de Kubernetes y etiquetas específicas de OCI. KPO agrega etiquetas específicas de OCI a los nodos que aprovisiona.
| Etiqueta | Valor del ejemplo | Descripción |
|---|---|---|
topology.kubernetes.io/zone | Uocm:PHX-AD-1 | Dominio de disponibilidad |
node.kubernetes.io/instance-type | VM.Standard.B1.4 | Nombre de unidad de OCI. Para las unidades flexibles, utilice un nombre con el siguiente formato: donde |
kubernetes.io/os | linux | Valor del sistema operativo según lo definido por los valores GOOS (KnownOS) de la instancia |
kubernetes.io/arch | amd64 | Valor de arquitectura definido por los valores GOARCH (KnownArch) de Go en la instancia |
karpenter.sh/capacity-type | spot | Los tipos de capacidad incluyen reserved, spot y on-demand |
oci.oraclecloud.com/instance-shape | [ VM.Standard.E5.Flex, VM.Standard.E6.Flex ] | Etiqueta específica de OCI disponible en todas las unidades |
oci.oraclecloud.com/gpu-shape | true | Etiqueta específica de OCI disponible en todas las unidades de GPU |
oci.oraclecloud.com/baremetal-shape | true | Etiqueta específica de OCI disponible en todas las unidades con hardware dedicado |
oci.oraclecloud.com/denseio-shape | true | Etiqueta específica de OCI disponible en todas las unidades de E/S densas |
oci.oraclecloud.com/flex-shape | true | Etiqueta específica de OCI disponible en todas las unidades flexibles |
oci.oraclecloud.com/fault-domain |
FAULT-DOMAIN-1 |
Específico de OCI. Dominio de errores dentro del dominio de disponibilidad seleccionado. Utilice esta etiqueta para restringir la colocación en un dominio de errores específico, como FAULT-DOMAIN-1, FAULT-DOMAIN-2 o FAULT-DOMAIN-3 |
oci.oraclecloud.com/capacity-reservation-id | último segmento de OCID de reserva, incluido el último punto | Etiqueta específica de OCI para el ID de reserva de capacidad. Para ajustar el límite de 63 caracteres de las etiquetas de Kubernetes, elimine todos los caracteres antes del último punto del OCID de reserva de capacidad. |
Tolerancias y contaminantes necesarios
Utilice contaminantes y tolerancias para controlar dónde se ejecutan las cargas de trabajo. Configure los contaminantes en NodePool para que Karpenter ofrezca la capacidad correspondiente y, a continuación, configure las tolerancias en las cargas de trabajo que se deben ejecutar en esos nodos de trabajador.
Tenga en cuenta los siguientes escenarios especiales:
-
Nodos de trabajador preferentes (al contado):
Los nodos de trabajador iniciados como capacidad puntual utilizan el mantenimiento
oci.oraclecloud.com/oke-is-preemptible.Para utilizar la capacidad puntual:
-
Agregue la mancha a
NodePoolpara que Karpenter ofrezca formas puntuales. -
Agregue la tolerancia correspondiente a las cargas de trabajo que se deben ejecutar en nodos preferentes.
Ejemplo de mantenimiento de
NodePool:template: spec: taints: - effect: NoSchedule key: oci.oraclecloud.com/oke-is-preemptible value: presentSi
NodePoolno incluye el tinteoci.oraclecloud.com/oke-is-preemptible, Karpenter no ofrece formas preferentes. -
-
Nodos de trabajo de GPU:
Los nodos de trabajador iniciados con unidades de GPU utilizan contaminantes específicos del proveedor:
-
Unidades de GPU de NVIDIA:
nvidia.com/gpu -
Unidades de GPU AMD:
amd.com/gpu
Para utilizar unidades de GPU:
-
Agregue la pintura adecuada a
NodePoolpara que Karpenter ofrezca formas de GPU. -
Agregue la tolerancia correspondiente a las cargas de trabajo de GPU.
Ejemplo de mantenimiento de
NodePool(NVIDIA):template: spec: taints: - effect: NoSchedule key: nvidia.com/gpu value: presentSi el
NodePoolno incluye la pintura adecuada, Karpenter no ofrece las formas correspondientes. -
Validación del aprovisionamiento de nodos
Utilice los recursos personalizados de Karpenter y KPO para confirmar que Karpenter está creando recursos NodeClaim y que los nodos de trabajador se están uniendo al cluster.
- Confirme que los recursos
NodePoolyOCINodeClassexisten introduciendo:kubectl get nodepoolskubectl get ocinodeclasses - Confirme que Karpenter está creando recursos
NodeClaimintroduciendo:kubectl get nodeclaimskubectl describe nodeclaim <nodeclaim-name> - Confirme que los nodos se crean y etiquetan con el nombre del pool de nodos al que pertenecen.
- Muestre todos los nodos del cluster y el valor de la etiqueta
karpenter.sh/nodepoolpara cada nodo introduciendo:kubectl get nodes -L karpenter.sh/nodepool - Enumere solo los nodos que tienen la etiqueta
karpenter.sh/nodepoolintroduciendo:kubectl get nodes -l karpenter.sh/nodepool
- Muestre todos los nodos del cluster y el valor de la etiqueta
- Si los nodos no se unen al cluster, revise los logs y los pods del controlador de KPO introduciendo:
kubectl get pods --namespace <karpenter-namespace>kubectl logs --namespace <karpenter-namespace> <pod-name>
Ejemplos de NodePool y OCINodeClass
Utilice los siguientes ejemplos para crear recursos NodePool y OCINodeClass para escenarios comunes de aprovisionamiento de nodos de trabajador. En cada ejemplo se muestra cómo combinar la intención de programación de Karpenter en una NodePool con la configuración específica de OCI en una OCINodeClass:
- Ejemplo 1: Unidades flexibles con un OCID de imagen de OKE explícito
- Ejemplo 2: Selección de filtro de imagen con sustitución de deriva
- Ejemplo 3: VNIC secundaria para CNI nativo de IP de la VCN de OCI
Para obtener más información sobre la asignación de funciones comunes de OCI a los requisitos de NodePool o campos OCINodeClass, consulte Casos de uso adicionales.
Ejemplo 1: Unidades flexibles con un OCID de imagen de OKE explícito
Utilice este ejemplo cuando desee una NodePool que permita unidades flexibles específicas y desee una OCINodeClass que defina el tamaño de esas unidades flexibles y seleccione una imagen de OKE por OCID.
---
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: my-nodepool
spec:
template:
spec:
expireAfter: Never
nodeClassRef:
group: oci.oraclecloud.com
kind: OCINodeClass
name: my-ocinodeclass
requirements:
- key: karpenter.sh/capacity-type
operator: In
values:
- on-demand
- key: oci.oraclecloud.com/instance-shape #expand this list as needed
operator: In
values:
- VM.Standard.E3.Flex
- VM.Standard.E4.Flex
- VM.Standard.E5.Flex
terminationGracePeriod: 120m
disruption:
budgets:
- nodes: 5%
consolidateAfter: 60m
consolidationPolicy: WhenEmpty
limits:
cpu: 64
memory: 256Gi
---
apiVersion: oci.oraclecloud.com/v1beta1
kind: OCINodeClass
metadata:
name: my-ocinodeclass
spec:
shapeConfigs:
- ocpus: 2
memoryInGbs: 8
- ocpus: 4
memoryInGbs: 16
volumeConfig:
bootVolumeConfig:
imageConfig:
imageType: OKEImage
imageId: <OKE-Image-OCID>
networkConfig:
primaryVnicConfig:
subnetConfig:
subnetId: <Subnet-OCID>
Ejemplo 2: Selección de filtro de imagen con sustitución de deriva
Utilice este ejemplo cuando desee que KPO utilice un filtro para seleccionar una imagen automáticamente y desee que Karpenter sustituya los nodos de trabajador cuando se desvíen de la imagen seleccionada.
La imagen seleccionada depende de la versión de Kubernetes del cluster y de las imágenes de OKE disponibles. Cuando se actualiza el plano de control de cluster o se liberan nuevas imágenes de OKE, también cambiará la imagen de nodo de trabajador deseada. Los nodos lanzados con una imagen obsoleta se consideran "desplazados". Para minimizar la interrupción inesperada durante dichos eventos, le recomendamos que configure un presupuesto de interrupción adecuado en el pool de nodos de Karpenter, especificando los motivos, el porcentaje de interrupción y el programa (para obtener más información, consulte Disruption en la documentación de Karpenter).
---
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: my-nodepool
spec:
template:
spec:
expireAfter: Never
nodeClassRef:
group: oci.oraclecloud.com
kind: OCINodeClass
name: my-ocinodeclass
requirements:
- key: karpenter.sh/capacity-type
operator: In
values:
- on-demand
- key: oci.oraclecloud.com/instance-shape #expand this list as needed
operator: In
values:
- VM.Standard.E3.Flex
- VM.Standard.E4.Flex
- VM.Standard.E5.Flex
terminationGracePeriod: 120m
disruption:
budgets:
- nodes: 5%
reasons:
- Drifted
schedule: "@daily" #customize schedule for your own needs, following https://karpenter.sh/docs/concepts/disruption/#schedule
duration: 10m
consolidateAfter: 60m
consolidationPolicy: WhenEmpty
limits:
cpu: 64
memory: 256Gi
---
apiVersion: oci.oraclecloud.com/v1beta1
kind: OCINodeClass
metadata:
name: my-ocinodeclass
spec:
shapeConfigs:
- ocpus: 2
memoryInGbs: 8
- ocpus: 4
memoryInGbs: 16
volumeConfig:
bootVolumeConfig:
imageConfig:
imageType: OKEImage
imageFilter:
osFilter: "Oracle Linux"
osVersionFilter: "8"
networkConfig:
primaryVnicConfig:
subnetConfig:
subnetId: <Subnet-OCID>
Ejemplo 3: VNIC secundaria para CNI nativo de IP de la VCN de OCI
Utilice este ejemplo cuando el cluster utilice el complemento CNI nativo de IP de la VCN de OCI y los pods necesiten direcciones IP de una subred de VNIC secundaria. Configure secondaryVnicConfigs para asociar una VNIC secundaria y asignar capacidad de IP de pod.
---
apiVersion: oci.oraclecloud.com/v1beta1
kind: OCINodeClass
metadata:
name: my-ocinodeclass
spec:
shapeConfigs:
- ocpus: 2
memoryInGbs: 8
- ocpus: 4
memoryInGbs: 16
volumeConfig:
bootVolumeConfig:
imageConfig:
imageType: OKEImage
imageFilter:
osFilter: "Oracle Linux"
osVersionFilter: "8"
networkConfig:
primaryVnicConfig:
subnetConfig:
subnetId: <Subnet-OCID>
secondaryVnicConfigs:
- subnetConfig:
subnetId: <Subnet-OCID> #pod subnet
ipCount: 16
Casos de uso adicionales
Utilice la siguiente tabla para asignar funciones comunes de OCI a los requisitos de NodePool o a los campos OCINodeClass.
| Casos de uso | Qué configurar | Notas |
|---|---|---|
| Soporte de tipo de capacidad puntual | En NodePool, defina karpenter.sh/capacity-type en spot: |
KPO asigna el tipo de capacidad Karpenter Para obtener más información sobre el soporte, las ventajas y las limitaciones de las instancias preferentes, consulte Instancias preferentes. |
| Soporte de tipo de capacidad reservada | En OCINodeClass, configure capacityReservationConfigs: |
KPO asigna el tipo de capacidad reservada de Karpenter a las reservas de capacidad de OCI. Una reserva de capacidad de OCI es un recurso de nivel de dominio de disponibilidad que se puede configurar con varias configuraciones de reserva de instancia. Cada configuración especifica una unidad, valores de unidad opcionales y capacidad. Cuando se configura Para obtener más información sobre las reservas de capacidad, consulte Reservas de capacidad. |
| Soporte de instancias ampliables | En OCINodeClass.shapeConfigs, defina baselineOcpuUtilization: |
Las instancias ampliables están soportadas en unidades flexibles de OCI. Las instancias ampliables de OCI son instancias de máquina virtual (VM) que ofrecen un nivel base de rendimiento de CPU con la capacidad para ampliar a un nivel superior para soportar picos ocasionales en el uso. Para obtener más información sobre las instancias ampliables, consulte Instancias ampliables. |
| Soporte de grupo de colocación de clúster | En OCINodeClass, configure clusterPlacementGroupConfigs: |
Un grupo de colocación de cluster de OCI le permite crear recursos muy próximos entre sí para admitir casos de uso de redes de baja latencia. Un grupo de colocación de cluster es un recurso de nivel de dominio de disponibilidad y solo se permite un grupo de colocación de cluster por dominio de disponibilidad. Para obtener más información sobre los grupos de colocación de cluster, consulte Overview of Cluster Placement Groups. |
| Soporte de cluster de recursos informáticos | En OCINodeClass, configure computeClusterConfig: |
Un clúster de recursos informáticos es un grupo de instancias informáticos de alto rendimiento (HPC), GPU u optimizadas que están conectadas con una red de ancho a alta banda y latencia ultrabaja. Configure como máximo un cluster de recursos informáticos por Para obtener más información sobre los clusters de recursos informáticos, consulte Clusters de recursos informáticos. |
| Personalizar kubelet | En OCINodeClass, configure kubeletConfig. |
Utilice los campos KubeletConfig para controlar el comportamiento de kubelet a nivel de nodo. Si no se muestra un campo de configuración de kubelet para KubeletConfig, considere utilizar el campo extraArgs. |
| Personalizar instancia informática | En OCINodeClass, configure nodeCompartmentId, metadata, freeformTags, definedTags, sshAuthorizedKeys y launchOptions. |
Utilice los campos de instancia de OCI para controlar los metadatos, las etiquetas, el acceso SSH y el comportamiento de inicio. Para obtener más información sobre cómo configurar cada campo, consulte Creación de una instancia. |
|
Mantener la capacidad del nodo de trabajador estático |
En
|
La capacidad estática es una característica alfa y está desactivada de forma predeterminada. Utilícelo cuando desee que Karpenter mantenga un número fijo de nodos de trabajador, incluso cuando no haya pods pendientes. En el archivo de valores de Helm, active |
|
Influir en la programación con NodeOverlay |
En
|
NodeOverlay es una función alfa y está desactivada de forma predeterminada. Utilícelo para influir en las simulaciones de programación de Karpenter para pools de nodos o unidades de instancia seleccionados mediante la aplicación de una sustitución de precio, un ajuste de precio o una capacidad de recursos ampliados. En el archivo de valores de Helm, active |
Detección y limpieza de recursos
Puede identificar los recursos que crea Karpenter Provider for OCI (KPO). Cuando ya no necesite la capacidad, puede eliminar esos recursos. Realice las siguientes tareas:
- Identifique los nodos de trabajador y los recursos
NodeClaimque Karpenter crea para que pueda definir el ámbito de la capacidad que está auditando. Para obtener más información, consulte Identificación de nodos de trabajador gestionados por Karpenter. - Busque las instancias de OCI correspondientes mediante etiquetas aplicadas de KPO para poder verificar qué infraestructura está asociada a esa capacidad. Para obtener más información, consulte Identificación de instancias de OCI (y recursos relacionados) creadas para nodos de Karpenter.
- Cuando los recursos ya no sean necesarios y antes de suprimir un cluster, elimine la capacidad gestionada por Karpenter para que las instancias y los recursos asociados no sigan ejecutándose. Confirme que la terminación y la supresión se hayan completado correctamente y que no quede ningún recurso huérfano. Para obtener más información, consulte Limpieza de recursos.
Identificar nodos de trabajador gestionados por Karpenter
Karpenter aplica la etiqueta karpenter.sh/nodepool a los nodos que crea. Para mostrar los nodos creados por Karpenter y el recurso NodePool al que pertenece cada nodo, introduzca:
kubectl get nodes -L karpenter.sh/nodepoolPara averiguar si Karpenter está creando recursos NodeClaim o si los recursos NodeClaim están bloqueados por algún motivo (por ejemplo, si no se inicia, si no se registra o si se espera la capacidad), introduzca:
kubectl get nodeclaimskubectl describe nodeclaim <nodeclaim-name>
Identificar las instancias de OCI (y los recursos relacionados) creadas para los nodos de Karpenter
Utilice herramientas de búsqueda de OCI (como Resource Explorer) y las siguientes etiquetas de formato libre de OCI para buscar instancias y recursos relacionados que KPO ha creado:
-
karpenterNodepool -
orcl-containerengine/cluster-id(cuando proceda)
Para obtener más información sobre la localización de recursos de OCI, consulte Consulta de recursos.
Limpiar recursos
Antes de suprimir un cluster, elimine la capacidad gestionada por Karpenter para que las instancias no permanezcan en ejecución después de suprimir el cluster.
-
Suprima los recursos
NodePoolde Karpenter que crean capacidad mediantekubectl deletey el nombreNodePoolde la siguiente manera:- Enumere los recursos
NodePoolintroduciendo:kubectl get nodepools - Suprima un recurso
NodePoolintroduciendo:kubectl delete nodepool <nodepool-name> - (Opcional) Confirme que el recurso
NodePoolse ha suprimido introduciendo:kubectl get nodepools
- Enumere los recursos
-
Confirme que se han eliminado los recursos y nodos
NodeClaim.- Observe los recursos
NodeClaimhasta que se supriman introduciendo:kubectl get nodeclaims --watch - Observe los nodos creados para los pools de nodos de Karpenter hasta que se eliminan:
kubectl get nodes -l karpenter.sh/nodepool --watch - Si
NodeClaimno termina, compruebe su estado, condiciones y eventos introduciendo:kubectl describe nodeclaim <nodeclaim-name>
- Observe los recursos
-
Utilice la consola, la CLI o el SDK de OCI para confirmar que se han suprimido las instancias de OCI y los recursos asociados.
- Localice las instancias que KPO creó con la etiqueta de formato libre
karpenterNodepool(y la etiquetaorcl-containerengine/cluster-id, cuando corresponda). - Confirme que no hay tales instancias presentes o que se encuentran en un estado terminado y, a continuación, desaparecen.
- Confirme que no quedan asociaciones de VNIC para la instancia y que las VNIC que se crearon para la instancia ya no existen.
- Confirme que no quedan asociaciones de volumen para la instancia y que el volumen de inicio creado para la instancia se suprime (o se termina y, a continuación, se elimina).
Si alguno de los recursos permanece después de terminar la instancia, trátelos como posibles recursos huérfanos e investigue si:
- el controlador de KPO se está ejecutando y tiene permisos de IAM para limpiar los recursos
- hay finalizadores de supresión o errores en los logs del controlador de KPO
- Localice las instancias que KPO creó con la etiqueta de formato libre
Solución de problemas
Qué puede solucionar y dónde buscar
Cuando una carga de trabajo no se puede programar o un nodo de trabajador no se une al cluster, compruebe los recursos y los archivos log y las métricas, y aumente el registro, de la siguiente manera:
Utilice kubectl para comprobar los recursos de Kubernetes (consulte Comprobación de recursos de Kubernetes).
Utilice la consola, la CLI o el SDK de OCI para confirmar que KPO ha creado las instancias, las VNIC, los NSG y los volúmenes de inicio esperados para los nodos de trabajador.
Use kubectl para comprobar los logs del controlador de KPO (consulte Check KPO controller logs).
-
Aumentar el registro (consulte Activación del registro de depuración).
Comprobar recursos de Kubernetes
Utilice los comandos de kubectl para mostrar los recursos clave, de la siguiente manera:
kubectl get nodepoolskubectl get ocinodeclasseskubectl get nodeclaimskubectl get nodes -l karpenter.sh/nodepoolUtilice los comandos de kubectl para revisar los detalles y las condiciones, de la siguiente manera:
kubectl describe ocinodeclass <name>kubectl describe nodeclaim <name>Comprobar logs de controlador de KPO
Utilice los comandos de kubectl para revisar el estado de los pods de KPO y los logs, de la siguiente manera:
kubectl get pods --namespace <karpenter-namespace>kubectl logs --namespace <karpenter-namespace> <pod-name>Activar Registro de Depuración
Aumente el registro temporalmente cuando necesite más detalles en la salida del controlador KPO, de una o ambas de las siguientes maneras:
-
Defina
logLevel: debugen el archivo de valores de Helm y actualice el despliegue de KPO (consulte Cómo Cambiar y Volver a Aplicar Valores de Helm para Actualizar el Despliegue de KPO). Por defecto, el registro está en el nivelinfo. -
Defina
OCI_GO_SDK_DEBUG=1como una variable de entorno en el despliegue de KPO para activar el registro de depuración del SDK de OCI Go.
Preguntas frecuentes sobre KPO
¿Se aplican las manchas especiales agregadas por el bootstrapping de OKE a los nodos gestionados por Karpenter?
Sí. Algunos tipos de nodos de trabajador requieren daños específicos. Configure las manchas en NodePool para que Karpenter ofrezca la capacidad correspondiente. A continuación, configure tolerancias en cargas de trabajo que se deben ejecutar en esos nodos de trabajador.
Para obtener más información sobre los contaminantes especiales, consulte Required Taints and Tolerations.
¿Cómo se configuran las VNIC secundarias?
Cuando un cluster utiliza el complemento CNI nativo de IP de la VCN de OCI, puede conectar VNIC secundarias a nodos de trabajador para que los pod reciban direcciones IP enrutables de la VCN de la subred de pod. Planifique cuidadosamente la capacidad de la subred para que no agote las direcciones disponibles.
Si el cluster utiliza el complemento CNI nativo de IP de la VCN de OCI, el complemento debe tener la versión 3.0.0 o posterior. Recomendamos encarecidamente el uso de la versión 3.2.0 o posterior. En el complemento CNI nativo de IP de la VCN de OCI versión 3.2.0 (y posterior), las VNIC secundarias admiten un máximo de 256 direcciones IP. Si el cluster utiliza una versión del complemento anterior a la versión 3.2.0, las VNIC secundarias admiten un máximo de 16 direcciones IP. Si el cluster tiene que utilizar una versión del complemento anterior a la versión 3.2.0, debe definir explícitamente ipCount en un valor no mayor que 16.
Además del número máximo de direcciones IP admitidas, las VNIC secundarias están sujetas a las siguientes restricciones:
-
La cantidad de direcciones IP asignadas debe ser una potencia de dos, por lo que configure
ipCountcon una potencia de dos. -
Para las VNIC secundarias de solo IPv6 (pila única), solo se admiten 1, 16 o 256 direcciones IP asignadas, de modo que establezca
ipCounten 1, 16 o 256. -
El total agregado de todas las direcciones IP asignadas en todas las VNIC secundarias de un nodo no debe superar los 256.
- Si
ipCountno está definido para una VNIC secundaria, se define por defecto en 32 para clusters IPv4 y clusters de doble pila IPv6, y en 256 para clusters de pila única IPv6.
Tenga en cuenta las siguientes recomendaciones y directrices:
- Recomendamos configurar dos bloques CIDR para la subred de pod que utilizan las VNIC secundarias.
- Si la subred de pod utilizada por las VNIC secundarias tiene un único bloque CIDR, asegúrese de que la subred tenga un número suficiente de direcciones IP contiguas para alojar el número necesario de asignaciones de IP.
¿Cómo programa las cargas de trabajo en un pool de nodos de Karpenter específico?
Para forzar cargas de trabajo en un pool de nodos Karpenter específico, dirija la etiqueta del pool de nodos karpenter.sh/nodepool. Utilice la afinidad de nodos o un selector de nodos, según lo estricto que desee que sea la ubicación.
-
Ejemplo de afinidad de nodos:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: karpenter.sh/nodepool operator: In values: - <nodepool-name>Para obtener más información sobre la afinidad de nodos, consulte Afinidad de nodos en la documentación de Kubernetes.
-
Ejemplo de selector de nodos:
nodeSelector: karpenter.sh/nodepool: <nodepool-name>Para obtener más información sobre los selectores de nodos, consulte nodeSelector en la documentación de Kubernetes.
¿Cómo distribuye las cargas de trabajo entre los dominios de disponibilidad y los dominios de errores con Karpenter Provider for OCI?
Karpenter Provider for OCI (KPO) respeta el nivel de pod topologySpreadConstraints cuando topologyKey coincide con una etiqueta de programación que soporta KPO. Normalmente, utilizará estas claves de topología con mayor frecuencia en OCI:
topology.kubernetes.io/zonepara distribuirlo entre dominios de disponibilidad (AD)oci.oraclecloud.com/fault-domainpara distribuir entre dominios de errores (FD) en un dominio de disponibilidad
Para distribuir la capacidad aprovisionada por Karpenter, dirija el pool de nodos deseado mediante la etiqueta karpenter.sh/nodepool y asegúrese de que el NodePool seleccionado permite los AD o FD que desea que utilice el programador. Si define whenUnsatisfiable en DoNotSchedule, los pods que no pueden cumplir la restricción de distribución permanecen pendientes, lo que da a Karpenter la oportunidad de aprovisionar nodos que cumplan el requisito de distribución:
Recomendamos las siguientes prácticas:
- Defina
replicasen un valor igual o mayor que el número de dominios de topología que desea utilizar. - Utilice la expansión de AD cuando la carga de trabajo deba permanecer disponible en varios AD.
- Utilice la difusión de FD en una región de un solo AD.
- Asegúrese de que los requisitos de
NodePoolincluyen todos los valores de topología que utilizatopologySpreadConstraints.
Ejemplo: configuración de NodePool para permitir tres AD
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: example-ad-nodepool
spec:
template:
spec:
requirements:
- key: topology.kubernetes.io/zone
operator: In
values:
- <AVAILABILITY_DOMAIN_1>
- <AVAILABILITY_DOMAIN_2>
- <AVAILABILITY_DOMAIN_3>
Ejemplo: Distribuya un Deployment en los tres dominios de disponibilidad
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-ad-spread
spec:
replicas: 3
selector:
matchLabels:
app: example-ad-spread
template:
metadata:
labels:
app: example-ad-spread
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: karpenter.sh/nodepool
operator: In
values:
- example-ad-nodepool
topologySpreadConstraints:
- maxSkew: 1
minDomains: 3
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: example-ad-spread
matchLabelKeys:
- pod-template-hash
nodeAffinityPolicy: Honor
nodeTaintsPolicy: Honor
containers:
- name: app
image: registry.k8s.io/pause:3.9
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "1"
Ejemplo: configuración de NodePool para permitir tres FD en un único AD
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: example-fd-nodepool
spec:
template:
spec:
requirements:
- key: topology.kubernetes.io/zone
operator: In
values:
- <AVAILABILITY_DOMAIN>
- key: oci.oraclecloud.com/fault-domain
operator: In
values:
- FAULT-DOMAIN-1
- FAULT-DOMAIN-2
- FAULT-DOMAIN-3
Ejemplo: distribuya un Deployment entre esos tres documentos financieros
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-fd-spread
spec:
replicas: 3
selector:
matchLabels:
app: example-fd-spread
template:
metadata:
labels:
app: example-fd-spread
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: karpenter.sh/nodepool
operator: In
values:
- example-fd-nodepool
topologySpreadConstraints:
- maxSkew: 1
minDomains: 3
topologyKey: oci.oraclecloud.com/fault-domain
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: example-fd-spread
matchLabelKeys:
- pod-template-hash
nodeAffinityPolicy: Honor
nodeTaintsPolicy: Honor
containers:
- name: app
image: registry.k8s.io/pause:3.9
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "1"
Notas
- Utilice
whenUnsatisfiable: DoNotSchedulecuando desee que Karpenter aprovisione capacidad que satisfaga la restricción de distribución. - Asegúrese de que
labelSelectorcoincida con las etiquetas de pod. Si no coincide, el programador no calcula el sesgo para el conjunto de pod previsto. - Para obtener más información sobre las etiquetas de programación admitidas, consulte Programación, Etiquetas y Manchas.
¿Cómo enumera las imágenes de OKE compatibles para un cluster?
Utilice la CLI de OCI para recuperar las opciones del pool de nodos y filtrar los orígenes de imagen devueltos. Este enfoque permite identificar los OCID de imagen que son compatibles con la versión de Kubernetes del cluster.
-
Definir variables de entorno que especifiquen la región y el OCID del cluster, y que definan filtros para la versión de Kubernetes, la versión principal del sistema operativo y cualquier arquitectura o tipo de imagen que excluir:
REGION="<region>" CLUSTER_OCID="<cluster-ocid>" OKE_VERSION="<kubernetes-version>" OS_MAJOR="<os-major-version>" EXCLUDE_PATTERN="<architecture-pattern>"donde:
<cluster-ocid>es el OCID del cluster.<kubernetes-version>es la cadena de versión secundaria de Kubernetes que debe coincidir en el nombre de origen de imagen (por ejemplo,1.31).<os-major-version>es la versión principal del sistema operativo que debe coincidir en el nombre del origen de imagen (por ejemplo,8para Oracle Linux 8). Defina esta opción en una cadena vacía para evitar el filtrado por versión del sistema operativo.<architecture-pattern>es un patrón de expresión regular que se utiliza para excluir nombres de origen de imagen (por ejemplo,aarch64|arm64|GPUpara excluir imágenes de ARM o GPU). Establezca esta opción en una cadena vacía para evitar exclusiones.
Por ejemplo:
REGION="us-phoenix-1" CLUSTER_OCID="ocid1.cluster.oc1.phx.aaaaaaaa______w5q" OKE_VERSION="1.31" OS_MAJOR="8" EXCLUDE_PATTERN="aarch64|arm64|GPU" -
Ejecute el siguiente comando de la CLI de OCI para obtener los OCID de las imágenes compatibles:
oci ce node-pool-options get --region "${REGION}" --node-pool-option-id "${CLUSTER_OCID}" --output json | jq -r --arg ver "${OKE_VERSION:-}" --arg os "${OS_MAJOR:-}" --arg ex "${EXCLUDE_PATTERN:-}" '.data.sources[] | . as $src | ($src["source-name"] // "") as $name | select( ($ver == "" or ($name | test($ver))) and ($os == "" or ($name | test($os; "i"))) and ($ex == "" or ($name | test($ex; "i") | not)) ) | {id: $src["image-id"], source_name: $name}'
Qué hacer si no se aprovisiona un pool de nodos de unidad flexible y se ve: "omitiendo, los requisitos del pool de nodos filtran todos los tipos de instancias".
Las formas flexibles requieren una configuración de tamaño para que KPO pueda traducir los requisitos de forma en una oferta de concreto. Para solucionarlo, defina shapeConfigs en el OCINodeClass al que se hace referencia o defina los valores por defecto en el archivo de valores de Helm en settings.flexibleShapeConfigs.
-
Ejemplo: definición de
shapeConfigsen elOCINodeClassal que se hace referencia:apiVersion: oci.oraclecloud.com/v1beta1 kind: OCINodeClass metadata: name: example-nodeclass spec: shapeConfigs: - ocpus: 2 memoryInGbs: 16 baselineOcpuUtilization: BASELINE_1_2 ... -
Ejemplo: definición global de los valores
shapeConfigspor defecto en el archivo de valores de Helm:settings: flexibleShapeConfigs: ocpus: 2 memoryInGbs: 16Puede sustituir un valor por defecto en el archivo de valores de Helm definiendo
shapeConfigsenOCINodeClass.
Si utiliza una reserva de capacidad y se enfrenta a este problema, confirme que flexibleShapeConfigs en el archivo de valores de Helm (o shapeConfigs en OCINodeClass, si está presente) coincide exactamente con la reserva, con los mismos valores para ocpus, memoryInGbs y baselineOcpuUtilization.
¿Cómo se ejecuta el controlador KPO con el registro de depuración?
Aumente la salida del log para solucionar problemas de aprovisionamiento y llamadas de API de OCI de una o ambas formas:
-
Defina
logLevel: debugen el archivo de valores de Helm y actualice el despliegue de KPO (consulte Cómo Cambiar y Volver a Aplicar Valores de Helm para Actualizar el Despliegue de KPO). -
Defina
OCI_GO_SDK_DEBUG=1como una variable de entorno en el despliegue de KPO para activar el registro de depuración del SDK de OCI Go.
¿Cómo puede transferir un script cloud-init personalizado?
Puede ejecutar comandos o configuraciones específicos durante el proceso de inicio de un nodo mediante la inyección de scripts cloud-init personalizados mediante el recurso OCINodeClass.
Pruebe minuciosamente los scripts cloud-init personalizados antes de desplegarlos, para asegurarse de que los scripts se ejecutan como se esperaba y no interfieran con el proceso de inicialización de nodos estándar.
Hay dos métodos principales:
-
Opción 1: utilice
preBootstrapInitScriptypostBootstrapInitScriptenOCINodeClass(recomendado)Puede ejecutar scripts personalizados antes y después del script cloud-init por defecto mediante
preBootstrapInitScriptypostBootstrapInitScriptenOCINodeClasspara especificar los scripts personalizados, de la siguiente forma:- Prepare los scripts personalizados de cloud-init:
- Cree las secuencias de comandos que desee ejecutar antes y después de la inicialización de nodos por defecto.
- Codifique cada script con Base64.
-
Agregue los scripts codificados en base64 a los campos
preBootstrapInitScripty/opostBootstrapInitScriptdel recursoOCINodeClass.Por ejemplo:
apiVersion: oci.oraclecloud.com/v1beta1 kind: OCINodeClass metadata: name: example-nodeclass spec: ... preBootstrapInitScript: "IyEvYmluL2Jhc2gKZWNobyAiSSBhbSBhIHByZSBib290c3RyYXAgc2NyaXB0Ig==" postBootstrapInitScript: "IyEvYmluL2Jhc2gKZWNobyAiSSBhbSBhIHBvc3QgYm9vdHN0cmFwIHNjcmlwdCI="
- Prepare los scripts personalizados de cloud-init:
-
Opción 2: especifique un script cloud-init completo codificado en base64 en
metadata.user_data(flujo de trabajo avanzado)Puede proporcionar un script cloud-init personalizado completo definiendo el campo
user_dataen la secciónmetadatadeOCINodeClass. Este método le proporciona un control total del proceso de inicialización, pero requiere una gestión cuidadosa para garantizar la compatibilidad con Kubernetes Engine.-
Prepare el script cloud-init personalizado:
- Cree el script cloud-init personalizado e incluya las configuraciones personalizadas y los comandos necesarios que unen el nodo al cluster.
En el siguiente ejemplo, se leen los valores de configuración del servicio de metadatos de instancia (IMDS) de OCI, que solo está disponible desde la instancia y, a continuación, se ejecutan los comandos que unen el nodo al cluster.
#!/usr/bin/env bash set -o errexit set -o nounset set -o pipefail # OCI Instance Metadata Service (IMDS): link-local, reachable only from within the instance. # Do not use IMDS URLs with untrusted input (SSRF risk). MD_URL="http://169.254.169.254/opc/v2/instance/metadata" AUTH_HDR="Authorization: Bearer Oracle" # Fetch a metadata key, returning empty on error/missing fetch_md() { local key="$1" curl -sfL --noproxy '*' -H "${AUTH_HDR}" --connect-timeout 2 --max-time 5 "${MD_URL}/${key}" 2>/dev/null || true } CLUSTER_DNS="$(fetch_md kubedns_svc_ip)" KUBELET_EXTRA_ARGS="$(fetch_md kubelet-extra-args)" APISERVER_ENDPOINT="$(fetch_md apiserver_host)" KUBELET_CA_CERT="$(fetch_md cluster_ca_cert)" # Export only when present to avoid surprising consumers with empty values [ -n "${CLUSTER_DNS}" ] && export CLUSTER_DNS [ -n "${KUBELET_EXTRA_ARGS}" ] && export KUBELET_EXTRA_ARGS [ -n "${APISERVER_ENDPOINT}" ] && export APISERVER_ENDPOINT [ -n "${KUBELET_CA_CERT}" ] && export KUBELET_CA_CERT # BEGIN OF CUSTOM SCRIPT BOOTSTRAP SCRIPT , REPLACE THIS SECTION WITH CUSTOM PRE BOOTSTRAP SCRIPT #echo "pre bootstrap script" #echo "CLUSTER_DNS: ${CLUSTER_DNS:-}" #echo "KUBELET_EXTRA_ARGS: ${KUBELET_EXTRA_ARGS:-}" #echo "APISERVER_ENDPOINT: ${APISERVER_ENDPOINT:-}" #echo "KUBELET_CA_CERT: ${KUBELET_CA_CERT:-}" # END OF CUSTOM SCRIPT BOOTSTRAP SCRIPT bash /etc/oke/oke-install.sh # BEGIN OF POST BOOTSTRAP SCRIPT, IF NEEDED #echo "post bootstrap script" #END OF POST BOOTSTRAP SCRIPTSi utiliza este ejemplo, solo inserte la lógica personalizada:
-
entre
# BEGIN OF CUSTOM SCRIPT BOOTSTRAP SCRIPT , REPLACE THIS SECTION WITH CUSTOM PRE BOOTSTRAP SCRIPTy# END OF CUSTOM SCRIPT BOOTSTRAP SCRIPT -
entre
# BEGIN OF POST BOOTSTRAP SCRIPT, IF NEEDEDy#END OF POST BOOTSTRAP SCRIPT
Tenga en cuenta que los parámetros necesarios para los nodos de inicialización están disponibles en el servicio de metadatos de instancia (IMDS). Al crear un script personalizado, recomendamos definir las variables de entorno
CLUSTER_DNS,KUBELET_EXTRA_ARGS,APISERVER_ENDPOINTyKUBELET_CA_CERTrecuperando sus valores de IMDS, como se muestra en el script de ejemplo. La configuración de estas variables como se muestra es esencial para el correcto funcionamiento de KPO. -
- Codifique el script en Base64.
- Cree el script cloud-init personalizado e incluya las configuraciones personalizadas y los comandos necesarios que unen el nodo al cluster.
-
Agregue el script codificado en base64 al campo
user_datade la secciónmetadatadeOCINodeClass.Por ejemplo:
apiVersion: oci.oraclecloud.com/v1beta1 kind: OCINodeClass metadata: name: example-nodeclass spec: metadata: user_data: "IyEvdXNyL2Jpbi9lbnYgYmFzaAoKc2V0IC1vIGVycmV4aXQKc2V0IC1vIG5vdW5zZXQKc2V0IC1vIHBpcGVmYWlsCg==" ...
-
¿Qué debe considerar para KubeletConfig maxPods y podsPerCore?
Utilice kubeletConfig para controlar la densidad de pod de los nodos de trabajador y mantenerla alineada con la capacidad de red.
Defina
podsPerCoreen un valor que no superemaxPods.Para los clusters que utilizan el complemento CNI nativo de IP de la VCN de OCI, defina
maxPodsen un valor inferior a la suma agregada de valoresipCounten las VNIC secundarias.
¿Cómo configura el OCID del compartimento de imagen predefinido de OKE en Karpenter Provider for OCI (KPO)?
Si desea que KPO utilice una imagen personalizada basada en una imagen de OKE (mediante la definición de imageType: OKEImage) y la imagen se encuentra en un compartimento diferente, puede activar KPO para detectar la imagen mediante el valor de Helm preBakedImageCompartmentId o el valor imageFilter de OCINodeClass.
Si solo utiliza imágenes de OKE publicadas por Oracle o hace referencia a imágenes directamente por OCID (imageId), esta configuración no es necesaria.
Requisitos previos
-
Conoce el OCID del compartimento que contiene las imágenes que desea que detecte KPO.
- Existe una política adecuada para permitir que el controlador de KPO lea imágenes en el compartimento diferente. Por ejemplo:
Allow any-user to read instance-images in compartment <compartment-name> where all { ...workload identity conditions... }
Opción 1: Configurar el compartimento para todos los recursos de OCINodeClass (mediante un valor de Helm)
-
Defina el valor de Helm
preBakedImageCompartmentId:settings: preBakedImageCompartmentId: "<compartment-ocid-containing-images>" -
Aplique la configuración actualizada ejecutando
helm upgradepara el despliegue de KPO (consulte Cómo Cambiar y Volver a Aplicar Valores de Helm para Actualizar el Despliegue de KPO).
Opción 2: Configurar el compartimento para un OCINodeClass específico (mediante imageFilter)
Defina compartmentId en imageFilter:
volumeConfig:
bootVolumeConfig:
imageConfig:
imageType: OKEImage
imageFilter:
compartmentId: "<compartment-ocid-containing-images>"
osFilter: "Oracle Linux"
osVersionFilter: "8"
Imágenes personalizadas basadas en imágenes de OKE (requisito de k8s_version)
Cuando utilice una imagen personalizada basada en una imagen de OKE, asegúrese de que la imagen tenga una u otra de las siguientes opciones:
- una etiqueta de formato libre
k8s_version - un valor
BaseImageIdque apunta (directa o indirectamente) a una imagen de OKE ascendiente que tiene la etiquetak8s_version
Si no hay ninguno, KPO no puede determinar la versión de Kubernetes para la imagen y la selección de imágenes puede fallar con un error missing k8s_version tag.
¿Cómo cambia y vuelve a aplicar los valores de Helm para actualizar el despliegue de KPO?
Para cambiar los valores de Helm después de la instalación, actualice el archivo de valores de Helm y, a continuación, aplique la nueva configuración.
-
Actualice el archivo de valores de Helm (por ejemplo, agregue o cambie
logLevel: debug). -
Descargue el último índice para el repositorio
karpenter-provider-ociintroduciendo:helm repo update karpenter-provider-oci - Aplique la configuración actualizada introduciendo:
helm upgrade karpenter karpenter-provider-oci/karpenter \ --version <chart-version> \ --namespace <karpenter-namespace> \ --values <path-to-helm-values-file> - Confirme que se haya aplicado la configuración actualizada y que los pods del controlador de KPO se reinicien correctamente:
kubectl get pods --namespace <karpenter-namespace>