Attiva la porta di sola lettura di Kubelet

Panoramica

Questo documento mostra come eseguire il deployment di un DaemonSet privilegiato in ogni nodo di Google Distributed Cloud per modificare i parametri di kubelet in modo da attivare le porte di sola lettura. Nella versione 1.16 e successive, la porta di sola lettura di Kubelet è disabilitata per impostazione predefinita.

Prerequisito

Assicurati che Google Distributed Cloud sia in stato operativo prima di eseguire il seguente script di patch. Puoi utilizzare questa soluzione per applicare patch ai cluster di amministrazione e ai cluster utente 1.16 e versioni successive.

Crea un file DaemonSet

Crea e salva un file DaemonSet denominato patch.yaml nella directory corrente con i seguenti contenuti:

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"

Aggiorna il numero di porta di sola lettura

  • Per modificare il numero di porta, modifica manualmente la variabile di ambiente KUBELET_READONLY_PORT nel file YAML di DaemonSet.

  • La porta di sola lettura predefinita è 10255. Non scegliere 10250 perché entrerà in conflitto con la porta sicura predefinita.

Esegui il patching del cluster di amministrazione

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

Esegui il patching del cluster utente

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

Ripristina

  • Per disattivare la porta di sola lettura, modifica manualmente la variabile di ambiente KUBELET_READONLY_PORT nel file YAML di DaemonSet.

  • Dopo aver salvato le modifiche, il DaemonSet verrà eseguito di nuovo per modificare il kubelet di conseguenza.

Limitazioni

  • Questa patch ha lo stesso ciclo di vita delle app di terze parti installate. Puoi eseguirla in qualsiasi momento come operazione del secondo giorno. Tuttavia, potrebbe non essere mantenuto dopo la nuova creazione del cluster. Per rendere permanente questa modifica, esegui il deployment di questo DaemonSet come passaggio nell'azione di post-inizializzazione di Google Distributed Cloud.

  • Dopo l'esecuzione una volta, il file di configurazione di kubelet deve essere modificato e caricato di nuovo. Puoi eseguire kubectl delete -f patch.yaml in tutta sicurezza per ripulire le risorse DaemonSet.

  • Google Distributed Cloud in esecuzione su Windows non supporta questa patch.

  • Kubernetes non esegue controlli di autenticazione o autorizzazione su questa porta non sicura 10255. Se la attivi, i dati di kubelet rimarranno non protetti ed esposti a utenti non autorizzati. Se kubelet serve lo stesso endpoint sulla porta autenticata più sicura 10250, valuta la possibilità di eseguire la migrazione a questa porta sicura.