Menonaktifkan port hanya baca kubelet di cluster GKE


Halaman ini menunjukkan cara menonaktifkan port hanya baca kubelet yang tidak aman di cluster Google Kubernetes Engine (GKE) untuk mengurangi risiko akses tidak sah ke kubelet, dan cara memigrasikan aplikasi ke port yang lebih aman.

Di cluster Kubernetes, termasuk GKE, proses kubelet yang berjalan pada node menayangkan API hanya baca menggunakan port 10255 yang tidak aman. Kubernetes tidak melakukan pemeriksaan autentikasi atau otorisasi apa pun pada port ini. Kubelet menyalurkan endpoint yang sama pada port 10250 yang lebih aman dan diautentikasi.

Nonaktifkan port hanya baca kubelet dan alihkan beban kerja apa pun yang menggunakan port 10255 untuk menggunakan port 10250 yang lebih aman.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Persyaratan

  • Anda hanya dapat menonaktifkan port hanya baca kubelet yang tidak aman di GKE versi 1.26.4-gke.500 atau yang lebih baru.

Periksa penggunaan port yang tidak aman dan migrasikan aplikasi

Sebelum Anda menonaktifkan port hanya baca yang tidak aman, migrasikan aplikasi apa pun yang sedang berjalan dan menggunakan port tersebut ke port hanya baca yang lebih aman. Workload yang mungkin memerlukan migrasi mencakup pipeline metrik kustom dan workload yang mengakses endpoint kubelet.

  • Untuk beban kerja yang memerlukan akses ke informasi yang disalurkan oleh kubelet API pada node, seperti metrik, gunakan port 10250.
  • Untuk beban kerja yang mendapatkan informasi Kubernetes menggunakan kubelet API pada node, seperti mencantumkan Pod pada node, gunakan Kubernetes API.

Memeriksa apakah aplikasi menggunakan port hanya baca kubelet yang tidak aman

Bagian ini menunjukkan cara memeriksa penggunaan port yang tidak aman di cluster Anda.

Periksa penggunaan port dalam mode Autopilot

Untuk memeriksa penggunaan port di cluster Autopilot, pastikan Anda memiliki setidaknya satu beban kerja yang bukan merupakan DaemonSet yang berjalan di cluster. Jika Anda melakukan langkah-langkah berikut di cluster Autopilot kosong, hasilnya mungkin tidak valid.

  1. Simpan manifes berikut sebagai read-only-port-metrics.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: node-metrics-printer-namespace
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: node-metrics-printer-role
    rules:
    - apiGroups:
      - ""
      resources:
      - nodes/metrics
      verbs:
      - get
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: node-metrics-printer-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: node-metrics-printer-role
    subjects:
    - kind: ServiceAccount
      name: node-metrics-printer-sa
      namespace: node-metrics-printer-namespace
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: node-metrics-printer-sa
      namespace: node-metrics-printer-namespace
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: node-metrics-printer
      namespace: node-metrics-printer-namespace
    spec:
      selector:
        matchLabels:
          app: node-metrics-printer
      template:
        metadata:
          labels:
            app: node-metrics-printer
        spec:
          serviceAccountName: node-metrics-printer-sa
          containers:
          - name: metrics-printer
            image: us-docker.pkg.dev/cloud-builders/ga/v1/curl:latest
            command: ["sh", "-c"]
            args:
            - 'while true; do curl -s --cacert "${CA_CERT}" -H "Authorization: Bearer $(cat ${TOKEN_FILE})" "https://${NODE_ADDRESS}:10250/metrics"|grep kubelet_http_requests_total; sleep 20; done'
            env:
            - name: CA_CERT
              value: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
            - name: TOKEN_FILE
              value: /var/run/secrets/kubernetes.io/serviceaccount/token
            - name: NODE_ADDRESS
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
    

    Manifes ini melakukan hal berikut:

    1. Membuat namespace dan menyiapkan peran RBAC untuk memungkinkan pembacaan metrik node.
    2. Men-deploy DaemonSet yang memeriksa metrik kubelet untuk port hanya baca yang tidak aman.
  2. Deploy manifes:

    kubectl create -f read-only-port-metrics.yaml
    
  3. Periksa log DaemonSet:

    kubectl logs --namespace=node-metrics-printer-namespace \
        --all-containers --prefix \
        --selector=app=node-metrics-printer
    

    Jika output menunjukkan hasil yang berisi string server_type=readonly, aplikasi akan menggunakan port hanya baca yang tidak aman.

Periksa penggunaan port pada mode Standar

Jalankan perintah berikut di minimal satu node di setiap kumpulan node di cluster Anda:

kubectl get --raw /api/v1/nodes/NODE_NAME/proxy/metrics | grep http_requests_total | grep readonly

Ganti NODE_NAME dengan nama node.

Jika beban kerja pada node menggunakan port hanya baca kubelet yang tidak aman, outputnya akan berisi entri dengan string server_type="readonly" seperti dalam contoh berikut:

kubelet_http_requests_total{long_running="false",method="GET",path="healthz",server_type="readonly"} 3
kubelet_http_requests_total{long_running="false",method="GET",path="metrics",server_type="readonly"} 2549
kubelet_http_requests_total{long_running="false",method="GET",path="metrics/probes",server_type="readonly"} 2546
kubelet_http_requests_total{long_running="false",method="GET",path="other",server_type="readonly"} 2
kubelet_http_requests_total{long_running="false",method="GET",path="pods",server_type="readonly"} 1
kubelet_http_requests_total{long_running="false",method="GET",path="stats",server_type="readonly"} 2549

Jika outputnya kosong, tidak ada aplikasi di node tersebut yang akan menggunakan port hanya baca yang tidak aman.

Bermigrasi dari port hanya baca kubelet yang tidak aman

Biasanya, memigrasikan aplikasi ke port aman melibatkan langkah-langkah berikut:

  1. Perbarui URL atau endpoint yang merujuk ke port hanya baca yang tidak aman untuk menggunakan port hanya baca yang aman. Misalnya, ubah http://203.0.113.104:10255 menjadi http://203.0.113.104:10250.

  2. Tetapkan sertifikat certificate authority (CA) klien HTTP ke sertifikat CA cluster. Untuk menemukan sertifikat ini, jalankan perintah berikut:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(masterAuth.clusterCaCertificate)"
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • LOCATION: lokasi cluster Anda.

Port yang diautentikasi 10250 mengharuskan Anda memberikan peran RBAC yang sesuai kepada subjek untuk mengakses resource tertentu. Untuk detailnya, dalam dokumentasi Kubernetes, lihat otorisasi kubelet.

Jika beban kerja Anda menggunakan endpoint /pods pada port hanya baca kubelet yang tidak aman, Anda harus memberikan izin RBAC nodes/proxy untuk mengakses endpoint pada port kubelet yang aman. nodes/proxy adalah izin canggih yang tidak dapat Anda berikan di cluster GKE Autopilot dan yang tidak boleh Anda berikan di cluster GKE Standard. Gunakan Kubernetes API dengan fieldSelector sebagai nama node.

Jika Anda menggunakan aplikasi pihak ketiga yang bergantung pada port hanya baca kubelet yang tidak aman, hubungi vendor aplikasi untuk mendapatkan petunjuk cara melakukan migrasi ke port aman 10250.

Contoh migrasi

Pertimbangkan Pod yang membuat kueri metrik dari port hanya baca kubelet yang tidak aman.

apiVersion: v1
kind: Pod
metadata:
  name: kubelet-readonly-example
spec:
  restartPolicy: Never
  containers:
  - name: kubelet-readonly-example
    image: us-docker.pkg.dev/cloud-builders/ga/v1/curl:latest
    command:
      - curl
      - http://$(NODE_ADDRESS):10255/metrics
    env:
    - name: NODE_ADDRESS
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP

Aplikasi ini melakukan hal berikut:

  • Menggunakan ServiceAccount default dalam namespace default
  • Menjalankan perintah curl terhadap endpoint /metrics pada node.

Untuk mengupdate Pod ini agar dapat menggunakan port aman 10250, lakukan langkah-langkah berikut:

  1. Buat ClusterRole dengan akses untuk mendapatkan metrik node:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: curl-authenticated-role
    rules:
    - apiGroups:
      - ""
      resources:
      - nodes/metrics
      verbs:
      - get
    
  2. Ikat ClusterRole ke identitas aplikasi Anda:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: curl-authenticated-role-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: curl-authenticated-role
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: default
    
  3. Perbarui perintah curl untuk menggunakan endpoint port aman dengan header otorisasi yang sesuai:

    apiVersion: v1
    kind: Pod
    metadata:
      name: kubelet-authenticated-example
    spec:
      restartPolicy: Never
      containers:
      - name: kubelet-readonly-example
        image: us-docker.pkg.dev/cloud-builders/ga/v1/curl:latest
        env:
        - name: NODE_ADDRESS
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        command:
        - sh
        - -c
        - 'curl -s --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization:
          Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://${NODE_ADDRESS}:10250/metrics'
    

Mengubah aturan firewall VPC

Jika Anda memperbarui workload untuk menggunakan port 10250, buat aturan firewall agar Pod di dalam cluster dapat mencapai port dalam rentang alamat IP node Anda. Aturan firewall harus melakukan hal berikut:

  • Izinkan traffic masuk ke port TCP 10250 pada rentang alamat IP node Anda dari rentang alamat IP Pod internal
  • Menolak traffic masuk ke port TCP 10250 pada rentang alamat IP node Anda dari internet publik.

Anda dapat menggunakan aturan firewall GKE default berikut sebagai template untuk parameter yang akan ditentukan dalam aturan baru:

  • gke-[cluster-name]-[cluster-hash]-inkubelet
  • gke-[cluster-name]-[cluster-hash]-exkubelet

Menonaktifkan port hanya baca yang tidak aman di cluster Autopilot

Anda dapat menonaktifkan port hanya baca kubelet yang tidak aman untuk cluster Autopilot baru dan yang sudah ada.

Nonaktifkan port hanya baca yang tidak aman di cluster Autopilot baru

Untuk menonaktifkan port hanya baca kubelet yang tidak aman saat membuat cluster Autopilot baru, gunakan flag --no-autoprovisioning-enable-insecure-kubelet-readonly-port, seperti dalam perintah berikut:

gcloud container clusters create-auto CLUSTER_NAME \
    --location=LOCATION \
    --no-autoprovisioning-enable-insecure-kubelet-readonly-port

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Autopilot baru Anda.
  • LOCATION: lokasi cluster Autopilot baru.

Nonaktifkan port hanya baca yang tidak aman di cluster Autopilot yang ada

Untuk menonaktifkan port hanya baca kubelet yang tidak aman di cluster Autopilot yang ada, gunakan flag --no-autoprovisioning-enable-insecure-kubelet-readonly-port, seperti dalam perintah berikut. Semua node baru dan yang sudah ada di cluster berhenti menggunakan port.

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --no-autoprovisioning-enable-insecure-kubelet-readonly-port

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster yang ada.
  • LOCATION: lokasi cluster yang ada.

Menonaktifkan port hanya baca yang tidak aman di cluster Standar

Anda dapat menonaktifkan port hanya baca kubelet yang tidak aman untuk seluruh cluster Standar atau untuk masing-masing kumpulan node. Sebaiknya nonaktifkan port untuk seluruh cluster.

Jika Anda menggunakan penyediaan otomatis node, kumpulan node yang disediakan secara otomatis akan mewarisi setelan port yang Anda tentukan pada tingkat cluster. Secara opsional, Anda dapat menentukan setelan berbeda untuk kumpulan node yang disediakan otomatis, tetapi sebaiknya nonaktifkan port di semua node dalam cluster Anda.

Anda juga dapat menggunakan file konfigurasi sistem node untuk menonaktifkan port hanya baca kubelet yang tidak aman secara deklaratif. Jika menggunakan file ini, Anda tidak dapat menggunakan perintah di bagian berikut untuk mengontrol setelan kubelet.

Nonaktifkan port hanya baca yang tidak aman di cluster Standar baru

Untuk menonaktifkan port hanya baca kubelet yang tidak aman di cluster Standar baru, gunakan flag --no-enable-insecure-kubelet-readonly-port seperti dalam perintah berikut:

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --no-enable-insecure-kubelet-readonly-port

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Standard yang baru.
  • LOCATION: lokasi cluster Standar yang baru.

Secara opsional, Anda dapat menambahkan flag --no-autoprovisioning-enable-insure-kubelet-readonly-port untuk mengontrol setelan penyediaan otomatis node secara terpisah, tetapi kami tidak merekomendasikan pendekatan ini. Tanda ini memulai update berkelanjutan kumpulan node yang disediakan secara otomatis, yang dapat menyebabkan gangguan pada beban kerja yang berjalan.

Nonaktifkan port hanya baca yang tidak aman di cluster Standar yang ada

Untuk menonaktifkan port hanya baca kubelet yang tidak aman pada cluster Standar yang ada, gunakan flag --no-enable-insecure-kubelet-readonly-port seperti dalam perintah berikut. Kumpulan node baru tidak akan menggunakan port yang tidak aman. GKE tidak mengupdate node pool yang ada secara otomatis.

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --no-enable-insecure-kubelet-readonly-port

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Standar yang ada.
  • LOCATION: lokasi cluster Standar yang ada.

Menonaktifkan port hanya baca yang tidak aman di kumpulan node Standar

Sebaiknya tetapkan setelan port hanya baca di tingkat cluster dalam semua kasus. Jika Anda menonaktifkan port hanya baca di cluster yang sudah ada dan telah menjalankan kumpulan node, gunakan perintah berikut untuk menonaktifkan port di kumpulan node tersebut.

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --no-enable-insecure-kubelet-readonly-port

Ganti kode berikut:

  • NODE_POOL_NAME: nama node pool Anda.
  • CLUSTER_NAME: nama cluster.
  • LOCATION: lokasi cluster.

Memastikan port dinonaktifkan

Untuk memverifikasi bahwa port hanya baca kubelet yang tidak aman telah dinonaktifkan, jelaskan resource GKE.

Memeriksa status port di cluster Autopilot

Jalankan perintah berikut:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --flatten=nodePoolAutoConfig \
    --format="value(nodeKubeletConfig)"

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Autopilot.
  • LOCATION: lokasi cluster Autopilot.

Jika port dinonaktifkan, outputnya adalah sebagai berikut:

insecureKubeletReadonlyPortEnabled: false

Memeriksa status port di cluster Standar

Status port tersedia di kolom nodePoolDefaults.nodeConfigDefaults.nodeKubeletConfig saat Anda mendeskripsikan cluster menggunakan GKE API.

Di cluster Standar, Anda juga akan melihat kolom nodeConfig yang menetapkan nilai untuk status port hanya baca kubelet. Kolom nodeConfig tidak digunakan lagi dan hanya berlaku untuk kumpulan node default yang dibuat GKE saat Anda membuat cluster mode Standar baru. Status port di kolom nodeConfig yang tidak digunakan lagi tidak berlaku untuk kumpulan node lain dalam cluster.

Jalankan perintah berikut:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --flatten=nodePoolDefaults.nodeConfigDefaults \
    --format="value(nodeKubeletConfig)"

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Standar Anda.
  • LOCATION: lokasi cluster Standar.

Jika port dinonaktifkan, outputnya adalah sebagai berikut:

insecureKubeletReadonlyPortEnabled: false

Memeriksa status port dalam kumpulan node Standar

Jalankan perintah berikut:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster= CLUSTER_NAME \
    --location=LOCATION \
    --flatten=config \
    --format="value(kubeletConfig)"

Ganti kode berikut:

  • NODE_POOL_NAME: nama node pool Anda.
  • CLUSTER_NAME: nama cluster.
  • LOCATION: lokasi cluster.

Jika port dinonaktifkan, outputnya adalah sebagai berikut:

insecureKubeletReadonlyPortEnabled: false