הפעלת יציאה לקריאה בלבד של kubelet

סקירה כללית

במאמר הזה מוסבר איך לפרוס DaemonSet עם הרשאות בכל צומת של Google Distributed Cloud כדי לשנות את הפרמטרים של kubelet ולהפעיל יציאות לקריאה בלבד. בגרסה 1.16 ואילך, יציאת kubelet לקריאה בלבד מושבתת כברירת מחדל.

דרישות מוקדמות

לפני שמריצים את סקריפט התיקון הבא, צריך לוודא ש-Google Distributed Cloud תקין. אתם יכולים להשתמש בפתרון הזה כדי לתקן אשכולות אדמין ואשכולות משתמשים בגרסה 1.16 ומעלה.

יצירת קובץ DaemonSet

יוצרים ושומרים קובץ DaemonSet בשם patch.yaml בספרייה הנוכחית, עם התוכן הבא:

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"

עדכון מספר היציאה לקריאה בלבד

  • כדי לשנות את מספר היציאה, צריך לערוך ידנית את משתנה הסביבה KUBELET_READONLY_PORT בקובץ ה-YAML של DaemonSet.

  • יציאת ברירת המחדל לקריאה בלבד היא 10255, ואסור לבחור ביציאה 10250 כי היא תתנגש עם היציאה המאובטחת שהוגדרה מראש.

החלת תיקון על אשכול האדמין

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

תיקון של אשכול המשתמשים

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

שחזור

  • כדי להשבית את היציאה לקריאה בלבד, צריך לערוך ידנית את משתנה הסביבה KUBELET_READONLY_PORT בקובץ ה-YAML של DaemonSet.

  • אחרי ששומרים את השינויים, ה-DaemonSet יופעל מחדש כדי לשנות את kubelet בהתאם.

נקודות שחשוב לדעת

  • לתיקון הזה יש את אותו מחזור חיים כמו לאפליקציות צד שלישי שהתקנתם. אפשר להריץ אותו בכל שלב כפעולה ביום השני. אבל יכול להיות שהיא לא תישמר אחרי שתיצרו מחדש את האשכול. כדי שהשינוי הזה יישמר, צריך לפרוס את DaemonSet כשלב בפעולה שלאחר האתחול של Google Distributed Cloud.

  • אחרי ההרצה הראשונה, צריך לשנות את קובץ התצורה של kubelet ולטעון אותו מחדש. אפשר להריץ את הפקודה kubectl delete -f patch.yaml בבטחה כדי לנקות את משאבי DaemonSet.

  • ‫Google Distributed Cloud שפועל ב-Windows לא תומך בתיקון הזה.

  • ‫Kubernetes לא מבצעת בדיקות אימות או הרשאה ביציאה הלא מאובטחת הזו 10255. הפעלת ההגדרה הזו תשאיר את נתוני kubelet לא מוגנים וחשופים למשתמשים לא מורשים. ה-kubelet משרת את אותה נקודת קצה ביציאה 10250 המאובטחת יותר והמאומתת, לכן כדאי להעביר את התעבורה ליציאה המאובטחת הזו.