Activer le port en lecture seule du kubelet

Présentation

Ce document explique comment déployer un DaemonSet privilégié dans chaque nœud de Google Distributed Cloud pour modifier les paramètres du kubelet afin d'activer les ports en lecture seule. À partir de la version 1.16, le port en lecture seule du kubelet est désactivé par défaut.

Prérequis

Assurez-vous que votre Google Distributed Cloud est opérationnel avant d'exécuter le script de correctif suivant. Vous pouvez utiliser cette solution pour corriger des clusters d'administrateur et des clusters d'utilisateur à partir de la version 1.16.

Créer un fichier DaemonSet

Créez et enregistrez un fichier DaemonSet nommé patch.yaml dans votre répertoire actuel, avec le contenu suivant:

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"

Mettre à jour le numéro de port en lecture seule

  • Pour modifier le numéro de port, modifiez manuellement la variable d'environnement KUBELET_READONLY_PORT dans le fichier YAML du DaemonSet.

  • Le port en lecture seule par défaut est 10255. Vous ne devez pas choisir 10250, car cela créerait un conflit avec le port sécurisé prédéfini.

Appliquer un correctif au cluster d'administrateur

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

Appliquer un correctif au cluster d'utilisateur

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

Restaurer

  • Pour désactiver le port en lecture seule, modifiez manuellement la variable d'environnement KUBELET_READONLY_PORT dans le fichier YAML du DaemonSet.

  • Une fois les modifications enregistrées, le DaemonSet sera réexécuté pour modifier le kubelet en conséquence.

Mises en garde

  • Le cycle de vie de ce correctif est identique à celui de vos applications tierces installées. Vous pouvez l'exécuter à tout moment en tant qu'opération du deuxième jour. Toutefois, il se peut qu'elle ne persiste pas une fois le cluster recréé. Pour rendre cette modification persistante, déployez ce DaemonSet en tant qu'étape de l'action post-initialisation de Google Distributed Cloud.

  • Après une exécution unique, le fichier de configuration du kubelet doit être modifié et actualisé. Vous pouvez exécuter kubectl delete -f patch.yaml en toute sécurité pour nettoyer les ressources DaemonSet.

  • Google Distributed Cloud exécuté sous Windows n'est pas compatible avec ce correctif.

  • Kubernetes n'effectue aucune vérification d'authentification ou d'autorisation sur ce port non sécurisé 10255. Si vous l'activez, les données du kubelet ne seront pas protégées et seront exposées aux utilisateurs non autorisés. Le kubelet dessert le même point de terminaison sur le port authentifié plus sécurisé 10250. Envisagez de migrer vers ce port sécurisé.