Habilitar el puerto de solo lectura de kubelet

Descripción general

En este documento, se muestra cómo implementar un DaemonSet con privilegios en cada nodo de GKE on VMware a fin de modificar los parámetros de kubelet y habilitar puertos de solo lectura. En la versión 1.16 y posteriores, el puerto de solo lectura de kubelet está inhabilitado de forma predeterminada.

Requisitos

Asegúrate de que GKE en VMware esté en buen estado antes de ejecutar la siguiente secuencia de comandos de parche. Puedes usar esta solución para aplicar un parche a los clústeres de administrador y de usuario 1.16 y posteriores.

Crea un archivo DaemonSet

Crea y guarda un archivo DaemonSet llamado parche.yaml en tu directorio actual, con el siguiente contenido:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: onprem-node-patcher
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: onprem-node-patcher
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: onprem-node-patcher
    spec:
      tolerations:
      - operator: Exists
      volumes:
      - name: host
        hostPath:
          path: /
      hostPID: true
      initContainers:
      - name: read-only-patcher
        image: "ubuntu"
        env:
        - name: KUBELET_READONLY_PORT
          value: "10255"
        # Number of 1G hugepages. Update the value as desired.
        command:
        - /bin/bash
        - -c
        - |
          set -xeuo pipefail
          configfile="/host/var/lib/kubelet/config.yaml"
          kubeletservice="/host/etc/systemd/system/kubelet.service"
          # $1: The read-only port for the kubelet to serve on with no
          #     authentication/authorization (set to 0 to disable)
          function set-readonly-port-in-config() {
            [[ "$#" -eq 1 ]] || return
            local readonlyport; readonlyport="$1"
            local actual; actual="$(grep readOnlyPort "${configfile}")"
            if [[ "${actual}" == "" ]]; then
              echo "readOnlyPort: ${readonlyport}" >> "${configfile}"
            else
              sed -E -i 's/readOnlyPort: [0-9]+/readOnlyPort: '"${readonlyport}"'/g' ${configfile}
            fi
            echo "Successfully append readOnlyPort: ${readonlyport} to ${configfile}"
          }
          sed -E -i 's/--read-only-port=[0-9]+/--read-only-port='"${KUBELET_READONLY_PORT}"'/g' ${kubeletservice}
          [[ -f ${configfile} ]] && set-readonly-port-in-config "${KUBELET_READONLY_PORT}"
          echo "Restarting kubelet..."
          chroot /host nsenter -a -t1 -- systemctl daemon-reload
          chroot /host nsenter -a -t1 -- systemctl restart kubelet.service
          echo "Success!"
        volumeMounts:
        - name: host
          mountPath: /host
        resources:
          requests:
            memory: 5Mi
            cpu: 5m
        securityContext:
          privileged: true
      containers:
      - image: gcr.io/google-containers/pause:3.2
        name: pause
      # Ensures that the pods will only run on the nodes having the correct
      # label.
      nodeSelector:
        "kubernetes.io/os": "linux"

Actualiza el número de puerto de solo lectura

  • Para cambiar el número de puerto, edita de forma manual la variable de entorno KUBELET_READONLY_PORT en el YAML de DaemonSet.

  • El puerto predeterminado de solo lectura es 10255. No deberías elegir 10250, ya que entrará en conflicto con el puerto seguro predefinido.

Aplica un parche al clúster de administrador

   kubectl apply -f patch.yaml \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG

Cómo aplicar un parche al clúster de usuario

   kubectl apply -f patch.yaml \
    --kubeconfig USER_CLUSTER_KUBECONFIG

Restablecer

  • Para inhabilitar el puerto de solo lectura, edita de forma manual la variable de entorno KUBELET_READONLY_PORT en el YAML del DaemonSet.

  • Después de guardar los cambios, el DaemonSet se volverá a ejecutar para modificar el kubelet según corresponda.

Advertencias

  • Este parche tiene el mismo ciclo de vida que las apps de terceros instaladas. Puedes ejecutarlo en cualquier momento como una operación de día 2. Sin embargo, es posible que no se conserve después de que vuelvas a crear el clúster. Para que este cambio sea persistente, implementa este DaemonSet como un paso en la acción posterior a la inicialización de GKE on VMware.

  • Después de la ejecución una vez, el archivo de configuración de kubelet se debe modificar y volver a cargar. Puedes ejecutar kubectl delete -f patch.yaml de forma segura para limpiar los recursos de DaemonSet.

  • GKE en VMware que se ejecuta en Windows no admite este parche.

  • Kubernetes no realiza ninguna verificación de autenticación o autorización en este puerto no seguro 10255. Si la habilitas, los datos de kubelet quedarán desprotegidos y expuestos a usuarios no autorizados. El kubelet entrega el mismo extremo en el puerto autenticado más seguro, 10250, considera migrar a ese puerto seguro.