Schreibgeschützten Kubelet-Port aktivieren

Übersicht

In diesem Dokument wird gezeigt, wie Sie ein privilegiertes DaemonSet auf jedem Knoten einer Google Distributed Cloud bereitstellen können, um kubelet-Parameter für die Aktivierung schreibgeschützter Ports zu ändern. In Version 1.16 und höher ist der schreibgeschützte Port für Kubelet standardmäßig deaktiviert.

Vorbereitung

Prüfen Sie, ob Google Distributed Cloud fehlerfrei ist, bevor Sie Folgendes patch-Skript ausführen. Sie können diese Lösung verwenden, um Administratorcluster und Nutzercluster der Version 1.16 zu patchen.

DaemonSet-Datei erstellen

Erstellen und speichern Sie eine DaemonSet-Datei namens patch.yaml in Ihrem aktuellen Verzeichnis mit folgendem Inhalt:

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"

Schreibgeschützte Portnummer aktualisieren

  • Bearbeiten Sie die Umgebungsvariable KUBELET_READONLY_PORT in der DaemonSet-YAML-Datei manuell, um die Portnummer zu ändern.

  • Der schreibgeschützte Standardport ist 10255. Sie sollten 10250 nicht auswählen, da dies mit dem vordefinierten sicheren Port in Konflikt steht.

Administratorcluster patchen

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

Nutzercluster patchen

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

Wiederherstellen

  • Bearbeiten Sie die Umgebungsvariable KUBELET_READONLY_PORT in der DaemonSet-YAML-Datei manuell, um den schreibgeschützten Port zu deaktivieren.

  • Nachdem Sie die Änderungen gespeichert haben, wird das DaemonSet noch einmal ausgeführt, um das Kubelet entsprechend zu ändern.

Vorsichtsmaßnahmen

  • Dieser Patch hat den gleichen Lebenszyklus wie Ihre installierten Drittanbieter-Apps. Sie können ihn jeder Zeit als Day-2-Vorgang ausführen. Er bleibt aber möglicherweise nicht bestehen, nachdem Sie den Cluster neu erstellt haben. Stellen Sie dieses DaemonSet als Schritt im "Post-Initialisierungs"-Vorgang von Google Distributed Cloud bereit.

  • Nach der einmaligen Ausführung sollte die kubelet-Konfigurationsdatei geändert und neu geladen werden. Sie können kubectl delete -f patch.yaml sicher ausführen, um eine Bereinigung der DaemonSet-Ressourcen durchzuführen.

  • Google Distributed Cloud unter Windows unterstützt diesen Patch nicht.

  • Kubernetes führt auf diesem unsicheren Port 10255 keine Authentifizierungs- oder Autorisierungsprüfungen durch. Durch die Aktivierung bleiben kubelet-Daten ungeschützt und nicht autorisierten Nutzern ausgesetzt. Das Kubelet stellt denselben Endpunkt auf dem sichereren, authentifizierten Port 10250 bereit. Sie sollten zu diesem sicheren Port migrieren.