Bagian dari dokumentasi Kubernetes ini berisi referensi-referensi.
1 - Glosarium
2 - Kubeadm
Kubeadm adalah fitur yang dibuat untuk menyediakan kubeadm init dan kubeadm join sebagai praktik terbaik dengan "jalur cepat" untuk membuat klaster Kubernetes.
kubeadm melakukan tindakan yang diperlukan untuk membuat klaster minimum yang layak untuk aktif dan berjalan. Secara desain, ini hanya memperdulikan tentang bootstrap, bukan tentang mesin provisioning. Demikian pula, dengan instalasi berbagai addon atau tambahan yang bagus untuk dimiliki, seperti Dasbor Kubernetes, solusi pemantauan, dan tambahan khusus cloud, tidak termasuk dalam cakupan.
Sebaliknya, kita mengharapkan perangkat dengan tingkat yang lebih tinggi dan lebih disesuaikan untuk dibangun di atas kubeadm, dan idealnya, menggunakan kubeadm sebagai dasar dari semua penerapan untuk mempermudah pembuatan klaster yang sesuai.
kubeadm init untuk melakukan bootstrap pada node control-plane Kubernetes
kubeadm join untuk melakukan bootstrap worker node Kubernetes worker dan menggabungkannya ke dalam klaster
kubeadm upgrade untuk melakukan pembaruan klaster Kubernetes ke versi yang lebih baru
kubeadm config untuk mengonfigurasi klaster kamu untuk kubeadm upgrade, jika kamu menggunakan kubeadm v1.7.x atau dibawahnya untuk menginisialisasi klaster kamu
kubeadm token untuk mengatur token-token untuk kubeadm join
kubeadm reset untuk mengembalikan semua perubahan yang dibuat untuk host dengan kubeadm init atau kubeadm join
kubeadm alpha untuk melihat sekilas sekumpulan fitur yang ada untuk mengumpulkan feedback atau umpan balik dari komunitas
3 - Mengakses API
3.1 - Menggunakan Otorisasi RBAC
Role-based access control (RBAC) atau kontrol akses berbasis rol adalah metode pengaturan akses ke sumber daya komputer
atau jaringan berdasarkan rol pengguna individu dalam organisasimu.
Otorisasi RBAC menggunakan grup APIrbac.authorization.k8s.io untuk mengendalikan keputusan
otorisasi. Hal ini memungkinkanmu untuk mengonfigurasi kebijakan secara dinamis melalui
API Kubernetes.
Untuk mengaktifkan RBAC, jalankan server API dengan flag--authorization-mode diatur
dengan daftar yang dipisahkan koma yang menyertakan RBAC;
sebagai contoh:
API RBAC mendeklarasikan empat jenis objek Kubernetes: Role, ClusterRole,
RoleBinding dan ClusterRoleBinding. kamu bisa mendeskripsikan beberapa objek, atau mengubahnya menggunakan alat seperti kubectl, seperti objek Kubernetes lain.
Perhatian:
Objek-objek ini, dengan disengaja, memaksakan pembatasan akses. Jika kamu melakukan perubahan
ke klaster saat kamu belajar, lihat
pencegahan eskalasi privilese dan bootstrapping
untuk memahami bagaimana pembatasan tersebut dapat mencegah kamu melakukan beberapa perubahan.
Role dan ClusterRole
Sebuah Role RBAC atau ClusterRole memuat aturan yang mewakili sekumpulan izin.
Izin bersifat aditif (tidak ada aturan "tolak").
Sebuah Role selalu mengatur izin dalam Namespace tertentu;
ketika kamu membuat Role, kamu harus menentukan Namespace tempat Role tersebut berada.
ClusterRole, sebaliknya, adalah sumber daya tanpa Namespace. Sumber daya tersebut memiliki nama yang berbeda (Role
dan ClusterRole) karena objek Kubernetes selalu harus menggunakan Namespace atau tanpa Namespace;
tidak mungkin keduanya.
ClusterRole memiliki beberapa kegunaan. Kamu bisa menggunakan ClusterRole untuk:
mendefinisikan izin pada sumber daya dalam Namespace dan diberikan dalam sebuah Namespace atau lebih
mendefinisikan izin pada sumber daya dalam Namespace dan diberikan dalam seluruh Namespace
mendefinisikan izin pada sumber daya dalam lingkup klaster
Jika kamu ingin mendefinisikan sebuah rol dalam Namespace, gunakan Role; jika kamu ingin mendefinisikan
rol di level klaster, gunakan ClusterRole.
Contoh Role
Berikut adalah contoh Role dalam Namespace bawaan yang dapat digunakan
untuk memberikan akses baca pada Pod:
apiVersion:rbac.authorization.k8s.io/v1kind:Rolemetadata:namespace:defaultname:pod-readerrules:- apiGroups:[""]# "" mengindikasikan grup API intiresources:["pods"]verbs:["get","watch","list"]
Contoh ClusterRole
ClusterRole dapat digunakan untuk memberikan izin yang sama dengan Role.
Karena ClusterRole memiliki lingkup klaster, kamu juga dapat menggunakannya untuk memberikan akses ke:
berbagai endpoint non-sumber daya (seperti /healthz)
sumber daya Namespace (seperti Pod), di semua Namespace
Sebagai contoh: kamu bisa menggunakan ClusterRole untuk memungkinkan pengguna tertentu untuk menjalankan
kubectl get pods --all-namespaces.
Berikut adalah contoh ClusterRole yang dapat digunakan untuk memberikan akses baca pada
Secret di Namespace tertentu, atau di semua Namespace (tergantung bagaimana keterikatannya):
apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRolemetadata:# "namespace" dihilangkan karena ClusterRole tidak menggunakan Namespacename:secret-readerrules:- apiGroups:[""]## di tingkat HTTP, nama sumber daya untuk mengakses objek Secret# adalah "secrets"resources:["secrets"]verbs:["get","watch","list"]
Nama objek Role dan ClusterRole harus menggunakan nama path segment yang valid.
RoleBinding dan ClusterRoleBinding
Sebuah RoleBinding memberikan izin yang ditentukan dalam sebuah Role kepada pengguna atau sekelompok pengguna.
Ini menyimpan daftar subjek (pengguna, grup, atau ServiceAccount), dan referensi ke
Role yang diberikan.
RoleBinding memberikan izin dalam Namespace tertentu sedangkan ClusterRoleBinding
memberikan akses tersebut pada lingkup klaster.
RoleBinding dapat merujuk Role apa pun di Namespace yang sama. Atau, RoleBinding
dapat mereferensikan ClusterRole dan memasangkan ClusterRole tersebut ke Namespace dari RoleBinding.
Jika kamu ingin memasangkan ClusterRole ke semua Namespace di dalam klastermu, kamu dapat menggunakan
ClusterRoleBinding.
Nama objek RoleBinding atau ClusterRoleBinding harus valid menggunakan
nama path segment yang valid.
Contoh RoleBinding
Berikut adalah contoh dari RoleBinding yang memberikan Role "pod-reader" kepada pengguna "jane"
pada Namespace "default".
Ini memungkinkan "jane" untuk membaca Pod di Namespace "default".
apiVersion:rbac.authorization.k8s.io/v1# RoleBinding memungkinkan "jane" untuk membaca Pod di Namespace "default"# Kamu harus sudah memiliki Role bernama "pod-reader" di Namespace tersebut.kind:RoleBindingmetadata:name:read-podsnamespace:defaultsubjects:# Kamu bisa mencantumkan lebih dari satu "subjek"- kind:Username:jane# "name" peka huruf besar-kecilapiGroup:rbac.authorization.k8s.ioroleRef:# "roleRef" menentukan pengikatan (binding) ke Role / ClusterRolekind:Role# ini harus Role atau ClusterRolename:pod-reader# ini harus sesuai dengan nama Role atau ClusterRole yang ingin kamu gunakanapiGroup:rbac.authorization.k8s.io
RoleBinding juga bisa mereferensikan ClusterRole untuk memberikan izin yang didefinisikan di dalam
ClusterRole ke sumber daya di dalam Namespace RoleBinding. Referensi semacam ini
memungkinkan kamu menentukan sekumpulan Role yang umum di seluruh klastermu, lalu menggunakannya kembali di dalam
beberapa Namespace.
Sebagai contoh, meskipun RoleBinding berikut merujuk ke ClusterRole,
"dave" (subjek, peka kapital) hanya akan dapat membaca Secret di dalam Namespace "development",
karena Namespace RoleBinding (di dalam metadatanya) adalah "development".
apiVersion:rbac.authorization.k8s.io/v1# RoleBinding memungkinkan "dave" untuk membaca Secret di Namespace "development".# Kamu sudah harus memiliki ClusterRole bernama "secret-reader".kind:RoleBindingmetadata:name:read-secrets## Namespace dari RoleBinding menentukan di mana izin akan diberikan. # Ini hanya memberikan izin di dalam Namespace "development".namespace:developmentsubjects:- kind:Username:dave# Nama peka huruf besar-kecilapiGroup:rbac.authorization.k8s.ioroleRef:kind:ClusterRolename:secret-readerapiGroup:rbac.authorization.k8s.io
Contoh ClusterRoleBinding
Untuk memberikan izin di seluruh klaster, kamu dapat menggunakan ClusterRoleBinding.
ClusterRoleBinding berikut memungkinkan seluruh pengguna di dalam kelompok "manager" untuk
membaca Secret di berbagai Namespace.
apiVersion:rbac.authorization.k8s.io/v1# ClusterRoleBinding ini memungkinkan siapapun di dalam kelompok "manager" untuk membaca Secret di berbagai Namespace.kind:ClusterRoleBindingmetadata:name:read-secrets-globalsubjects:- kind:Groupname:manager# Nama peka kapitalapiGroup:rbac.authorization.k8s.ioroleRef:kind:ClusterRolename:secret-readerapiGroup:rbac.authorization.k8s.io
Setelah kamu membuat ClusterRoleBinding, kamu tidak dapat mengganti Role atau ClusterRole yang dirujuk.
Jika kamu mencoba mengganti roleRef dari sebuah ClusterRoleBinding, kamu akan mendapatkan galat validasi. Jika kamu
tidak ingin mengganti roleRef untuk sebuah ClusterRoleBinding, kamu harus menghapus objek ClusterRoleBinding tersebut dan membuat
sebuah pengganti.
Ada dua alasan untuk pembatasan tersebut:
Membuat roleRef menjadi tidak dapat diubah (immutable) memungkinkan pemberian izin update kepada seseorang pada objek ClusterRoleBinding yang ada,
sehingga mereka dapat mengelola daftar subjek, tanpa bisa berubah
Role yang diberikan kepada subjek tersebut.
ClusterRoleBinding dengan Role yang berbeda adalah ClusterRoleBinding yang berbeda secara fundamental.
Mengharuskan sebuah ClusterRoleBinding untuk dihapus/diciptakan kembali untuk mengubah roleRef akan
memastikan daftar lengkap subjek dalam ClusterRoleBinding akan diberikan
Role baru (sebagai langkah untuk mencegah modifikasi secara tidak sengaja hanya pada roleRef
tanpa memastikan semua subjek yang seharusnya diberikan izin pada Role baru).
Utilitas baris perintah kubectl auth reconcile membuat atau memperbarui berkas manifes yang mengandung objek RBAC,
dan menangani penghapusan dan pembuatan objek ikatan jika dibutuhkan untuk mengganti Role yang dirujuk.
Lihat penggunaan perintah dan contoh untuk informasi tambahan.
Mengacu pada sumber daya
Pada API Kubernetes, sebagian besar sumber daya diwakili dan diakses menggunakan representasi
nama objek, seperti pods untuk Pod. RBAC mengacu pada sumber daya yang menggunakan nama yang persis sama
dengan yang muncul di URL untuk berbagai endpoint API yang relevan.
Beberapa Kubernetes APIs melibatkan
subresource, seperti log untuk Pod. Permintaan untuk log Pod terlihat seperti:
GET /api/v1/namespaces/{namespace}/pods/{name}/log
Dalam hal ini, pods adalah sumber daya Namespace untuk sumber daya Pod, dan log adalah sebuah
sub-sumber daya pods. Untuk mewakili ini dalam sebuah Role RBAC, gunakan garis miring (/) untuk
membatasi sumber daya dan sub-sumber daya. Untuk memungkinkan subjek membaca pods dan
juga mengakses sub-sumber daya log untuk masing-masing Pod tersebut, kamu dapat menulis:
Kamu juga dapat merujuk ke sumber daya dengan nama untuk permintaan tertentu melalui daftar resourceNames.
Ketika nama dicantumkan, permintaan dapat dibatasi untuk setiap objek sumber daya.
Berikut adalah contoh yang membatasi subjeknya hanya untuk melakukan get atau update pada sebuah
ConfigMap bernama my-configmap:
apiVersion:rbac.authorization.k8s.io/v1kind:Rolemetadata:namespace:defaultname:configmap-updaterrules:- apiGroups:[""]## pada level HTTP, nama sumber daya untuk mengakses objek ConfigMap# adalah "configmaps"resources:["configmaps"]resourceNames:["my-configmap"]verbs:["update","get"]
Catatan:
Kamu tidak dapat membatasi permintaan create atau deletecollection dengan nama sumber daya. Untuk create,
keterbatasan ini dikarenakan nama objek tidak diketahui pada waktu otorisasi.
ClusterRole gabungan
Kamu dapat mengumpulkan beberapa ClusterRole menjadi satu ClusterRole gabungan.
Pengontrol, yang berjalan sebagai bagian dari control plane klaster, mengamati objek ClusterRole
dengan aggregationRule. AggregationRule mendefinisikan
Selector label yang digunakan oleh pengontrol untuk mencocokkan objek ClusterRole lain
yang harus digabungkan ke dalam rules.
Berikut adalah contoh ClusterRole gabungan:
apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRolemetadata:name:monitoringaggregationRule:clusterRoleSelectors:- matchLabels:rbac.example.com/aggregate-to-monitoring:"true"rules:[]# Control plane secara otomatis mengisi rules
Jika kamu membuat ClusterRole baru yang cocok dengan label Selector dari ClusterRole gabungan yang ada,
maka perubahan itu akan memicu penambahan aturan baru ke dalam ClusterRole gabungan.
Berikut adalah contoh yang menambahkan aturan ke ClusterRole "monitoring", dengan membuat sebuah
ClusterRole lain berlabel rbac.example.com/aggregate-to-monitoring: true.
apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRolemetadata:name:monitoring-endpointslabels:rbac.example.com/aggregate-to-monitoring:"true"# ketika kamu membuat ClusterRole "monitoring-endpoints",# aturan di bawah ini akan ditambahkan ke ClusterRole "monitoring".rules:- apiGroups:[""]resources:["services","endpoints","pods"]verbs:["get","list","watch"]
Role bawaan pengguna menggunakan agregasi ClusterRole. Ini memungkinkan kamu,
sebagai administrator klaster, menambahkan aturan untuk sumber daya ubah suai, seperti yang dilayani oleh CustomResourceDefinitions
atau server API gabungan, untuk memperluas Role bawaan.
Sebagai contoh: ClusterRole berikut mengizinkan Role bawaan "admin" dan "edit" mengelola sumber daya ubah suai
bernama CronTab, sedangkan Role "view" hanya dapat membaca sumber daya CronTab.
Kamu dapat mengasumsikan bahwa objek CronTab dinamai "crontab" dalam URL yang terlihat oleh server API.
apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRolemetadata:name:aggregate-cron-tabs-editlabels:# Tambahkan izin berikut ke Role bawaan "admin" and "edit".rbac.authorization.k8s.io/aggregate-to-admin:"true"rbac.authorization.k8s.io/aggregate-to-edit:"true"rules:- apiGroups:["stable.example.com"]resources:["crontabs"]verbs:["get","list","watch","create","update","patch","delete"]---kind:ClusterRoleapiVersion:rbac.authorization.k8s.io/v1metadata:name:aggregate-cron-tabs-viewlabels:# Tambahkan izin berikut ke Role bawaan "view" rbac.authorization.k8s.io/aggregate-to-view:"true"rules:- apiGroups:["stable.example.com"]resources:["crontabs"]verbs:["get","list","watch"]
Contoh Role
Contoh berikut adalah potongan dari objek Role atau ClusterRole yang hanya menampilkan
bagian rules.
Mengizinkan pembacaan sumber daya "pods" pada grup API inti:
rules:- apiGroups:[""]## pada tingkat HTTP, nama dari sumber daya untuk mengakses objek Pod# adalah "pods"resources:["pods"]verbs:["get","list","watch"]
Mengizinkan pembacaan/penulisan Deployment (pada tingkat HTTP: objek dengan "deployments"
di bagian sumber daya dari URL) pada masing-masing grup API "extensions" dan "apps":
rules:- apiGroups:["extensions","apps"]## pada tingkat HTTP, nama dari sumber daya untuk mengakses objek Deployment# adalah "deployments"resources:["deployments"]verbs:["get","list","watch","create","update","patch","delete"]
Mengizinkan pembacaan pada Pods pada grup API inti, dan juga serta pembacaan atau penulisan Job
di grup API "batch" atau "extensions":
rules:- apiGroups:[""]## pada tingkat HTTP, nama dari sumber daya untuk mengakses objek Pod# adalah "pods"resources:["pods"]verbs:["get","list","watch"]- apiGroups:["batch","extensions"]## pada tingkat HTTP, nama dari sumber daya untuk mengakses objek Job# adalah "jobs"resources:["jobs"]verbs:["get","list","watch","create","update","patch","delete"]
Mengizinkan pembacaan ConfigMap bernama "my-config" (harus terikat dengan suatu
RoleBinding untuk membatasi ke satu ConfigMap di satu Namespace):
rules:- apiGroups:[""]## pada tingkat HTTP, nama dari sumber daya untuk mengakses objek ConfigMap# adalah "configmaps" resources:["configmaps"]resourceNames:["my-config"]verbs:["get"]
Mengizinkan pembacaan sumber daya "nodes" pada grup API inti (karena sebuah node
ada pada lingkup-klaster, ini harus berupa ClusterRole yang terikat dengan ClusterRoleBinding
agar efektif):
rules:- apiGroups:[""]## pada tingkat HTTP, nama dari sumber daya untuk mengakses objek Node# adalah "nodes"resources:["nodes"]verbs:["get","list","watch"]
Mengizinkan permintaan GET dan POST kepada endpoint non-sumber daya /healthz dan seluruh subpath
(harus berada di dalam ClusterRole yang terikat dengan ClusterRoleBinding agar efektif):
rules:- nonResourceURLs:["/healthz","/healthz/*"]# '*' in a nonResourceURL is a suffix glob matchverbs:["get","post"]
Mengacu pada subjek
RoleBinding atau ClusterRoleBinding mengikat sebuah Role ke subjek.
Subjek dapat berupa kelompok, pengguna atau ServiceAccounts.
Kubernetes merepresentasikan username sebagai string.
Ini bisa berupa: nama sederhana, seperti "alice"; email, seperti "bob@example.com";
atau ID pengguna numerik yang direpresentasikan sebagai string. Terserah kamu sebagai administrator klaster
untuk mengonfigurasi modul otentikasi
sehingga otentikasi menghasilkan username dalam format yang kamu inginkan.
Perhatian:
Awalan system: direservasi untuk sistem Kubernetes, jadi kamu harus memastikan
bahwa kamu tidak memiliki pengguna atau grup dengan nama yang dimulai dengan system: secara tidak sengaja.
Selain prefiks khusus ini, sistem otorisasi RBAC tidak memerlukan format apa pun
untuk nama pengguna.
Di Kubernetes, modul otentikasi menyediakan informasi grup.
Grup, seperti halnya pengguna, direpresentasikan sebagai string, dan string tersebut tidak memiliki format tertentu,
selain prefiks system: yang sudah direservasi.
ServiceAccount memiliki nama yang diawali dengan system:serviceaccount:, dan menjadi milik grup yang diawali dengan nama system:serviceaccounts:.
Catatan:
system:serviceaccount: (tunggal) adalah prefiks untuk username ServiceAccount.
system:serviceaccounts: (jamak) adalah prefiks untuk grup ServiceAccount.
Contoh RoleBinding
Contoh-contoh berikut ini hanya potongan RoleBinding yang hanya memperlihatkan
bagian subjects.
API membuat satu set objek ClusterRole dan ClusterRoleBinding bawaan.
Sebagian besar dari objek dengan prefiks system: menunjukkan bahwa sumber daya tersebut
secara langsung dikelola oleh control plane klaster. Seluruh ClusterRole dan ClusterRoleBinding dilabeli dengan
kubernetes.io/bootstrapping=rbac-defaults.
Perhatian:
Berhati-hatilah saat memodifikasi CLusterRole dan ClusterRoleBinding dengan nama yang
memiliki prefiks system:.
Modifikasi sumber daya ini dapat mengakibatkan malfungsi klaster.
Rekonsiliasi otomatis
Pada setiap penyalaan (start-up), server API memperbarui ClusterRole bawaan dengan berbagai izin yang hilang,
dan memperbarui ClusterRoleBinding bawaan dengan subjek yang hilang.
Ini memungkinkan klaster untuk memperbaiki modifikasi yang tidak disengaja, dan membantu menjaga Role
dan RoleBinding selalu terkini karena izin dan subjek berubah pada rilis terbaru Kubernetes.
Untuk menonaktifkan rekonsiliasi ini, atur anotasi rbac.authorization.kubernetes.io/autoupdate
pada ClusterRole bawaan atau RoleBinding bawaan menjadi false.
Ingat bahwa hilangnya izin dan subjek bawaan dapat mengakibatkan malfungsi klaster.
Rekonsiliasi otomatis diaktifkan secara bawaan jika pemberi otorisasi RBAC aktif.
Role diskoveri API
RoleBinding bawaan memberi otorisasi kepada pengguna yang tidak terotentikasi untuk membaca informasi API yang dianggap aman
untuk diakses publik (termasuk CustomResourceDefinitions). Untuk menonaktifkan akses anonim, tambahkan --anonymous-auth=false ke konfigurasi server API.
Untuk melihat konfigurasi Role ini melalui kubectl jalankan perintah:
kubectl get clusterroles system:discovery -o yaml
Catatan:
Jika kamu mengubah ClusterRole tersebut, maka perubahanmu akan ditimpa pada penyalaan ulang server API melalui
rekonsiliasi-otomatis. Untuk menghindari penulisan ulang tersebut, hindari mengubah Role secara manual,
atau nonaktifkan rekonsiliasi otomatis
Role diskoveri API Kubernetes RBAC
ClusterRole Bawaan
ClusterRoleBinding Bawaan
Deskripsi
system:basic-user
Grup system:authenticated
Mengizinkan pengguna hanya dengan akses baca untuk mengakses informasi dasar tentang diri mereka sendiri. Sebelum v1.14, Role ini juga terikat pada system:unauthenticated secara bawaan.
system:discovery
Grup system:authenticated
Mengizinkan akses baca pada berbagai endpoint diskoveri API yang dibutuhkan untuk menemukan dan melakukan negosiasi pada tingkat API. Sebelum v1.14, Role ini juga terikat pada system:unauthenticated secara bawaan.
system:public-info-viewer
Grup system:authenticated dan system:unauthenticated
Mengizinkan akses baca pada informasi yang tidak sensitif tentang klaster. Diperkenalkan pada Kubernetes v1.14.
Role pengguna
Beberapa ClusterRole bawaan tidak diawali dengan system:. Ini dimaksudkan untuk Role pengguna.
Ini termasuk Role super-user (cluster-admin), Role yang dimaksudkan untuk diberikan akses seluruh klaster dengan
menggunakan ClusterRoleBinding, dan Role yang dimaksudkan untuk diberikan pada Namespace tertentu
dengan menggunakan RoleBinding (admin, edit, view).
ClusterRole menggunakan ClusterRole gabungan untuk mengizinkan administrator untuk memasukan peraturan untuk sumber daya khusus pada ClusterRole ini. Untuk menambahkan aturan kepada Role admin, edit, atau view, buatlah sebuah CLusterRole
dengan satu atau lebih label berikut:
Mengizinkan akses super-user untuk melakukan berbagai aksi pada berbagai sumber daya.
Ketika digunakan pada ClusterRoleBinding, Role ini akan memberikan kendali penuh terhadap semua sumber daya pada klaster dan seluruh Namespace.
Ketika digunakan pada RoleBinding, Role ini akan memberikan kendali penuh terhadap setiap sumber daya pada Namespace RoleBinding, termasuk Namespace itu sendiri.
admin
Tidak ada
mengizinkan akses administrator, yang dimaksudkan untuk diberikan dalam sebuah Namespace menggunakan RoleBinding.
Jika digunakan dalam RoleBinding, ini memungkikan akses baca/tulis ke sebagian besar sumber daya di sebuah Namespace,
termasuk kemampuan untuk membuat Role dan RoleBinding dalam Namespace.
Role ini tidak memungkinkan akses tulis pada kuota sumber daya atau ke Namespace itu sendiri.
edit
Tidak ada
Mengizinkan akses baca/tulis pada seluruh objek dalam Namespace.
Role ini tidak memungkinkan untuk melihat dan mengubah Role dan RoleBinding.
Namun, Role ini memungkinkan untuk mengakses Secret dan menjalankan Pod seperti ServiceAccount dalam Namespace,
sehingga dapat digunakan untuk mendapatkan tingkat akses API dari setiap ServiceAccount di Namespace.
view
Tidak ada
Mengizinkan akses baca untuk melihat hampir seluruh objek dalam Namespace.
Ini tidak memungkinkan untuk melihat Role dan RoleBinding.
Role ini tidak memungkikan melihat Secret, karena pembacaan konten Secret memungkinkan
akses ke kredensial ServiceAccount dalam Namespace, yang akan memungkinkan akses API sebagai
ServiceAccount apapun di Namespace (bentuk eskalasi privilese).
Role komponen inti
ClusterRole Bawaan
ClusterRoleBinding Bawaan
Deskripsi
system:kube-scheduler
Pengguna system:kube-scheduler
Mengizinkan akses ke sumber daya yang dibutuhkan oleh komponen kube-scheduler.
system:volume-scheduler
Pengguna system:kube-scheduler
Mengizinkan akses ke sumber daya volume yang dibutuhkan oleh komponen kube-scheduler.
system:kube-controller-manager
Pengguna system:kube-controller-manager
Mengizinkan akses ke sumber daya yang dibutuhkan oleh komponen kube-controller-manager.
Izin yang diperlukan oleh masing-masing pengontrol dirincikan di Role pengontrol.
system:node
Tidak ada
Mengizinkan akses ke sumber daya yang dibutuhkan oleh kubelet, termasuk akses baca ke semua Secret, dan akses rulis ke semua objek status Pod.
Kamu dapat menggunakan pemberi otorisasi Node dan pugasan admisi NodeRestriction daripada Role system:node, dan mengizinkan pemberian akses API ke kubelet berdasarkan Pod yang dijadwalkan untuk berjalan di atasnya.
Role system:node hanya ada untuk kompatibilitas dengan klaster Kubernetes yang ditingkatkan dari versi sebelum v1.8.
system:node-proxier
Pengguna system:kube-proxy
Mengizinkan akses ke sumber daya yang dibutuhkan oleh komponen kube-proxy.
Role komponen lainnya
ClusterRole Bawaan
ClusterRoleBinding Bawaan
Deskripsi
system:auth-delegator
Tidak ada
Mengizinkan pemeriksaan otentikasi dan otorisasi yang didelegasikan.
Hal ini umumnya digunakan oleh pugasan server API untuk otentikasi dan otorisasi terpadu.
kube-controller-manager
pada Kubernetes menjalankan pengontrol
yang merupakan bawaan dari control plane Kubernetes. Ketika dijalankan dengan
--use-service-account-credentials, kube-controller-manager memulai setiap pengontrol
menggunakan ServiceAccount yang terpisah. Role yang sesuai tersedia untuk setiap
pengontrol bawaan, dengan prefiks system:controller:. Jika manajer pengontrol tidak
dimulai dengan --use-service-account-credentials, maka manajer pengontrol akan menjalankan
semua kontrol tertutup (control loop) menggunakan kredensialnya sendiri, yang harus
diberikan semua Role yang relevan. Role yang dimaksud termasuk:
API RBAC mencegah pengguna dari mengeskalasikan privilese dengan mengubah Role atau RoleBinding.
Karena hal ini diberlakukan pada level API, maka hal ini berlaku bahkan ketika pemberi otorisasi
RBAC tidak digunakan.
Pembatasan pada pembuatan dan pembaruan Role
Kamu hanya bisa membuat/memperbaru suatu Role jika setidaknya satu dari beberapa
hal di bawah ini terpenuhi:
Kamu telah mempunyai semua izin yang termuat dalam Role tersebut, pada lingkup yang sama
dengan objek yang diubah
(di seluruh klaster untuk sebuah ClusterRole, di dalam Namespace yang sama atau keseluruhan
klaster untuk sebuah Role).
Kamu diberikan izin eksplisit untuk melakukan escalate pada sumber daya roles atau
clusterroles di dalam grup API rbac.authorization.k8s.io.
Sebagai contoh, jika user-1 tidak memiliki kemampuan untuk mendaftar Secret di seluruh klaster,
maka user-1 tidak akan bisa membuat suatu ClusterRole yang memuat izin tersebut. Agar pengguna
bisa membuat/memperbaru Role:
Berikan sebuah Role yang memungkinkan mereka untuk membuat/memperbarui objek Role atau CLusterRole, sesuai keinginan.
Berikan mereka izin untuk menyertakan izin tertentu dalam Role yang mereka buat/perbarui:
secara implisit, dengan memberikan mereka izin tersebut (jika mereka mencoba untuk membuat atau mengubah sebuah Role atau ClusterRole dengan izin yang tidak mereka miliki, permintaan API akan dilarang)
atau secara eksplisit mengizinkan penentuan izin apa pun dalam sebuah Role atau ClusterRole dengan memberikan mereka izin untuk melakukan escalate pada sumber daya roles atau clusterroles di dalam grup API rbac.authorization.k8s.io
Pembatasan pada pembuatan dan pembaruan RoleBinding
Kamu hanya bisa membuat/memperbarui suatu RoleBinding jika kamu telah mempunyai semua izin yang
terdapat pada Role yang diacu (di dalam lingkup yang sama dengan RoleBinding) atau jika
kamu telah terotorisasi untuk melakukan bind pada role yang diacu.
Sebagai contoh, jika user-1 tidak mempunyai kemampuan untuk mendaftar Secret di seluruh klaster,
maka user-1 tidak akan bisa membuat sebuah ClusterRoleBinding dengan Role yang memberikan
izin tersebut. Agar pengguna bisa membuat/memperbarui RoleBinding:
Berikan sebuah Role yang mengizinkan mereka untuk membuat/memperbarui objek RoleBinding atau ClusterRoleBinding, sesuai keinginan.
Berikan mereka izin yang dibutuhkan untuk RoleBinding tertentu:
secara implisit, dengan memberikan mereka izin yang yang termuat pada Role yang dimaksud
secara eksplisit, dengan memberikan mereka izin untuk melakukan bind pada Role (atau ClusterRole) tertentu
Sebagai contoh, ClusterRole dan RoleBinding berikut akan memungkinkan user-1 untuk memberikan Role admin, edit, dan view kepada pengguna lain di dalam Namespace user-1-namespace:
Ketika melakukan bootstrapping Role dan RoleBinding yang pertama, pengguna awal perlu memberikan
izin yang belum mereka miliki.
Untuk melakukan bootstrapping Role dan RoleBinding awal:
Gunakan kredensial dengan grup "system:masters" yang terikat ke Role super-user "cluster-admin" oleh RoleBinding bawaan.
Jika server API dijalankan dengan porta tidak aman diaktifkan (--insecure-port), kamu juga bisa membuat panggilan API via porta tersebut, yang tidak memberlakukan otentikasi atau otorisasi.
Utilitas baris perintah
kubectl create role
Membuat sebuah objek Role yang mendefinisikan izin di dalam sebuah Namespace. Contoh:
Membuat sebuah Role bernama "pod-reader" yang memungkinkan pengguna untuk melakukan get, watch dan list pada Pod:
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
Membuat sebuah Role bernama "pod-reader" dengan resourceNames yang ditentukan:
kubectl create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
Membuat sebuah Role bernama "foo" dengan apiGroups yang ditentukan:
kubectl create role foo --verb=get,list,watch --resource=replicasets.apps
Membuat sebuah Role bernama "foo" dengan izin sub-sumber daya:
kubectl create role foo --verb=get,list,watch --resource=pods,pods/status
Membuat sebuah Role bernama "my-component-lease-holder" dengan izin untuk mendapatkan/memperbarui suatu sumber daya dengan nama tertentu:
kubectl create role my-component-lease-holder --verb=get,list,watch,update --resource=lease --resource-name=my-component
kubectl create clusterrole
Membuat sebuah ClusterRole. Contoh:
Membuat sebuah ClusterRole bernama "pod-reader" yang memungkinkan pengguna untuk merlakukan get, watch dan list pada Pod:
Membuat atau memperbarui objek API rbac.authorization.k8s.io/v1 dari suatu berkas manifes.
Objek yang hilang dibuat, dan Namespace dibuat untuk objek dengan Namespace jika diperlukan.
Role yang sudah ada diperbarui untuk menyertakan izin pada objek masukan,
dan menghilangkan izin tambahan jika --remove-extra-permissions ditetapkan.
RoleBinding yang sudah ada diperbarui untuk menyertakan subjek pada objek masukan,
dan menghapus subjek tambahan jika --remove-extra-subjects ditetapkan.
Contoh:
Mencoba menerapkan sebuah berkas manifes dari objek RBAC, menampilkan perubahan yang akan dibuat:
Kebijakan RBAC bawaan memberikan izin terbatas ke komponen control plane, Node, dan pengontrol,
akan tetapi tidak memberikan izin ke ServiceAccount di luar Namespace kube-system
(di luar izin diskoveri yang diberikan kepada semua pengguna terotentikasi).
Hal ini memungkinkan kamu untuk memberika Role tertentu ke ServiceAccount tertentu sesuai
kebutuhan. RoleBinding yang sangat detail memberikan keamanan yang lebih baik,
akan tetapi membutuhkan lebih banyak usaha untuk pengaturannya. Pemberian izin
yang lebih luas dapat memberikan akses API yang tidak perlu (dan berpotensi tereskalasi)
ke ServiceAccount, akan tetapi pengaturannya lebih mudah.
Dalam urutan dari yang paling aman ke yang paling tidak aman, pendekatannya adalah:
Memberikan sebuah Role ke ServiceAccount aplikasi tertentu (praktik terbaik)
Hal ini membutuhkan aplikasi untuk menentukan sebuah serviceAccountName
di dalam spesifikasi Pod-nya, dan untuk ServiceAccount yang akan dibuat (via
API, manifes aplikasi, kubectl create serviceaccount, dan lain-lain).
Sebagai contoh, untuk memberikan izin hanya baca (read-only) di dalam "my-namespace"
ke ServiceAccount "my-sa":
Banyak pugasan berjalan sebagai
ServiceAccount "default" di dalam Namespace kube-system. Untuk mengizinkan pugasan
tersebut berjalan dengan akses super-user, berikan izin cluster-admin kepada
ServiceAccount "default" di dalam Namespace kube-system.
Perhatian:
Mengaktifkan ini berarti Namespace `kube-system` memuat Secret yang
memberikan akses _super-user_ ke API klastermu.
Memberikan Role ke semua ServiceAccount dalam suatu Namespace
Jika kamu ingin semua aplikasi di dalam satu Namespace untuk memiliki Role, apa pun
ServiceAccount yang digunakan, maka kamu dapat memberikan Role ke grup ServiceAccount
untuk Namespace tersebut.
Sebagai contoh, untuk memberikan izin hanya baca di dalam "my-namespace" ke semua
ServiceAccount di dalam Namespace tersebut:
Memberikan akses super-user ke semua ServiceAccount di seluruh klaster (sangat tidak disarankan)
Jika kamu tidak peduli untuk melakukan partisi terhadap izin sama sekali, maka kamu bisa
memberikan akses super-user ke semua ServiceAccount.
Peringatan:
Hal ini akan memberikan akses penuh untuk aplikasi apapun ke klastermu, dan juga
memberikan pengguna manapun dengan akses baca ke Secret (atau kemampuan untuk membuat
Pod apa pun) akses penuh ke klastermu.
Klaster yang awalnya menjalankan versi Kubernetes lawas sering kali menggunakan
kebijakan ABAC yang permisif, termasuk memberikan akses API penuh ke semua
ServiceAccount.
Kebijakan RBAC bawaan memberikan izin yang terbatas ke komponen control plane, Node,
dan pengontrol, akan tetapi tidak memberikan izin ke ServiceAccount di luar Namespace
kube-system (di luar izin diskoveri yang diberikan kepada semua pengguna terotentikasi).
Meskipun jauh lebih aman, hal ini dapat mengganggu beban kerja yang sudah ada yang
mengharapkan untuk menerima izin API secara otomatis.
Berikut adalah dua pendekatan untuk mengelola transisi ini:
Pemberi otorisasi paralel
Jalankan pemberi otorisasi RBAC dan ABAC bersamaan, dan tentukan berkas kebijakan yang
memuat kebijakan ABAC lama:
Untuk menjelaskan opsi baris perintah yang pertama secara detail: jika pemberi otorisasi
sebelumnya, seperti Node, menolak permintaan, maka pemberi otorisasi RBAC mencoba untuk
mengotorisasi permintaan API tersebut. Jika RBAC juga menolak permintaan API tersebut,
maka pemberi otorisasi ABAC akan dijalankan. Hal ini berarti permintaan apa pun yang
diizinkan oleh salah satu kebijakan RBAC atau ABAC akan diizinkan.
Ketika kube-apiserver dijalankan dengan level log 5 atau lebih tinggi untuk komponen
RBAC (--vmodule=rbac*=5 atau --v=5), kamu dapat melihat penolakan RBAC di log
server API (dengan prefiks RBAC). Kamu dapat menggunakan informasi tersebut untuk
menentukan Role mana yang perlu diberikan ke pengguna, grup, atau ServiceAccount yang mana.
Jika kamu telah memberikan Role ke ServiceAccount dan
beban kerja sedang berjalan tanpa pesan penolakan RBAC dalam log server, maka kamu
dapat menghapus pemberi otorisasi ABAC.
Izin RBAC permisif
Kamu dapat mereplikasi kebijakan ABAC yang permisif dengan menggunakan RoleBinding
RBAC.
Peringatan:
Kebijakan berikut mengizinkan SEMUA ServiceAccount bentindak sebagai administrator
klaster. Aplikasi apa pun yang berjalan di dalam Container akan menerima kredensial
ServiceAccount secara otomatis, dan dapat melakukan tindakan apa pun terhadap API,
termasuk menampilkan Secret dan mengubah izin. Hal ini bukan kebijakan
yang direkomendasikan.
Setelah kamu beralih menggunakan RBAC, kamu harus menyesuaikan kontrol akses untuk
klastermu untuk memastikan bahwa kesemuanya memenuhi kebutuhanmu terkait keamanan
informasi.
Laman ini merupakan ikhitisar dari perintah kubectl.
kubectl - Contekan
Autocomplete Kubectl
BASH
source <(kubectl completion bash)# menyiapkan autocomplete untuk bash ke dalam shell saat ini, paket bash-completion harus diinstal terlebih dahulu.echo"source <(kubectl completion bash)" >> ~/.bashrc # menambahkan autocomplete secara permanen ke dalam bash shell kamu.
Kamu juga dapat menggunakan alias singkatan untuk kubectl yang juga bisa berfungsi dengan completion:
aliask=kubectl
complete -F __start_kubectl k
ZSH
source <(kubectl completion zsh)# menyiapkan autocomplete untuk zsh ke dalam shell saat ini.echo"[[ $commands[kubectl] ]] && source <(kubectl completion zsh)" >> ~/.zshrc # menambahkan autocomplete secara permanen ke dalam zsh shell kamu.
Konteks Kubectl dan Konfigurasinya
Memilih klaster Kubernetes yang mana yang ditembak oleh kubectl untuk berkomunikasi dan
diubah konfigurasinya. Lihat dokumentasi Otentikasi ke berbagai Klaster dengan kubeconfig untuk mengetahui informasi tentang berkas konfigurasi ini secara detail.
kubectl config view # memperlihatkan setelan kubeconfig yang sudah digabung (merged)# menggunakan beberapa berkas kubeconfig sekaligus dan melihat semua konfigurasinya sekaligus (merged)KUBECONFIG=~/.kube/config:~/.kube/kubconfig2
kubectl config view
# mendapatkan kata sandi untuk pengguna e2ekubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'kubectl config view -o jsonpath='{.users[].name}'# memperlihatkan pengguna pertamakubectl config view -o jsonpath='{.users[*].name}'# mendapatkan daftar penggunakubectl config get-contexts # memperlihatkan daftar kontekskubectl config current-context # memperlihatkan konteks saat inikubectl config use-context my-cluster-name # menyetel konteks bawaan menjadi my-cluster-name# menambahkan seorang pengguna baru ke dalam kubeconf kamu yang mendukung basic authkubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword
# menyimpan Namespace secara permanen untuk semua perintah kubectl pada konteks tersebutkubectl config set-context --current --namespace=ggckad-s2
# menyetel konteks yang menggunakan pengguna dan namespace yang spesifikkubectl config set-context gce --user=cluster-admin --namespace=foo \
&& kubectl config use-context gce
kubectl config unset users.foo # menghapus pengguna foo
Menerapkan
apply (menerapkan) mengelola aplikasi melalui berkas-berkas yang berisi definisi tentang sumber daya Kubernetes. Perintah ini membuat dan memperbarui
sumber daya di dalam sebuah klaster dengan menjalankan kubectl apply. Ini merupakan cara yang disarankan untuk mengelola aplikasi di dalam production.
Lihat Buku Kubectl.
Membuat Objek
Manifes Kubernetes dapat didefinisikan ke dalam YAML atau JSON. Gunakan berkas dengan ekstensi .yaml,
.yml, dan .json.
kubectl apply -f ./my-manifest.yaml # membuat sumber dayakubectl apply -f ./my1.yaml -f ./my2.yaml # membuat sumber daya dari beberapa berkaskubectl apply -f ./dir # membuat sumber daya dari berbagai berkas manifes yang ada di dalam direktorikubectl apply -f https://git.io/vPieo # membuat sumber daya dari sebuah tautankubectl create deployment nginx --image=nginx # memulai sebuah instans tunggal nginxkubectl explain pods # mendapatkan dokumentasi untuk manifes Pod# membuat beberapa objek YAML dari masukan (stdin)cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000000"
---
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-less
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000"
EOF# membuat sebuah Secret dengan beberapa kunci (key)cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: $(echo -n "s33msi4" | base64 -w0)
username: $(echo -n "jane" | base64 -w0)
EOF
Melihat, Mencari Sumber Daya
# mendapatkan berbagai perintah dengan keluaran dasarkubectl get services # mendapatkan semua Service di dalam Namespace saat inikubectl get pods --all-namespaces # mendapatkan semua Pod di dalam semua Namespacekubectl get pods -o wide # mendapatkan semua Pod di dalam Namespace saat ini, dengan informasi tambahankubectl get deployment my-dep # mendapatkan Deployment tertentukubectl get pods # mendapatkan semua Pod di dalam Namespace saat inikubectl get pod my-pod -o yaml # mendapatkan spesifikasi YAML dari Pod tertentu# menggambarkan berbagai perintah dengan keluaran yang lengkap (verbose)kubectl describe nodes my-node
kubectl describe pods my-pod
# mendapatkan semua Service yang diurutkan berdasar namakubectl get services --sort-by=.metadata.name
# mendapatkan semua Pod yang diurut berdasarkan jumlah restartkubectl get pods --sort-by='.status.containerStatuses[0].restartCount'# mendapatkan PersistentVolume yang diurut berdasarkan kapasitaskubectl get pv --sort-by=.spec.capacity.storage
# mendapatkan label versi dari semua Pod dengan label app=cassandrakubectl get pods --selector=app=cassandra -o \
jsonpath='{.items[*].metadata.labels.version}'# mendapatkan semua Node pekerja (worker) (selektor digunakan untuk tidak memasukkan# Node yang memiliki label 'node-role.kubernetes.io/master' ke dalam keluaran)kubectl get node --selector='!node-role.kubernetes.io/master'# mendapatkan semua Pod yang sedang berjalan di dalam Namespace saat inikubectl get pods --field-selector=status.phase=Running
# mendapatkan ExternalIP dari semua Nodekubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'# mendapatkan nama dari semua Pod yang termasuk ke dalam RC tertentu# perintah "jq" berguna untuk mentransformasi keluaran yang terlalu rumit untuk diproses oleh jsonpath, lihat https://stedolan.github.io/jq/sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}echo$(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})# memperlihatkan label yang dimiliki semua Pod (atau objek Kubernetes lainnya yang mendukung label)kubectl get pods --show-labels
# memeriksa Node mana yang sudah dalam kondisi siap (ready)JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}'\
&& kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"# mendapatkan semua Secret yang sedang digunakan oleh Podkubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
# mendapatkan semua containerID dari initContainer yang ada di semua Pod,# berguna untuk membersihkan kontainer yang telah berhenti, tetapi menghindari terhapusnya initContainerkubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3
# mendapatkan Event yang diurut berdasarkan cap waktu (timestamp)kubectl get events --sort-by=.metadata.creationTimestamp
# membandingkan antara keadaan saat ini dengan keadaan yang diinginkan pada klaster, jika manifes diterpakankubectl diff -f ./my-manifest.yaml
Memperbarui Sumber Daya
kubectl set image deployment/frontend www=image:v2 # memperbarui kontainer "www" secara bergilir dari sebuah Deployment "frontend", memperbarui image-nyakubectl rollout history deployment/frontend # memeriksa sejarah (history) Deployment, termasuk revisinyakubectl rollout undo deployment/frontend # mengembalikan (rollback) ke Deployment sebelumnyakubectl rollout undo deployment/frontend --to-revision=2# mengembalikan (rollback) ke revisi tertentukubectl rollout status -w deployment/frontend # melakukan watch terhadap status pembaruan bergilir dari Deployment "frontend" sampai selesaikubectl rollout restart deployment/frontend # melakukan restart secara bergilir untuk Deployment "frontend"cat pod.json | kubectl replace -f - # menggantikan sebuah Pod berdasarkan JSON yang dilewatkan melalui std# menggantikan, menghapus, dan membuat ulang sumber daya secara paksa, dapat menyebabkan gagalnya layanankubectl replace --force -f ./pod.json
# membuat sebuah Service untuk nginx yang terreplikasi, melayani pada porta 80 dan menghubungkan kontainer pada porta 8000kubectl expose rc nginx --port=80 --target-port=8000# memperbarui versi image (tag) yang dimiliki kontainer Pod menjadi versi v4kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -
kubectl label pods my-pod new-label=awesome # menambahkan sebuah labelkubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq # menambahkan sebuah anotasikubectl autoscale deployment foo --min=2 --max=10# menskalakan sebuah Deployment "foo" secara otomatis
Menambal (Patch) Sumber Daya
# memperbarui sebuah Node secara parsialkubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'# memperbarui image dari kontainer; spec.containers[*].name diperlukan karena menggunakan kunci mergekubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'# memperbarui image dari kontainer menggunakan patch json dengan array posisikubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'# menonaktifkan sebuah Deployment livenessProbe menggunakan patch json dengan array posisikubectl patch deployment valid-deployment --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'# menambahkan elemen baru ke dalam array posisikubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'
Menyunting Sumber Daya
Menyunting sumber daya API menggunakan penyunting (editor) yang biasa kamu gunakan.
kubectl edit svc/docker-registry # menyunting Service yang bernama docker-registryKUBE_EDITOR="nano" kubectl edit svc/docker-registry # menggunakan penyunting alternatif
Menskalakan Sumber Daya
kubectl scale --replicas=3 rs/foo # menskalakan ReplicaSet bernama 'foo' menjadi 3kubectl scale --replicas=3 -f foo.yaml # menskalakan sebuah sumber daya yang dispesifikasikan di dalam "foo.yaml" menjadi 3kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # jika Deployment bernama mysql saat ini memiliki ukuran 2, skalakan mysql menjadi 3kubectl scale --replicas=5 rc/foo rc/bar rc/baz # menskalakan beberapa ReplicationController sekaligus
Menghapus Sumber Daya
kubectl delete -f ./pod.json # menghapus Pod menggunakan tipe dan nama yang dispesifikan di dalam pod.jsonkubectl delete pod,service baz foo # menghapus Pod dan Service dengan nama yang sama, yaitu "baz" dan "foo"kubectl delete pods,services -l name=myLabel # menghapus semua Pod dan Service yang memiliki label name=myLabelkubectl -n my-ns delete pod,svc --all # menghapus semua Pod dan Service di dalam Namespace my-ns# menghapus semua Pod yang sesuai dengan pattern1 atau pattern2 dari awkkubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod
Berinteraksi dengan Pod yang sedang berjalan
kubectl logs my-pod # memperlihatkan log dari Pod (keluaran stdout)kubectl logs -l name=myLabel # memperlihatkan log dari Pod dengan label name=myLabel (keluaran stdout)kubectl logs my-pod --previous # memperlihatkan log dari Pod (keluaran stdout) untuk kontainer yang dijalankan sebelumnyakubectl logs my-pod -c my-container # memperlihatkan log dari kontainer di dalam Pod (keluaran stdout, kasus banyak kontainer)kubectl logs -l name=myLabel -c my-container # memperlihatkan log dari Pod, dengan label name=myLabel (keluaran stdout)kubectl logs my-pod -c my-container --previous # memperlihatkan log dari kontainer di dalam Pod (keluaran stdout, kasus banyak kontainer) untuk kontainer yang dijalankan sebelumnyakubectl logs -f my-pod # memperlihatkan aliran log dari Pod (keluaran stdout)kubectl logs -f my-pod -c my-container # memperlihatkan aliran log dari kontainer di dalam Pod (keluaran stdout, kasus banyak kontainer)kubectl logs -f -l name=myLabel --all-containers # memperlihatkan aliran log dari Pod dengan label name=myLabel (keluaran stdout)kubectl run -i --tty busybox --image=busybox -- sh # menjalankan Pod sebagai shell interaktifkubectl run nginx --image=nginx --restart=Never -n
mynamespace # menjalankan Pod nginx ke dalam Namespace tertentukubectl run nginx --image=nginx --restart=Never # menjalankan Pod nginx dan menulis spesifikasinya ke dalam sebuah berkas bernama pod.yaml--dry-run -o yaml > pod.yaml
kubectl attach my-pod -i # melekatkan (meng-attach) ke dalam kontainer yang sedang berjalankubectl port-forward my-pod 5000:6000 # mendengar (listen) pada porta 5000 di mesin lokal dan meneruskan ke porta 6000 di Pod my-podkubectl exec my-pod -- ls / # menjalankan perintah pada Pod my-pod (kasus 1 kontainer)kubectl exec my-pod -c my-container -- ls / # menjalankan peirntah pada Pod my-pod (kasus banyak kontainer)kubectl top pod POD_NAME --containers # memperlihatkan metrik yang dimiliki Pod bersama kontainernya
Berinteraksi dengan Node dan Klaster
kubectl cordon my-node # menandai my-node supaya tidak bisa dijadwalkan dengan Pod (unschedulable)kubectl drain my-node # mengeringkan (drain) my-node sebagai bagian dari persiapan untuk pemeliharaankubectl uncordon my-node # menandai my-node supaya bisa dijadwalkan dengan Pod (schedulable)kubectl top node my-node # memperlihatkan metrik dari Node my-nodekubectl cluster-info # memperlihatkan alamaat dari master dan layanankubectl cluster-info dump # memperlihatkan state klaster saat ini pada keluaran stdoutkubectl cluster-info dump --output-directory=/path/to/cluster-state # memperlihatkan state klaster saat ini pada /path/to/cluster-state# jika sebuah taint dengan sebuah kunci dan efek di bawah pernah diterapkan, maka nilainya akan tergantikan dengan yang barukubectl taint nodes foo dedicated=special-user:NoSchedule
Berbagai Tipe Sumber Daya
Mendapatkan seluruh daftar tipe sumber daya yang didukung lengkap dengan singkatan pendeknya, grup API,
apakah sumber daya merupakan sumber daya yang berada di dalam Namespace atau tidak, serta Kind:
kubectl api-resources
Operasi lainnya yang berkaitan dengan sumber daya API (api-resources):
kubectl api-resources --namespaced=true# semua sumber daya yang berada di dalam Namespacekubectl api-resources --namespaced=false# semua sumber daya yang tidak berada di dalam Namespacekubectl api-resources -o name # semua sumber daya dengan keluaran sederhana (hanya nama sumber daya)kubectl api-resources -o wide # semua sumber daya dengan keluaran tambahan ("wide")kubectl api-resources --verbs=list,get # semua sumber daya yang mendukung verb permintaan "list" dan "get"kubectl api-resources --api-group=extensions # semua sumber daya di dalam grup API "extensions"
Memformat Keluaran
Untuk mengeluarkan detail ke dalam jendela terminal kamu dengan format tertentu, tambahkan flag-o (atau --output)
dengan perintah kubectl yang didukung.
Format keluaran
Deskripsi
-o=custom-columns=<spec>
Mencetak sebuah tabel dengan daftar kolom khas (custom) yang dipisahkan dengan koma
-o=custom-columns-file=<filename>
Mencetak sebuah tabel dengan templat kolom khas pada berkas <filename>
-o=json
Memberikan keluaran objek API dengan format JSON
-o=jsonpath=<template>
Mencetak bagian-bagian yang didefinisikan di dalam sebuah ekspresi jsonpath
-o=jsonpath-file=<filename>
Mencetak bagian-bagian yang didefinisikan dengan ekspresi jsonpath ke dalam berkas <filename>
-o=name
Mencetak hanya nama dari sumber daya, tidak dengan informasi yang lainnya
-o=wide
Memberikan keluaran dengan format teks polos (plain-text) dengan informasi tambahan, dan nama dari Node akan juga termasuk ke dalam informasi untuk Pod
-o=yaml
Memberikan keluaran objek API dengan format YAML
Contoh-contoh yang menggunakan -o=custom-columns:
# All images running in a clusterkubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'# All images excluding "registry.k8s.io/coredns:1.6.2"kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="registry.k8s.io/coredns:1.6.2")].image'# All fields under metadata regardless of namekubectl get pods -A -o=custom-columns='DATA:metadata.*'
Tingkat Kelengkapan Keluaran dan Debugging Kubectl
Tingkat kelengkapan keluaran (verbosity) dari kubectl dikendalikan oleh flag-v atau --v diikuti dengan bilangan bulat yang merepresentasikan
tingkatan log. Ketentuan logging Kubernetes secara umum dan keterkaitannya dengan tingkatan log dijelaskan di sini.
Tingkat kelengkapan keluaran
Deskripsi
--v=0
Umumnya berguna untuk selalu bisa dilihat oleh seorang operator klaster.
--v=1
Tingkatan log bawaan yang layak jika kamu tidak ingin log yang terlalu lengkap.
--v=2
Berisi informasi yang steady state tentang layanan dan berbagai pesan log penting yang berhubungan dengan perubahan besar pada sistem. Tingkat ini yang paling disarankan pada sistem kebanyakan.
--v=3
Informasi tambahan tentang perubahan pada sistem.
--v=4
Tingkat kelengkapan debug.
--v=6
Memperlihatkan sumber daya yang diminta.
--v=7
Memperlihatkan header dari permintaan HTTP.
--v=8
Memperlihatkan konten dari permintan HTTP.
--v=9
Memperlihatkan kontek dari permintaan HTTP tanpa dipotong.
Ada 3 protokol valid yang dapat digunakan port suatu Service:
SCTP
FEATURE STATE:Kubernetes v1.20 [stable]
Ketika menggunakan plugin jaringan yang mendukung SCTP, Anda dapat menggunakan SCTP untuk sebagian besar Service. Untuk Service dengan type: LoadBalancer , dukungan SCTP tersedia apabila penyedia cloud menyediakan protokol ini. (Kebanyakan dari mereka tidak menyediakan dukungan untuk protokol ini).
SCTP tidak tersedia untuk node yang menjalankan Windows.
Dukungan untuk asosiasi multihomed SCTP
Dukungan untuk asosiasi multihomed SCTP memerlukan plugin CNI agar mendukung penempatan banyak interface dan alamat IP ke sebuah Pod.
NAT untuk asosiasi multihomed SCTP memerlukan logika khusus di modul Kernel terkait.
TCP
Anda dapat menggunakan TCP untuk berbagai macam Service, dan ini adalah protokol jaringan bawaan.
UDP
Anda dapat menggunakan UDP untuk sebagian besar Service. Untuk Service dengan type: LoadBalancer, dukungan UDP tersedia apabila penyedia cloud menyediakan protokol ini
Kasus Khusus
HTTP
Jika penyedia cloud mendukung protokol ini, Anda dapat menggunakan Service dengan mode LoadBalancer untuk mengonfigurasi load balancer yang berada di luar klaster Kubernetes, dengan menggunakan mode khusus dimana load balancer yang disediakan penyedia cloud telah mengimplementasi HTTP / HTTPS proxying, dimana lalu lintas paket diteruskan ke backend endpoint untuk Service tersebut.
Biasanya, Anda mengatur protokol untuk Service dengan TCP dan menambahkan
annotation
(biasanya tergantung ke penyedia cloud) yang mengonfigurasi load balancer untuk menangani lalu lintas paket di tingkat HTTP.
Konfigurasi ini menyediakan juga HTTPS (HTTP di atas TLS) dan reverse-proxying HTTP sederhana untuk workload Anda.
Catatan:
Anda juga dapat menggunakan Ingress untuk mengekspos Service dengan HTTP/HTTPS.
Anda juga mungkin ingin mengatur protokol aplikasi suatu koneksi dengan http atau https. Gunakan http jika session dari load balancer untuk workload Anda adalah HTTP tanpa TLS. Dan gunakan https jika session dari load balancer untuk workload Anda menggunakan enkripsi TLS.
protokol PROXY
Jika penyedia cloud Anda mendukung protokol ini, Anda dapat menggunakan Service dengan type: LoadBalancer
untuk mengonfigurasi load balancer diluar klaster Kubernetes sendiri, yang akan meneruskan koneksi yang dibungkus oleh
protokol PROXY.
Kemudian Load balancer mengirim rangkaian oktet awal yang menggambarkan koneksi kedatangan, mirip dengan contoh dibawah ini (protokol PROXY v1):
PROXY TCP4 192.0.2.202 10.0.42.7 12345 7\r\n
Data yang masuk setelah pembukaan protokol PROXY adalah data asli dari klien. Ketika kedua sisi menutup koneksi, load balancer juga memicu penutupan koneksi dan mengirim sisa data ketika memungkinkan.
Biasanya, Anda mendefinisikan Service dengan protokol TCP. Anda juga dapat menambahkan annotation, yang khusus untuk penyedia cloud Anda, yang mengonfigurasi load balancer dengan membungkus setiap koneksi yang datang dengan protokol PROXY.
TLS
Jika penyedia cloud Anda mendukung protokol ini, Anda dapat menggunakan protokol ini pada Service sebagai cara untuk membangun reverse proxying eksternal, dimana koneksi yang datang dari klien ke load balancer terenkripsi dengan TLS dan load balancer adalah TLS server peer. Koneksi dari load balancer yang menuju workload Anda dapat juga berupa TLS, atau teks biasa. Pilihan yang tersedia untuk Anda tergantung dari penyedia cloud atau implementasi kustom suatu Service.
Biasanya, Anda mengatur protokol ke TCP dan menambahkan annotation (biasanya khusus untuk penyedia cloud Anda) yang mengonfigurasi load balancer untuk berjalan sebagai server TLS. Anda juga dapat mengonfigurasi identitas TLS (sebagai server, dan mungkin juga sebagai klien yang terhubung ke workload Anda) dengan menggunakan mekanisme yang tersedia khusus untuk penyedia cloud Anda.
5.2 - Port dan Protokol
Ketika menjalankan Kubernetes di lingkungan dengan jaringan yang terbatas dan ketat, seperti pada on-premises data center dengan firewall fisik pada jaringan tersebut atau jaringan virtual di public cloud, akan sangat berguna apabila kita mengetahui port dan protokol yang digunakan oleh komponen Kubernetes
Panel Kontrol
Protokol
Arah
Rentang Port
Tujuan
Digunakan oleh
TCP
Inbound
6443
Kubernetes API server
All
TCP
Inbound
2379-2380
etcd server client API
kube-apiserver, etcd
TCP
Inbound
10250
Kubelet API
Self, Control plane
TCP
Inbound
10259
kube-scheduler
Self
TCP
Inbound
10257
kube-controller-manager
Self
Meskipun port Etcd termasuk dalam bagian panel kontrol diatas (sebagai bawaan dari instalasi klaster Kubernetes itu sendiri), Anda dapat membangun klaster Etcd Anda sendiri di luar Kubernetes atau melalui port kustom.
Semua nomor port bawaan dapat ditimpa dengan nomor lainnya. Ketika port kustom dipilih, port tersebut harus dibuka dan dapat diakses oleh komponen Kubernetes lainnya.
Salah satu contoh yang umum adalah port API server yang terkadang diganti ke 443. Sebagai alternatif, port bawaan tetap digunakan dan API server tersebut ditempatkan di belakang load balancer yang dapat diakses melalui port 443. Kemudian, request yang diterima diteruskan ke API server melalui port bawaannya.