Mengaktifkan port hanya baca kubelet

Ringkasan

Dokumen ini menunjukkan cara men-deploy DaemonSet dengan hak istimewa di setiap node Google Distributed Cloud untuk mengubah parameter kubelet guna mengaktifkan port hanya baca. Pada versi 1.16 dan yang lebih baru, port hanya baca kubelet dinonaktifkan secara default.

Prasyarat

Pastikan Google Distributed Cloud Anda responsif sebelum menjalankan skrip patch berikut. Anda dapat menggunakan solusi ini untuk mem-patch cluster admin dan cluster pengguna versi 1.16 dan yang lebih baru.

Membuat file DaemonSet

Buat dan simpan file DaemonSet bernama patch.yaml di direktori Anda saat ini, dengan konten berikut:

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"

Memperbarui nomor port hanya baca

  • Untuk mengubah nomor port, edit variabel lingkungan KUBELET_READONLY_PORT secara manual di YAML DaemonSet.

  • Port hanya baca default adalah 10255, Anda tidak boleh memilih 10250 karena akan bertentangan dengan port aman yang telah ditentukan sebelumnya.

Menambahkan patch cluster admin

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

Menambahkan patch pada cluster pengguna

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

Pulihkan

  • Untuk menonaktifkan port hanya baca, edit variabel lingkungan KUBELET_READONLY_PORT secara manual di YAML DaemonSet.

  • Setelah Anda menyimpan perubahan, DaemonSet akan dijalankan kembali untuk memodifikasi kubelet sesuai dengan itu.

Peringatan

  • Patch ini memiliki siklus proses yang sama dengan aplikasi pihak ketiga yang Anda instal. Anda dapat menjalankannya kapan saja sebagai operasi hari ke-2. Namun, cluster mungkin tidak akan dipertahankan setelah Anda membuat ulang cluster. Agar perubahan ini persisten, deploy DaemonSet ini sebagai langkah dalam tindakan pasca-inisialisasi Google Distributed Cloud.

  • Setelah dijalankan sekali, file konfigurasi kubelet harus diubah dan dimuat ulang. Anda dapat menjalankan kubectl delete -f patch.yaml dengan aman untuk membersihkan resource DaemonSet.

  • Google Distributed Cloud yang berjalan di Windows tidak mendukung patch ini.

  • Kubernetes tidak melakukan pemeriksaan autentikasi atau otorisasi apa pun pada port 10255 yang tidak aman ini. Mengaktifkannya akan membuat data kubelet tidak terlindungi dan terekspos ke pengguna yang tidak sah. Kubelet menyalurkan endpoint yang sama di port 10250 yang lebih aman dan diautentikasi. Pertimbangkan untuk bermigrasi ke port yang aman tersebut.