Ajuste del rendimiento
Si tiene requisitos de optimización de rendimiento específicos, puede cambiar los valores predeterminados para algunos componentes de clúster en IBM Cloud® Kubernetes Service.
Si decide cambiar los valores predeterminados, lo hace por su cuenta y riesgo. Usted es el responsable de ejecutar pruebas en cualquier configuración modificada y de cualquier interrupción potencial ocasionada por los valores modificados en el entorno.
Valores predeterminados del nodo trabajador
Por defecto, los nodos de trabajo tienen el sistema operativo y el hardware informático del tipo de nodo de trabajo que elijas al crear el grupo de trabajadores.
Personalización del sistema operativo
Puede encontrar una lista de sistemas operativos soportados por versión de clúster en la información de versión deKubernetes. El clúster no puede mezclar sistemas operativos ni utilizar sistemas operativos diferentes.
Para optimizar los nodos trabajadores, tenga en cuenta la siguiente información.
- Actualizaciones de imagen y versión: las actualizaciones de nodos trabajadores, como los parches de seguridad para la imagen o versiones de Kubernetes los proporciona IBM. Sin embargo, debe elegir cuándo aplicar las actualizaciones a los nodos trabajadores. Para obtener más información, consulte Actualización de clústeres, nodos trabajadores y componentes de clúster.
- Modificaciones temporales: si inicia una sesión en un pod o si utiliza algún otro proceso para modificar un valor de nodo trabajador, las modificaciones son temporales. Las operaciones del ciclo de vida del nodo trabajador, como la recuperación automática, la recarga, la actualización o la sustitución de un nodo trabajador, cambian las modificaciones a los valores predeterminados.
- Modificaciones persistentes: Para que las modificaciones persistan a lo largo de las operaciones del ciclo de vida del nodo trabajador, crea un conjunto de demonios que utilice un contenedor
init. Para obtener más información, consulte Modificación de los valores predeterminados del nodo trabajador para optimizar el rendimiento.
No se da soporte a las modificaciones en el sistema operativo. Si modifica los valores predeterminados, es responsable de depurar y resolver los problemas que se pueden producir.
Cambios en el hardware
Para cambiar el hardware de cálculo, como por ejemplo la CPU y la memoria por nodo trabajador, elija entre las opciones siguientes.
- Cree una agrupación de nodos trabajadores. Las instrucciones varían en función del tipo de infraestructura del clúster, como clásica, VPC o Satellite. Para obtener más información, consulte Adición de nodos trabajadores a clústeres clásicos o Adición de nodos trabajadores a clústeres de VPC.
- Actualice el tipo en el clúster creando una agrupación de nodos trabajadores y eliminando la agrupación de nodos trabajadores anterior.
Modificación de la configuración del núcleo del nodo trabajador para optimizar el rendimiento
Los nodos trabajadores de clúster se configuran para un nivel de estabilidad, optimización y rendimiento que se espera que satisfaga las necesidades de la mayoría de cargas de trabajo. Normalmente, no se recomienda cambiar los valores del kernel del nodo trabajador, ya que estos cambios pueden crear problemas inusuales y no deseados. Sin embargo, si la carga de trabajo tiene requisitos de optimización de rendimiento muy exclusivos que requieren cambios en los valores del kernel, se puede aplicar un daemonset Kubernetes personalizado para cambiar la configuración del kernel. Comprenda que estos cambios pueden tener consecuencias negativas significativas y que implementa cambios en la configuración de valores del kernel bajo su propia responsabilidad.
Si cambia la configuración de la configuración del núcleo, asegúrese de documentar y guardar los cambios exactos que realice. Si abre una incidencia de soporte para cualquier problema relacionado con el clúster, debe especificar estos cambios. Estos cambios de configuración pueden ser responsables del problema y es posible que se le solicite que revierta los cambios como parte de la investigación del problema. En este caso, usted es responsable de revertir cualquier cambio de configuración del kernel que implemente.
Cambiar los valores predeterminados del kernel puede tener efectos negativos en el clúster. Realice estos cambios bajo su propio riesgo.
Puede cambiar los valores de kernel predeterminados aplicando un Kubernetes DaemonSet personalizado con un Contenedor de init al clúster. El conjunto de daemons modifica los valores de todos los nodos trabajadores existentes y aplica los valores a los nuevos nodos trabajadores que se suministran
en el clúster. El contenedor init se asegura de que estas modificaciones se produzcan antes de que se programen otros pods en el nodo trabajador. Los pods no se ven afectados.
Debe tener el rol de acceso al servicio Manager IBM Cloud IAM para todos los espacios de nombres para ejecutar el ejemplo privilegiado initContainer.
Después de inicializar los contenedores para los despliegues, se descartarán los privilegios.
Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
- Guarde el siguiente conjunto de daemons en un archivo denominado
worker-node-kernel-settings.yaml. En la secciónspec.template.spec.initContainers, añada los campos y valores de los parámetros desysctlque desea ajustar. Este conjunto de daemons de ejemplo cambia el número máximo predeterminado de conexiones permitidas en el entorno mediante el valornet.core.somaxconny el rango de puertos efímeros mediante el valornet.ipv4.ip_local_port_range.apiVersion: apps/v1 kind: DaemonSet metadata: name: kernel-optimization namespace: kube-system labels: tier: management app: kernel-optimization spec: selector: matchLabels: name: kernel-optimization template: metadata: labels: name: kernel-optimization spec: hostNetwork: true hostPID: true hostIPC: true initContainers: - command: - sh - -c - sysctl -w net.ipv4.tcp_syn_retries="5"; sysctl -w net.ipv4.tcp_fin_timeout="15"; image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: Always name: sysctl resources: {} securityContext: privileged: true capabilities: add: - NET_ADMIN volumeMounts: - name: modifysys mountPath: /sys containers: - resources: requests: cpu: 0.01 image: us.icr.io/armada-master/network-alpine:latest name: sleepforever command: ["/bin/sh", "-c"] args: - > while true; do sleep 100000; done volumes: - name: modifysys hostPath: path: /sys - Aplique el conjunto de daemons a los nodos trabajadores. Los cambios se aplican inmediatamente.
kubectl apply -f worker-node-kernel-settings.yaml
Para revertir los parámetros de sus nodos de trabajo sysctl a los valores por defecto, siga estos pasos.
- Suprima el conjunto de daemons. Se eliminan los
initContainersque han aplicado los valores personalizados.kubectl delete ds kernel-optimization - Rearranque todos los nodos trabajadores del clúster. Los nodos trabajadores vuelven a estar en línea con los valores predeterminados aplicados.
Optimización del rendimiento de pod
Si tiene demandas de carga de trabajo de rendimiento específicas, puede cambiar los valores predeterminados para los parámetros sysctl del kernel de Linux en los espacios de nombres de red de pod.
Para optimizar la configuración del kernel para los pods de aplicaciones, puede insertar un parche initContainer en el YAML de pod/ds/rs/deployment para cada despliegue. El initContainer se añade a cada despliegue de app que se encuentra en el espacio de nombres de red de pod para el que desea optimizar el rendimiento.
Antes de empezar, asegúrese de que dispone de la función de acceso al servicio IAM Manager IBM Cloud para todos los espacios de nombres en los que se
ejecutará el ejemplo de initContainer con privilegios. Después de inicializar los contenedores para los despliegues, se descartarán los privilegios.
- Guarde el siguiente parche de
initContaineren un archivo denominadopod-patch.yamly añada los campos y los valores de los parámetros desysctlque desea ajustar. EsteinitContainerde ejemplo cambia el número máximo predeterminado de conexiones permitidas en el entorno mediante el valornet.core.somaxconny el rango de puertos efímeros a través del valornet.ipv4.ip_local_port_range.spec: template: spec: initContainers: - command: - sh - -c - sysctl -e -w net.core.somaxconn=32768; sysctl -e -w net.ipv4.ip_local_port_range="1025 65535"; image: alpine:3.6 imagePullPolicy: IfNotPresent name: sysctl resources: {} securityContext: privileged: true - Aplique un parche a cada uno de los despliegues.
kubectl patch deployment <deployment_name> --patch pod-patch.yaml - Si ha cambiado el valor
net.core.somaxconnen los valores de kernel, la mayoría de las apps pueden utilizar automáticamente el valor actualizado. Sin embargo, es posible que en algunas apps se deba cambiar manualmente el valor correspondiente en el código de la app para que coincida con el valor del kernel. Por ejemplo, si va a ajustar el rendimiento de un pod en el que se ejecuta una app NGINX, debe cambiar el valor del campobacklogen el código de la app NGINX para que coincida. Para más información, consulte esta entrada del blog de NGINX.
Optimización de los valores de sysctl de estado activo de red
Si un pod tiene conexiones TCP de larga ejecución que se desconectan ocasionalmente cuando están desocupadas durante un periodo de tiempo, puede ayudar a cambiar los valores de estado activo de sysctl para el pod.
Actualmente no hay una forma de establecer estos valores de estado activo de sysctl en todos los pods de forma predeterminada en un clúster. La mejor forma de modificar los valores en todos los pods es utilizar un initContainer privilegiado. Revise el siguiente ejemplo de cómo configurar un initContainer para un despliegue en un espacio de nombres de test-ns.
Despliegue el ejemplo siguiente initContainer. Recuerde cambiar la sección containers: a sus propios contenedores de aplicaciones. A continuación, initContainer establece los valores de sysctl para todos los contenedores normales del pod porque todos ellos comparten el mismo espacio de nombres de red.
```sh {: pre}
kubectl apply -f - << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-sysctl
namespace: test-ns
labels:
run: test-sysctl
spec:
replicas: 2
selector:
matchLabels:
run: test-sysctl
template:
metadata:
labels:
run: test-sysctl
spec:
initContainers:
- command:
- sh
- -c
- sysctl -e -w net.ipv4.tcp_keepalive_time=40; sysctl -e -w net.ipv4.tcp_keepalive_intvl=15; sysctl -e -w net.ipv4.tcp_keepalive_probes=6;
image: us.icr.io/armada-master/alpine:latest
imagePullPolicy: IfNotPresent
name: sysctl-init
resources: {}
securityContext:
privileged: true
containers:
- name: test-sysctl
image: us.icr.io/armada-master/alpine:latest
command: ["sleep", "2592000"]
EOF
```
Ajuste de recursos del proveedor de métricas de clúster
El clúster tiene un servicio de métricas proporcionado por el despliegue de metrics-server en el espacio de nombres de kube-system. Las solicitudes de recursos de metrics-server se basan en el número de
nodos del clúster y se optimizan para clústeres con 30 o menos pods por nodo de trabajador. El servicio de métrica coincide con los límites de memoria y CPU de las solicitudes de recursos.
Los contenedores de servicio de métricas pueden "agotar la memoria" si las solicitudes de memoria son demasiado bajas. Es posible que respondan muy lentamente o que fallen las sondas de liveness y readiness, debido al estrangulamiento de la CPU si las peticiones de CPU son demasiado bajas.
El uso de memoria está basado en el número de pods del clúster. El uso de CPU lo controla el número de solicitudes de métricas (HPA, kubectl top nodes / pods, etc.) y las solicitudes de descubrimiento de API. El metrics-server proporciona una API de Kubernetes, de forma que los clientes como kubectl que utilizan el descubrimiento de API coloquen alguna carga en metrics-server, incluso si no utilizan métricas.
Los siguientes síntomas pueden indicar la necesidad de ajustar los recursos de metrics-server:
-
El
metrics-serverse está reiniciando con frecuencia. -
La supresión de un espacio de nombres en el espacio de nombres que está atascado en un estado
Terminatingykubectl describe namespaceincluye una condición que informa de un error de descubrimiento de API de métricas. -
kubectl top pods,kubectl top nodes, otros mandatos dekubectlo aplicaciones que utilizan la API de Kubernetes para registrar errores de Kubernetes tales como:
The server is currently unable to handle the request (get pods.metrics.k8s.io)
Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
-
HorizontalPodAutoscalers (HPA) no escalan los despliegues.
-
La ejecución de
kubectl get apiservices v1beta1.metrics.k8s.ioda como resultado un estado como:
NAME SERVICE AVAILABLE AGE
v1beta1.metrics.k8s.io kube-system/metrics-server False (FailedDiscoveryCheck) 139d
Modificar la correlación de configuración de metrics-server-config
Tanto la CPU como la memoria tienen valores ajustables "base" y "por nodo" utilizados para calcular una solicitud total.
baseCPUcpuPerNodebaseMemorymemoryPerNode
Donde:
cpuRequest = baseCPU + cpuPerNode * number_of_nodes
memoryRequest = baseMemory + memoryPerNode * number_of_nodes
El número de nodos en estos cálculos proviene de un conjunto de "tamaños de cubo" y tiene un tamaño mínimo de 16 nodos.
La CPU se solicita en núcleos, con valor como 1 o valores fraccionarios como 100m (100 milicores).
La memoria se solicita en bytes con un sufijo opcional de:
- base 2 1Ki = 1024):
Ki(kilobytes),Mi(megabytes),Gi(gigabytes). - métrica 1k = 1000):
k,M,G.
Si se espera que el número de nodos de un clúster crezca (o simplemente cambie) a lo largo del tiempo, es posible que desee ajustar el valor "por nodo". Si el número de nodos es estático, ajuste el valor "base". Al final,
los valores de CPU y memoria total se establecen en las solicitudes de recursos de despliegue de metrics-server.
Puede cambiar los recursos predeterminados editando el mapa de configuración del proveedor de métricas. No modifique las solicitudes de recursos ni los límites directamente en el despliegue de metrics-server, el contenedor de
metrics-server-nanny sobrescribe los valores.
El valor predeterminado del mapa de configuración de metrics-server-config es:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
kubernetes.io/cluster-service: "true"
name: metrics-server-config
namespace: kube-system
data:
NannyConfiguration: |-
apiVersion: nannyconfig/v1alpha1
kind: NannyConfiguration
Este ejemplo muestra un mapa de configuración con todos los valores definidos.
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
kubernetes.io/cluster-service: "true"
name: metrics-server-config
namespace: kube-system
data:
NannyConfiguration: |-
apiVersion: nannyconfig/v1alpha1
kind: NannyConfiguration
baseCPU: 200m
cpuPerNode: 1m
baseMemory: 40Mi
memoryPerNode: 6Mi
Los valores predeterminados son:
baseCPU: 200m
cpuPerNode: 1m
baseMemory: 40Mi
memoryPerNode: 6Mi
Editar el mapa de configuración
Puede editar el mapa de configuración con el mandato kubectl edit:
kubectl edit cm metrics-server-config -n kube-system
Añada o edite los campos que desea cambiar y, a continuación, guarde el mapa de configuración y salga del editor.
IBM Cloud-provided metrics-server supervisa el mapa de configuración por los cambios y actualizaciones que el recurso de despliegue solicita automáticamente. metrics-server puede tardar hasta 10 minutos en detectar
el cambio y el despliegue de un nuevo conjunto de pods con base en los valores actualizados.
Restaurar los valores predeterminados
Para restaurar metrics-server a los valores predeterminados, suprima el mapa de configuración. Se recrea en pocos minutos.
kubectl delete cm metrics-server-config -n kube-system
Determinación de los recursos a ajustar
Utilice el mandato kubectl describe pod para obtener la definición de pod, la información de estado y los sucesos recientes:
kubectl get pod -n kube-system -l k8s-app=metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-9fb4947d6-s6sgl 3/3 Running 0 2d4h
kubectl describe pod -n kube-system metrics-server-9fb4947d6-s6sgl
Salida de ejemplo
Containers:
metrics-server:
Container ID: containerd://fe3d07c9a2541242d36da8097de3896f740c1363f6d2bfd01b8d96a641192b1b
Image: registry.ng.bluemix.net/armada-master/metrics-server:v0.4.4
Image ID: registry.ng.bluemix.net/armada-master/metrics-server@sha256:c2c63900d0e080c2413b5f35c5a59b5ed3b809099355728cf47527aa3f35477c
Port: 4443/TCP
Host Port: 0/TCP
Command:
/metrics-server
--metric-resolution=45s
--secure-port=4443
--tls-cert-file=/etc/metrics-server-certs/tls.crt
--tls-private-key-file=/etc/metrics-server-certs/tls.key
State: Running
Started: Fri, 10 Sep 2021 17:31:39 +0000
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Fri, 10 Sep 2021 05:59:51 +0000
Finished: Fri, 10 Sep 2021 17:31:37 +0000
Ready: True
Restart Count: 36
Si el Last State muestra un Reason de OOMKilled, aumente las solicitudes de memoria en el mapa de configuración de metrics-server-config en incrementos de 100Mi o más grandes hasta que el
servidor de métricas sea estable y se ejecute durante varias horas o más sin ser OOMkilled.
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Si el Last state muestra un Reason de Error y sucesos como los del ejemplo siguiente, aumente las solicitudes de CPU en el mapa de configuración de metrics-server-config en incrementos de
100m o mayores hasta que el servidor de métricas sea estable y se ejecute durante varias horas o más sin que se inactiven debido a tiempos de espera excedidos de sondeo.
Last State: Terminated
Reason: Error
Exit Code: 137
Events:
Warning Unhealthy 46m (x5 over 80m) kubelet Liveness probe failed: Get "https://198.18.68.236:4443/livez": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Warning Unhealthy 26m (x65 over 89m) kubelet Liveness probe failed: Get "https://198.18.68.236:4443/livez": net/http: TLS handshake timeout
Warning Unhealthy 21m (x10 over 76m) kubelet Readiness probe failed: Get "https://198.18.68.236:4443/readyz": net/http: request canceled (Client.Timeout exceeded while awaiting headers)
Warning Unhealthy 115s (x93 over 90m) kubelet Readiness probe failed: Get "https://198.18.68.236:4443/readyz": net/http: TLS handshake timeout
Es posible que tenga que repetir este proceso unas cuantas veces para alcanzar una configuración estable, ajustando primero las solicitudes de memoria y, a continuación, ajustando las solicitudes de CPU.
Habilitación de páginas muy grandes
Infraestructura clásica Virtual Private Cloud
Puede activar la programación de Kubernetes HugePages en clusters que ejecuten Kubernetes versión 1.19 o posterior.
El único tamaño de página admitido es de 2 MB por página, que es el tamaño predeterminado de la puerta de la característica de Kubernetes.
La planificación de páginas muy grandes es una característica beta en IBM Cloud Kubernetes Service y está sujeta a cambios.
De forma predeterminada, la CPU de los nodos trabajadores asigna RAM en trozos, o páginas, de 4 KB. Cuando la app necesita más RAM, el sistema debe seguir buscando más páginas, lo que puede ralentizar el proceso. Con páginas muy grandes, puede aumentar el tamaño de la página a 2 MB para aumentar el rendimiento de las apps que requieren mucha RAM, como las bases de datos para inteligencia artificial (IA), Internet de las cosas (IoT) o las cargas de trabajo de aprendizaje automático. Para más información sobre páginas enormes, consulte la documentación del kernel Linux.
Puede reiniciar el nodo trabajador y la configuración de páginas muy grandes persiste. Sin embargo, la configuración de páginas enormes no persiste en ninguna otra operación del ciclo de vida del nodo trabajador. Debe repetir los pasos de habilitación cada vez que actualice, vuelva a cargar sustituya o añada nodos trabajadores.
- Rol de acceso a la plataforma de Operador y rol de acceso al servicio de Gestor para el clúster en IBM Cloud IAM
Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
-
Cree un archivo de configuración
hugepages-ds.yamlpara habilitar páginas muy grandes. En el siguiente archivo YAML de ejemplo se utiliza un conjunto de daemons para ejecutar el pod en cada nodo trabajador del clúster. Puede definir la asignación de páginas muy grandes que están disponibles en el nodo trabajador mediante el parámetrovm.nr_hugepages. En este ejemplo se asignan 512 páginas a 2 MB por página, para 1 GB de RAM total asignada exclusivamente para páginas muy grandes.¿Desea habilitar páginas muy grandes solo para determinados nodos trabajadores, como por ejemplo una agrupación de nodos trabajadores que utiliza para apps con gran consumo de RAM? Etiquete y manche su grupo de trabajadores y, a continuación, añada reglas de afinidad al conjunto de demonios para que los pods se desplieguen únicamente en los nodos de trabajadores del grupo de trabajadores que especifique.
apiVersion: apps/v1 kind: DaemonSet metadata: name: hugepages-enablement namespace: kube-system labels: tier: management app: hugepages-enablement spec: selector: matchLabels: name: hugepages-enablement template: metadata: labels: name: hugepages-enablement spec: hostPID: true initContainers: - command: - sh - -c # Customize allocated Hugepages by providing the value - "echo vm.nr_hugepages=512 > /etc/sysctl.d/90-hugepages.conf" image: alpine:3.6 imagePullPolicy: IfNotPresent name: sysctl resources: {} securityContext: privileged: true volumeMounts: - name: modify-sysctld mountPath: /etc/sysctl.d containers: - resources: requests: cpu: 0.01 image: alpine:3.6 # once the init container completes, keep the pod running for worker node changes name: sleepforever command: ["/bin/sh", "-c"] args: - > while true; do sleep 100000; done volumes: - name: modify-sysctld hostPath: path: /etc/sysctl.d -
Aplique el archivo que ha creado anteriormente.
kubectl apply -f hugepages-ds.yaml -
Verifique que los pods están en ejecución (Running).
kubectl get pods -
Reinicie el kubelet que se ejecuta en cada nodo trabajador reiniciando los nodos trabajadores. No vuelva a cargar el nodo trabajador para reiniciar el kubelet. Si se vuelve a cargar el nodo trabajador antes de que el kubelet adopte la habilitación de las páginas muy grandes, la habilitación falla.
- Obtenga una lista de los nodos trabajadores del clúster.
ibmcloud ks worker ls -c <cluster_name_or_ID> - Rearranque los nodos trabajadores. Puedes reiniciar múltiples nodos trabajadores incluyendo múltiples opciones
-w, pero asegúrate de dejar suficientes nodos trabajadores funcionando al mismo tiempo para que tus aplicaciones eviten una interrupción.ibmcloud ks worker reboot -c <cluster_name_or_ID> -w <worker1_ID> -w <worker2_ID>
- Obtenga una lista de los nodos trabajadores del clúster.
-
Cree un pod de prueba
hugepages-test.yamlque monte páginas muy grandes como un volumen y que utilice límites de recursos y solicitudes para establecer la cantidad de recursos de páginas muy grandes que utiliza el pod. Nota: si ha utilizado etiquetas, marcas y reglas de afinidad para habilitar páginas muy grandes solo en nodos trabajadores seleccionados, incluya estas mismas reglas en el pod de prueba.apiVersion: v1 kind: Pod metadata: name: hugepages-example spec: containers: - name: hugepages-example image: fedora:34 command: - sleep - inf volumeMounts: - mountPath: /hugepages-2Mi name: hugepage-2mi resources: limits: hugepages-2Mi: 100Mi memory: 100Mi requests: memory: 100Mi volumes: - name: hugepage-2mi emptyDir: medium: HugePages-2Mi -
Aplique el archivo del pod que ha creado anteriormente.
kubectl apply -f hugepages-pod.yaml -
Verifique que el pod utiliza los recursos de páginas muy grandes.
- Compruebe que el pod se esté ejecutando (Running). El pod no se ejecuta si no hay nodos trabajadores con páginas muy grandes disponibles.
kubectl get pods - Inicie sesión en el pod.
kubectl exec -it <pod> /bin/sh - Verifique que el pod puede ver los tamaños de las páginas muy grandes.
Salida de ejemplols /sys/kernel/mm/hugepageshugepages-1048576kB hugepages-2048kB
- Compruebe que el pod se esté ejecutando (Running). El pod no se ejecuta si no hay nodos trabajadores con páginas muy grandes disponibles.
-
Opcional: Elimine el conjunto de daemons de habilitación. Tenga en cuenta que debe volver a crear el conjunto de daemons si necesita actualizar, volver a cargar, sustituir o añadir nodos trabajadores con páginas muy grandes más adelante.
kubectl -n kube-system delete daemonset hugepages-enablement -
Repita estos pasos siempre que actualice, vuelva a cargar, sustituya o añada nodos trabajadores.
Para resolver problemas de nodos trabajadores con páginas muy grandes, solo puede rearrancar el nodo trabajador. La configuración de páginas muy grandes no persiste en cualquier otra operación del ciclo de vida del nodo trabajador, como por ejemplo actualizar, volver a cargar, sustituir o añadir nodos trabajadores. Para eliminar la configuración de páginas muy grandes del clúster, puede actualizar, volver a cargar o sustituir todos los nodos trabajadores.
Modificación de la unidad máxima de transmisión (MTU) de Calico
Aumente o reduzca la unidad máxima de transmisión (MTU) del plugin de Calico para que se ajuste a los requisitos de rendimiento de red del entorno.
Estos pasos son aplicables a los clusters que ejecutan la versión 1.29 o posterior. Además, todos los nodos trabajadores de la VPC admiten tramas Jumbo, pero la infraestructura clásica sólo admite tramas Jumbo en los trabajadores bare metal.
Cambiar los valores de la unidad máxima de transmisión (MTU) puede tener resultados inesperados, especialmente en entornos de red complejos. Para evitar interrupciones en su flujo de trabajo, se recomienda encarecidamente que pruebe estos cambios en un clúster de desarrollo antes de realizar cualquier cambio en sus clústeres de producción.
Por defecto, el complemento de red Calico de su clúster IBM Cloud Kubernetes Service tiene una MTU de 1450 bytes para los clústeres Satellite y de 1480 bytes para los clústeres que no son Satellite. En la mayoría de los casos, este valor de MTU por defecto Calico es suficiente para evitar la caída y fragmentación de paquetes. Dado que la mayoría de los hosts utilizan un valor MTU de 1.500, estos valores predeterminados proporcionan a los clústeres Satellite 50 bytes adicionales para las cabeceras VXLAN y proporcionan a los clústeres Satellite satélite 20 bytes adicionales para las cabeceras IP utilizadas en parte del tráfico de red de clúster pod a pod. Tenga en cuenta que todos los nodos trabajadores del clúster deben utilizar el mismo valor de MTU Calico.
Revise los casos siguientes en los que es posible que tenga que modificar la MTU predeterminada de Calico:
- Si necesita mejorar el rendimiento de su red pod-a-pod y los nodos de su cluster son capaces de utilizar una MTU de host más alta, entonces puede incrementar tanto la MTU del host como la de Calico. Esto se denomina utilizar "tramas jumbo". La MTU típica de una trama jumbo es de 9000. En este caso, puedes configurar la interfaz de red privada del host con un valor de MTU de 9000 y la MTU de Calico con un valor ligeramente inferior -- 8950 para clusters Satellite y 8980 para clusters no Satellite. Tenga en cuenta que es posible que algunos recursos o hardware de proveedores de nube, como las máquinas virtuales Azure, no admitan tramas jumbo o sólo admitan un valor de MTU de hasta 4000.
- Si tiene una conexión VPN configurada para el clúster, algunas conexiones de VPN requieren una MTU de Calico menor que la predeterminada. Consulte con el proveedor de servicio de VPN para determinar si se necesita una MTU de Calico menor.
- Antes de empezar
- Si sus nodos de trabajo siguen ejecutando el valor MTU predeterminado, aumente primero el valor MTU para sus nodos de trabajo antes de aumentar el valor MTU para el complemento Calico. Por ejemplo, puedes aplicar el siguiente daemon set para
cambiar la MTU de tus nodos trabajadores a 9000 bytes. Tenga en cuenta que los nombres de interfaz que se utilizan en el mandato
ip linkvarían en función del tipo de los nodos trabajadores.- Mandato de ejemplo para nodos trabajadores nativos:
ip link set dev bond0 mtu 9000;ip link set dev bond1 mtu 9000; - Ejemplo de nodos trabajadores de VPC Gen 2:
ip link set dev ens3 mtu 9000;
- Mandato de ejemplo para nodos trabajadores nativos:
-
Ejecute los siguientes comandos para iniciar sesión en un nodo de trabajo del clúster y hacer ping de un nodo a otro. Como la MTU de tu nodo sólo está configurada a 1500 o 1480, se espera que este intento falle. En los pasos siguientes, puede volver a ejecutar estos comandos para verificar que los cambios se han realizado correctamente.
-
Obtenga una lista de los nodos del clúster. Guarde los nombres y las direcciones IP de dos nodos sanos.
kubectl get nodes -o wide -
Inicie sesión en uno de los nodos. Especifique el nombre del nodo.
kubectl debug --image=us.icr.io/armada-master/network-alpine -it node/<NODE_NAME> -- sh -
Ejecuta el comando para hacer ping de un nodo al otro. Especifique la dirección IP del nodo al que no hizo referencia en el paso anterior.
ping -c1 -Mdo -s 8972 <OTHER_HOST_IP>
-
-
Cambie la MTU del nodo con el siguiente daemonset de ejemplo. Este valor de MTU se aplica al tráfico de nodo a nodo. Modifique la línea
- ip link set dev ens3 mtu <MTU_VALUE>para incluir su valor de MTU (el ejemplo utiliza un valor de MTU de 9000). Tenga en cuenta que también podría tener que cambiar el nombre de la interfaz 'ens3' si ens3 no es apropiado para sus nodos.apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: set-host-mtu name: set-host-mtu namespace: kube-system spec: selector: matchLabels: name: set-host-mtu template: metadata: labels: name: set-host-mtu spec: containers: - args: - | while true; do sleep 100000; done command: - /bin/sh - -c image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: IfNotPresent name: sleepforever resources: requests: cpu: 10m hostNetwork: true initContainers: - command: - sh - -c - ip link set dev ens3 mtu 9000 image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: IfNotPresent name: set-host-mtu securityContext: capabilities: add: - NET_ADMIN privileged: true volumeMounts: - mountPath: /sys name: modifysys restartPolicy: Always terminationGracePeriodSeconds: 2 tolerations: - operator: Exists volumes: - hostPath: path: /sys type: "" name: modifysys updateStrategy: rollingUpdate: maxSurge: 0 maxUnavailable: 1 type: RollingUpdate -
Aplica el daemonset para cambiar el valor MTU del nodo.
kubectl apply -f <file_name> -
Vuelva a ejecutar los comandos para iniciar sesión en un nodo y hacer ping de un host a otro, utilizando un tamaño de paquete grande. Ahora que ha incrementado el valor MTU del nodo, se espera que el comando '
ping' tenga éxito.kubectl debug --image=us.icr.io/armada-master/network-alpine -it node/<NODE_NAME> -- shping -c1 -Mdo -s 8972 <OTHER_HOST_IP> -
Tómese su tiempo para probar su cluster con el nuevo valor de MTU de nodo. Antes de continuar con el cambio del valor MTU Calico, se recomienda que compruebe que sus aplicaciones siguen funcionando como se espera.
-
Ejecute el comando para actualizar los valores de MTU Calico para que el tráfico de pod a pod también pueda utilizar el MTU mayor. Para clusters Satellite Core OS, el valor MTU de Calico debe ser 50 bytes menor que el valor MTU del nodo. Para todos los demás clusters, el valor MTU Calico debe ser 20 bytes menor. Por ejemplo, si especificó 9000 para la MTU de nodo, su MTU Calico debería ser 8950 para los clusters Satellite Core OS o 8980 para todos los demás clusters.
kubectl patch installation.operator.tigera.io default --type='merge' -p '{"spec":{"calicoNetwork":{"mtu":<MTU_VALUE>}}}'También puedes editar el recurso directamente ejecutando '
kubectl edit installation.operator.tigera.io default. -
Aplique estos cambios a todos sus nodos reiniciando cuidadosamente todos los nodos. Asegúrese de haber probado este proceso en un clúster de desarrollo antes de continuar con este paso, ya que estos cambios podrían causar interrupciones en su carga de trabajo. Para reiniciar los nodos, se recomienda acordonar, drenar y reiniciar los nodos uno a uno.
Si está completando estos pasos en un clúster de producción, debe utilizar el mismo proceso que utiliza para actualizar o sustituir nodos de producción. Se recomienda encarecidamente que pruebe todo este proceso en un clúster de prueba antes de completar estos pasos en un clúster de producción.
Durante el proceso de reinicio, algunos pods utilizan la nueva MTU más grande y otros pods siguen teniendo la MTU original, más pequeña. Normalmente, este escenario no causa problemas porque ambos lados negocian el tamaño máximo correcto de los paquetes. Sin embargo, si bloquea los paquetes ICMP, es posible que la negociación no funcione y que su clúster experimente problemas de conexión de pods hasta que se hayan completado todos los reinicios. Es fundamental que este proceso se pruebe primero en un clúster de desarrollo.
Inhabilitación del plugin de correlación de puertos
El plugin portmap correspondiente a la interfaz de red de contenedor (CNI) de Calico le permite utilizar un hostPort para exponer los pods de su app en un puerto determinado en el nodo trabajador. Para evitar problemas
de rendimiento de iptables, elimine el plugin de correlación de puertos de la configuración de CNI de Calico del clúster.
Cuando tiene muchos servicios en el clúster, por ejemplo, más de 500 servicios, o muchos puertos en los servicios, por ejemplo, más de 50 puertos por servicio para 10 o más servicios, se generan muchas reglas iptables para las políticas de red
de Calico y Kubernetes de estos servicios. El uso de muchas reglas iptables puede provocar problemas de rendimiento para el complemento de mapa de puertos, y podría impedir futuras actualizaciones de reglas iptables o hacer que el contenedor
calico-node se reinicie cuando no se reciba ningún bloqueo para realizar actualizaciones de reglas iptables en un tiempo determinado. Para evitar estos problemas de rendimiento, puede inhabilitar el plugin de correlación de puertos
eliminándolo de la configuración de CNI de Calico del clúster.
Si debe utilizar hostPorts, no inhabilite el plugin de correlación de puertos.
Inhabilitación del plug-in de correlación de puertos en Kubernetes versión 1.29 y posteriores
- Edite el recurso de instalación de Calico
default.kubectl edit installation default -n calico-system - En la sección
spec.calicoNetwork, cambie el valor dehostPortsporDisabled.... spec: calicoNetwork: hostPorts: Disabled ipPools: - cidr: 172.30.0.0/16 encapsulation: IPIPCrossSubnet natOutgoing: Enabled nodeSelector: all() mtu: 1480 nodeAddressAutodetectionV4: interface: (^bond0$|^eth0$|^ens6$|^ens3$) kubernetesProvider: OpenShift registry: registry.ng.bluemix.net/armada-master/ variant: Calico status: variant: Calico - Guarde y cierre el archivo. Los cambios se aplican automáticamente.
Inhabilitación del plug-in de correlación de puertos en Kubernetes versión 1.28 y anteriores
-
Edite el recurso de mapa de configuración
calico-config.kubectl edit cm calico-config -n kube-system -
En la sección
data.cni_network_config.pluginsque hay después del pluginkubernetes, elimine la sección del pluginportmap. Después de eliminar la secciónportmap, la configuración tiene el siguiente aspecto:apiVersion: v1 data: calico_backend: bird cni_network_config: |- { "name": "k8s-pod-network", "cniVersion": "0.3.1", "plugins": [ { "type": "calico", ... }, { "type": "tuning", ... }, { "type": "bandwidth", ... } ] } typha_service_name: calico-typha ...No se da soporte al cambio de otros valores para el plugin de Calico en este mapa de configuración.
-
Aplique el cambio al clúster reiniciando todos los pods
calico-node.kubectl rollout restart daemonset -n kube-system calico-node