Halaman ini menunjukkan cara menonaktifkan porta hanya baca kubelet yang tidak aman di Cluster Google Kubernetes Engine (GKE) untuk mengurangi risiko akses tanpa izin ke kubelet, dan cara memigrasikan aplikasi ke porta yang lebih aman.
Di cluster Kubernetes, termasuk GKE, proses kubelet
yang berjalan pada node melayani API hanya baca menggunakan port 10255
yang tidak aman.
Kubernetes tidak melakukan pemeriksaan autentikasi atau otorisasi
porta. Kubelet melayani endpoint yang sama pada
port 10250
.
Nonaktifkan port hanya baca kubelet dan alihkan workload 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. Mengaktifkan Google Kubernetes Engine API
- Jika ingin menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi
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.
Memeriksa penggunaan port yang tidak aman dan memigrasikan aplikasi
Sebelum Anda menonaktifkan port hanya baca yang tidak aman, migrasikan file yang sedang berjalan aplikasi yang menggunakan porta ke porta {i>read-only<i} yang lebih aman. Workload yang mungkin memerlukan migrasi, termasuk pipeline metrik kustom dan workload mengakses endpoint kubelet.
- Untuk workload yang memerlukan akses ke informasi yang dilayani oleh kubelet API
pada node, seperti metrik, gunakan port
10250
. - Untuk workload yang mendapatkan informasi Kubernetes menggunakan kubelet API pada sendiri, seperti membuat daftar Pod pada node, gunakan Kubernetes API.
Periksa apakah aplikasi menggunakan port hanya baca kubelet yang tidak aman
Bagian ini menunjukkan cara memeriksa penggunaan port yang tidak aman di cluster Anda.
Memeriksa penggunaan port dalam mode Autopilot
Untuk memeriksa penggunaan port di cluster Autopilot, pastikan Anda memiliki setidaknya satu workload yang bukan DaemonSet yang berjalan di cluster. Jika Anda lakukan langkah-langkah berikut pada cluster Autopilot kosong, hasilnya mungkin tidak valid.
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:
- Membuat namespace dan menyiapkan peran RBAC untuk memungkinkan pembacaan node metrik.
- Men-deploy DaemonSet yang memeriksa metrik kubelet untuk porta hanya-baca yang tidak aman.
Deploy manifes:
kubectl create -f read-only-port-metrics.yaml
Periksa log DaemonSet:
kubectl logs --namespace=node-metrics-printer-namespace \ --all-containers --prefix \ --selector=app=node-metrics-printer
Jika output memiliki hasil yang berisi string
server_type=readonly
, aplikasi menggunakan porta {i>read-only<i} yang tidak aman.
Memeriksa penggunaan port pada mode Standar
Jalankan perintah berikut setidaknya pada satu node di setiap node pool di :
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 porta hanya baca kubelet yang tidak aman, output
berisi entri dengan {i>string<i} 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 output-nya kosong, tidak ada aplikasi di node tersebut yang menggunakan metode porta {i>read-only<i}.
Bermigrasi dari port hanya baca kubelet yang tidak aman
Biasanya, memigrasikan aplikasi ke porta aman melibatkan hal-hal berikut langkah:
Perbarui URL atau endpoint yang merujuk ke port hanya baca yang tidak aman untuk digunakan porta hanya baca yang aman. Sebagai misalnya, ubah
http://203.0.113.104:10255
menjadihttp://203.0.113.104:10250
.Tetapkan sertifikat certificate authority (CA) klien HTTP ke sertifikat CA cluster. Untuk menemukan sertifikat ini, jalankan perintah berikut 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 terautentikasi 10250
mengharuskan Anda memberikan RBAC yang sesuai
peran kepada subjek untuk
mengakses sumber daya tertentu. Untuk mengetahui detailnya, di
dokumentasi Kubernetes, lihat
otorisasi kubelet.
/pods
di kubelet hanya baca yang tidak aman
port, Anda harus memberikan izin RBAC nodes/proxy
untuk mengakses endpoint
pada porta kubelet yang aman. nodes/proxy
adalah izin akses yang kuat yang Anda
tidak dapat diberikan di cluster GKE Autopilot dan Anda
sebaiknya tidak dilakukan di cluster GKE Standard. Gunakan
Kubernetes API dengan fieldSelector
untuk nama node.
Jika Anda menggunakan aplikasi pihak ketiga yang bergantung pada kubelet yang tidak aman
port hanya-baca, hubungi vendor aplikasi untuk mendapatkan petunjuk migrasi
untuk mengamankan port 10250
.
Contoh migrasi
Pertimbangkan Pod yang mengkueri 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
di namespacedefault
- Menjalankan perintah
curl
terhadap endpoint/metrics
pada node.
Untuk mengupdate Pod ini agar dapat menggunakan port aman 10250
, lakukan langkah-langkah berikut:
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
Ikat ClusterRole dengan 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
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 sehingga Pod
di cluster dapat mencapai porta
di rentang alamat IP node Anda. {i>Firewall<i}
aturan harus melakukan hal berikut:
- Mengizinkan traffic masuk ke port TCP
10250
pada rentang alamat IP node Anda dari rentang alamat IP Pod internal - Tolak traffic masuk ke port TCP
10250
pada rentang alamat IP node Anda dari internet publik.
Anda dapat menggunakan aturan firewall GKE default sebagai template untuk parameter yang akan ditentukan dalam aturan baru.:
gke-[cluster-name]-[cluster-hash]-inkubelet
gke-[cluster-name]-[cluster-hash]-exkubelet
Nonaktifkan port hanya baca yang tidak aman di cluster Autopilot
Anda dapat menonaktifkan port hanya baca kubelet yang tidak aman untuk port baru dan lama Cluster Autopilot.
Nonaktifkan port hanya baca yang tidak aman di cluster Autopilot baru
Untuk menonaktifkan port hanya-baca kubelet yang tidak aman saat Anda membuat
cluster Autopilot, gunakan
Flag --no-autoprovisioning-enable-insecure-kubelet-readonly-port
, seperti di
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 Autopilot baru Anda .
Nonaktifkan port hanya baca yang tidak aman pada cluster Autopilot yang ada
Untuk menonaktifkan port hanya baca kubelet yang tidak aman pada Autopilot yang ada
, gunakan
Flag --no-autoprovisioning-enable-insecure-kubelet-readonly-port
, seperti di
perintah berikut. Semua node baru dan yang sudah ada di cluster berhenti menggunakan
porta.
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION \
--no-autoprovisioning-enable-insecure-kubelet-readonly-port
Ganti kode berikut:
CLUSTER_NAME
: nama project yang ada .LOCATION
: lokasi yang ada .
Nonaktifkan port hanya baca yang tidak aman di cluster Standar
Anda dapat menonaktifkan port hanya baca kubelet yang tidak aman untuk seluruh Standard atau untuk kumpulan node individual. Sebaiknya nonaktifkan port untuk seluruh cluster.
Jika Anda menggunakan penyediaan otomatis node, kumpulan node yang disediakan otomatis akan mewarisi setelan port yang ditentukan pada level cluster. Anda dapat memilih menentukan setelan berbeda untuk kumpulan node yang disediakan otomatis, tetapi sebaiknya Anda menonaktifkan porta di semua node dalam cluster.
Anda juga dapat menggunakan file konfigurasi sistem node untuk menonaktifkan secara deklaratif porta {i>read-only<i} kubelet yang tidak aman. Jika Anda menggunakan 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 pada Standard baru
gunakan flag --no-enable-insecure-kubelet-readonly-port
seperti di
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 Standard baru .
Jika ingin, Anda dapat menambahkan
Flag --no-autoprovisioning-enable-insure-kubelet-readonly-port
ke secara terpisah
mengontrol setelan penyediaan otomatis node, tetapi kami tidak merekomendasikan pendekatan ini.
Tanda ini memulai update berkelanjutan untuk kumpulan node yang disediakan otomatis, yang
dapat menyebabkan gangguan pada
workload Anda yang sedang berjalan.
Nonaktifkan port hanya baca yang tidak aman di cluster Standar yang ada
Untuk menonaktifkan port hanya baca kubelet yang tidak aman pada Standard yang ada
gunakan flag --no-enable-insecure-kubelet-readonly-port
seperti di
perintah berikut. Semua kumpulan node baru tidak akan menggunakan port yang tidak aman.
GKE tidak otomatis mengupdate node pool yang ada.
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION \
--no-enable-insecure-kubelet-readonly-port
Ganti kode berikut:
CLUSTER_NAME
: nama Standar yang ada .LOCATION
: lokasi Standar yang ada .
Menonaktifkan port hanya baca yang tidak aman di kumpulan node Standar
Sebaiknya tetapkan setelan port hanya baca pada tingkat cluster di semua penggunaan. Jika Anda menonaktifkan port hanya baca pada cluster yang ada dan menjalankan kumpulan node, gunakan perintah berikut untuk menonaktifkan porta pada kumpulan node.
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 Google Cloud Platform.
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 Autopilot Anda .LOCATION
: lokasi Autopilot Anda .
Jika port dinonaktifkan, output-nya adalah sebagai berikut:
insecureKubeletReadonlyPortEnabled: false
Memeriksa status port di cluster Standar
Status porta ini tersedia di
Kolom nodePoolDefaults.nodeConfigDefaults.nodeKubeletConfig
saat Anda menjelaskan
cluster Anda menggunakan GKE API.
Di cluster Standar, Anda juga akan melihat kolom nodeConfig
yang menyetel
untuk status porta {i>read-only<i} kubelet. Kolom nodeConfig
tidak digunakan lagi dan hanya berlaku untuk node pool default yang
yang dibuat saat Anda membuat cluster mode Standar baru. Status
port di kolom nodeConfig
yang tidak digunakan lagi tidak berlaku untuk kumpulan node lainnya
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 Standar Anda .LOCATION
: lokasi Standard Anda .
Jika port dinonaktifkan, output-nya adalah sebagai berikut:
insecureKubeletReadonlyPortEnabled: false
Memeriksa status port di 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, output-nya adalah sebagai berikut:
insecureKubeletReadonlyPortEnabled: false