Actualiza clústeres

Después de crear un clúster con bmctl, puedes cambiar algunos aspectos de la configuración del clúster mediante la siguiente secuencia de acciones:

  1. Cambia los valores de ciertos campos en el archivo de configuración del clúster, que de forma predeterminada se encuentra aquí: bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml.

  2. Actualiza el clúster mediante la ejecución del comando bmctl update.

De esta manera, puedes agregar o quitar nodos en un clúster, por ejemplo, o reemplazarlos en un clúster. En este documento, se describe cómo realizar estas y otras actualizaciones en un clúster.

Sin embargo, es importante tener en cuenta que muchos aspectos de la configuración del clúster son inmutables y no se pueden actualizar después de crear el clúster. Para obtener una lista completa de los campos inmutables y mutables, consulta la referencia del campo de configuración del clúster. La referencia del campo es una tabla ordenable. Haz clic en los encabezados de las columnas para cambiar el orden de clasificación. Haz clic en el nombre de un campo para ver su descripción.

Agrega o quita nodos en un clúster

Un grupo de nodos es un grupo de nodos dentro de un clúster que tiene la misma configuración. Ten en cuenta que un nodo siempre pertenece a un grupo de nodos. Para agregar un nodo nuevo a un clúster, debes agregarlo a un grupo de nodos en particular. Quitar un nodo de un grupo de nodos equivale a quitarlo del clúster por completo.

Existen tres tipos de grupos de nodos en GKE en Bare Metal: plano de control, balanceador de cargas y grupos de nodo trabajador.

Para agregar o quitar un nodo de un grupo de nodos, debes agregar o quitar la dirección IP del nodo en una sección específica del archivo de configuración del clúster. En la siguiente lista, se muestra qué sección editar para un grupo de nodos determinado:

  • Grupo de nodos trabajadores: agrega o quita la dirección IP del nodo en la sección spec.nodes de la especificación NodePool.
  • Grupo de nodos del plano de control: Agrega o quita la dirección IP del nodo en la sección spec.controlPlane.nodePoolSpec.nodes de la especificación Cluster.
  • Grupo de nodos del balanceador de cargas: Agrega o quita la dirección IP del nodo en la sección spec.loadBalancer.nodePoolSpec.nodes de la especificación Cluster.

Ejemplo: cómo quitar un nodo trabajador

Este es un archivo de configuración de clúster de muestra que muestra las especificaciones de dos nodos trabajadores:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: nodepool1
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  nodes:
  - address: 172.18.0.5
  - address: 172.18.0.6

Para quitar un nodo, haz lo siguiente:

  1. Si el nodo que quieres quitar ejecuta Pods críticos, primero debes poner el nodo en modo de mantenimiento (opcional).

    Puedes supervisar el proceso de vaciado de nodos para los nodos trabajadores. Para ello, consulta los campos status.nodesDrained y status.nodesDraining en el recurso NodePool.

  2. Edita el archivo de configuración del clúster para borrar la entrada de la dirección IP del nodo.

  3. Actualiza el clúster:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=ADMIN_KUBECONFIG
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME: Es el nombre del clúster que deseas actualizar.
    • ADMIN_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig del clúster de administrador.

    Una vez que el comando bmctl update se haya ejecutado correctamente, tarda un tiempo en completar los trabajos machine-preflight y machine-init. Puedes ver el estado de los nodos y sus respectivos grupos de nodos si ejecutas los comandos que se describen en la sección Verifica tus actualizaciones de este documento.

Cómo forzar la eliminación de un nodo

Si el comando bmctl update no puede quitar un nodo, es posible que debas forzar su eliminación del clúster. Para obtener más detalles, consulta Cómo quitar nodos rotos de manera automática.

Reemplaza los nodos del plano de control de alta disponibilidad

Puedes reemplazar los nodos del plano de control de alta disponibilidad (HA) en clústeres de administrador, de usuario, híbridos y independientes.

Para reemplazar un nodo en un clúster, debes realizar los siguientes pasos:

  1. Quita la dirección IP del nodo del archivo de configuración del clúster.
  2. Actualiza el clúster.
  3. Verifica el estado de los nodos del clúster.
  4. Agrega la dirección IP de un nodo nuevo al mismo archivo de configuración del clúster.
  5. Actualiza el clúster.

En el resto de esta sección, se analiza un ejemplo.

Este es un archivo de configuración de clúster de muestra que muestra tres nodos del plano de control en un clúster de usuario:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
 name: user-cluster
 namespace: cluster-user-cluster
spec:
  controlPlane:
   nodePoolSpec:
     nodes:
     - address: 10.200.0.11
     - address: 10.200.0.12
     - address: 10.200.0.13

Para reemplazar el último nodo que aparece en la sección spec.controlPlane.nodePoolSpec.nodes, sigue estos pasos:

  1. Para quitar el nodo, borra su entrada de dirección IP en el archivo de configuración del clúster. Después de realizar este cambio, el archivo de configuración del clúster debería tener el siguiente aspecto:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
     name: user-cluster
     namespace: cluster-user-cluster
    spec:
      controlPlane:
       nodePoolSpec:
         nodes:
         - address: 10.200.0.11
         - address: 10.200.0.12
    
  2. Actualiza el clúster mediante la ejecución del siguiente comando:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    Realiza los siguientes cambios:

    • Reemplaza CLUSTER_NAME por el nombre del clúster que deseas actualizar.
    • Si el clúster es de administración automática (como un clúster de administrador o independiente), reemplaza KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster. Si el clúster es un clúster de usuario, como en este ejemplo, reemplaza KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster de admin.
  3. Una vez que el comando bmctl update se haya ejecutado correctamente, tarda un tiempo en completar los trabajos machine-preflight y machine-init. Para ver el estado de los nodos y sus respectivos grupos de nodos, ejecuta los comandos que se describen en la sección Verifica las actualizaciones de este documento. Una vez que el grupo de nodos y los nodos estén listos, puedes continuar con el siguiente paso.

  4. Para agregar un nodo del plano de control nuevo al grupo de nodos, agrega la dirección IP del nodo del plano de control nuevo a la sección spec.controlPlane.nodePoolSpec.nodes del archivo de configuración del clúster. Después de realizar este cambio, el archivo de configuración del clúster debería tener el siguiente aspecto:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
     name: user-cluster
     namespace: cluster-user-cluster
    spec:
      controlPlane:
       nodePoolSpec:
         nodes:
         - address: 10.200.0.11
         - address: 10.200.0.12
         - address: 10.200.0.14
    
  5. Actualiza el clúster mediante la ejecución del siguiente comando:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    Realiza los siguientes cambios:

    • Reemplaza CLUSTER_NAME por el nombre del clúster que deseas actualizar.
    • Si el clúster es de administración automática (como un clúster de administrador o independiente), reemplaza KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster. Si el clúster es un clúster de usuario, como en este ejemplo, reemplaza KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster de admin.

Verifica tus actualizaciones

Puedes ver el estado de los nodos y sus respectivos grupos de nodos con el comando kubectl get.

Por ejemplo, el siguiente comando muestra el estado de los grupos de nodos en el espacio de nombres del clúster cluster-my-cluster:

kubectl -n cluster-my-cluster get nodepools.baremetal.cluster.gke.io

El sistema muestra resultados similares al siguiente:

NAME                    READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
cluster-my-cluster      3       0             0         0                  0
cluster-my-cluster-lb   2       0             0         0                  0
np1                     3       0             0         0                  0

Reconciling=1 significa que el paso de conciliación aún está en curso. Debes esperar hasta que el estado cambie a Reconciling=0.

También puedes verificar el estado de los nodos de un clúster si ejecutas el siguiente comando:

kubectl get nodes --kubeconfig=KUBECONFIG

Si necesitas más información sobre cómo diagnosticar clústeres, consulta Crea instantáneas para diagnosticar clústeres.

Funciones que puedes cambiar con una actualización

Además de agregar, quitar o reemplazar nodos, puedes usar el comando bmctl update para modificar ciertos valores de campos mutables, recursos personalizados (CR) y anotaciones en el archivo de configuración del clúster.

A fin de actualizar un recurso de clúster, edita el archivo de configuración del clúster y usa bmctl update para aplicar los cambios.

En las siguientes secciones, se describen algunos ejemplos comunes para actualizar un clúster existente cuando se cambia un valor de campo, una CR o una anotación.

loadBalancer.addressPools

La sección addressPools contiene campos a fin de especificar grupos de balanceo de cargas para balanceadores de cargas en paquetes. Puedes agregar más grupos de direcciones de balanceo de cargas en cualquier momento, pero no puedes quitar ni modificar ningún grupo de direcciones existente.

addressPools:
- name: pool1
  addresses:
  - 192.168.1.0-192.168.1.4
  - 192.168.1.240/28
- name: pool2
  addresses:
  - 192.168.1.224/28

Evita la eliminación involuntaria de clústeres

Si agregas la anotación baremetal.cluster.gke.io/prevent-deletion: "true" al archivo de configuración de tu clúster, no podrás borrarlo. Por ejemplo, ejecutar kubectl delete cluster o bmctl reset cluster produce un error.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: ci-10c3c6f4d9c698e
  namespace: cluster-ci-10c3c6f4d9c698e
  annotations:
    baremetal.cluster.gke.io/prevent-deletion: "true"
spec:
  clusterNetwork:

bypassPreflightCheck

El valor predeterminado del campo bypassPreflightCheck es false. Si estableces este campo en true en el archivo de configuración del clúster, se ignoran las comprobaciones preliminares internas si aplicas recursos a los clústeres existentes.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  bypassPreflightCheck: true

loginUser

Puedes establecer el campo loginUser en la configuración de acceso al nodo. Este campo admite la capacidad sudo sin contraseña para el acceso a la máquina.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  nodeAccess:
    loginUser: abm

NetworkGatewayGroup

El recurso personalizado NetworkGatewayGroup se usa para proporcionar direcciones IP flotantes para funciones avanzadas de redes, como la puerta de enlace NAT de salida o el balanceo de cargas en paquetes con BGP. Para usar el recurso personalizado NetworkGatewayGroup y las funciones de red relacionadas, debes configurar clusterNetwork.advancedNetworking como true cuando crees los clústeres.

apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100

BGPLoadBalancer

Cuando configuras balanceadores de cargas en paquetes con BGP, el balanceo de cargas del plano de datos usa de forma predeterminada los mismos pares externos que se especificaron para el intercambio de tráfico del plano de control. Como alternativa, puedes configurar el balanceo de cargas del plano de datos por separado mediante el recurso personalizado BGPLoadBalancer (y el recurso personalizado BGPPeer). Para obtener más información, consulta Configura balanceadores de cargas en paquetes con BGP.

apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
  name: default
  namespace: cluster-bm
spec:
  peerSelector:
    cluster.baremetal.gke.io/default-peer: "true"

BGPPeer

Cuando configuras balanceadores de cargas en paquetes con BGP, el balanceo de cargas del plano de datos usa de forma predeterminada los mismos pares externos que se especificaron para el intercambio de tráfico del plano de control. Como alternativa, puedes configurar el balanceo de cargas del plano de datos por separado mediante el recurso personalizado BGPPeer (y el recurso personalizado BGPLoadBalancer). Para obtener más información, consulta Configura balanceadores de cargas en paquetes con BGP.

apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm
  labels:
    cluster.baremetal.gke.io/default-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

NetworkAttachmentDefinition

Puedes usar el comando bmctl update para modificar los recursos personalizados NetworkAttachmentDefinition que corresponden a la red.

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: gke-network-1
  namespace: cluster-my-cluster
spec:
  config: '{
  "type": "ipvlan",
  "master": "enp2342",
  "mode": "l2",
  "ipam": {
    "type": "whereabouts",
    "range": "172.120.0.0/24"

Después de modificar el archivo de configuración, actualiza el clúster mediante la ejecución del siguiente comando bmctl update:

bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG

Realiza los siguientes cambios:

  • Reemplaza CLUSTER_NAME por el nombre del clúster que deseas actualizar.
  • Si el clúster es de administración automática (como un clúster de administrador o independiente), reemplaza KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster. Si el clúster es un clúster de usuario, reemplaza KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster de admin.

Inhabilita el puerto de solo lectura de kubelet

A partir de la versión 1.15.0, GKE en Bare Metal inhabilita el puerto 10255 de forma predeterminada, el puerto de solo lectura de kubelet. Cualquier carga de trabajo del cliente que esté configurada para leer datos desde este puerto de kubelet no seguro 10255 debe migrar a fin de usar el puerto seguro 10250 de kubelet.

Solo los clústeres creados con la versión 1.15.0 o superior tienen este puerto inhabilitado de forma predeterminada. El puerto de solo lectura de kubelet 10255 permanece accesible para los clústeres creados con una versión anterior a la 1.15.0, incluso después de una actualización del clúster a la versión 1.15.0 o superior.

Este cambio se realizó porque kubelet filtra información de baja sensibilidad a través del puerto 10255, que no está autenticado. La información incluye la información de configuración completa de todos los Pods que se ejecutan en un nodo, lo que puede ser valiosa para un atacante. También expone las métricas y la información de estado, lo que puede proporcionar estadísticas sensibles a la empresa.

La comparativa de CIS para Kubernetes recomienda inhabilitar el puerto de solo lectura de kubelet. Para inhabilitar de forma manual el puerto en la versión 1.14, completa los siguientes pasos:

  1. Edita el archivo de configuración de tu clúster y agrega la siguiente anotación:

    baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
    

    En el siguiente ejemplo de archivo de configuración de clúster, se muestra que se agregó esta anotación:

    [...]
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-my-cluster
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      annotations:
        baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
      name: my-cluster
      namespace: cluster-my-cluster
    [...]
    
  2. Edita el recurso de clúster de validación de webhook de clúster:

    kubectl edit validatingwebhookconfigurations lcm-validating-webhook-configuration
    
  3. Inhabilita temporalmente la validación de webhook mediante la eliminación de la línea con el verbo UPDATE:

    - admissionReviewVersions:
    - v1
    clientConfig:
      caBundle: …
      service:
        name: lcm-webhook-service
        namespace: kube-system
        path: /validate-baremetal-cluster-gke-io-v1-cluster
        port: 443
    failurePolicy: Fail
    matchPolicy: Equivalent
    name: vcluster.kb.io
    namespaceSelector: {}
    objectSelector: {}
    rules:
    - apiGroups:
      - baremetal.cluster.gke.io
      apiVersions:
      - v1
      operations:
      - CREATE
      - UPDATE # <- DELETE THIS LINE
      - DELETE
      resources:
      - clusters
      scope: '*'
    sideEffects: None
    timeoutSeconds: 10
    
  4. Agrega la anotación al recurso personalizado del clúster:

    kubectl edit clusters CLUSTER_NAME --kubeconfig KUBECONFIG_PATH
    

    Realiza los siguientes cambios:

    • Reemplaza CLUSTER_NAME por el nombre del clúster que deseas actualizar.
    • Reemplaza KUBECONFIG_PATH por la ruta de acceso al archivo kubeconfig del clúster.
  5. Agrega la anotación, como se muestra en el siguiente ejemplo del recurso personalizado del clúster actualizado:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      annotations:
        baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
    [...]
    
  6. Guarda y cierra el recurso personalizado del clúster.

  7. Para volver a habilitar la validación de webhook, agrega el verbo UPDATE al recurso de clúster de validación de webhooks del clúster:

    kubectl edit validatingwebhookconfigurations lcm-validating-webhook-configuration
    

    En el recurso personalizado, vuelve a agregar el verbo UPDATE en la sección operations:

    - admissionReviewVersions:
    - v1
    clientConfig:
      caBundle: …
      service:
        name: lcm-webhook-service
        namespace: kube-system
        path: /validate-baremetal-cluster-gke-io-v1-cluster
        port: 443
    failurePolicy: Fail
    matchPolicy: Equivalent
    name: vcluster.kb.io
    namespaceSelector: {}
    objectSelector: {}
    rules:
    - apiGroups:
      - baremetal.cluster.gke.io
      apiVersions:
      - v1
      operations:
      - CREATE
      - UPDATE # <- ADD THIS LINE BACK
      - DELETE
      resources:
      - clusters
      scope: '*'
    sideEffects: None
    timeoutSeconds: 10
    

    Guarda y cierra el recurso personalizado del clúster.

Estos cambios se conservan cuando actualizas a la versión 1.15.0 o posterior.