This is the multi-page printable view of this section. Click here to print.
Mengelola Objek Kubernetes
1 - Pengelolaan Objek Kubernetes secara Deklaratif dengan Menggunakan Berkas Konfigurasi
Objek-objek Kubernetes dapat dibuat, diperbarui, dan dihapus dengan menjalankan perintah kubectl apply
terhadap file-file konfigurasi objek yang disimpan dalam sebuah direktori secara rekursif sesuai dengan kebutuhan. Perintah kubectl diff
bisa digunakan untuk menampilkan pratinjau tentang perubahan apa saja yang akan dibuat oleh perintah kubectil apply
.
Kelebihan dan kekurangan
Perintah kubectl
memungkinkan tiga cara untuk mengelola objek:
- Perintah imperatif
- Konfigurasi objek imperatif
- Konfigurasi objek deklaratif
Lihat Pengelolaan Objek Kubernetes untuk menyimak diskusi mengenai kelebihan dan kekurangan dari tiap cara pengelolaan objek.
Sebelum kamu mulai
Konfigurasi objek secara deklaratif membutuhkan pemahaman yang baik tentang definisi dan konfigurasi objek-objek Kubernetes. Jika belum pernah, kamu disarankan untuk membaca terlebih dulu dokumen-dokumen berikut:
- Pengelolaan Objek Kubernetes Menggunakan Perintah Imperatif
- Pengelolaan Objek Kubernetes Menggunakan Berkas Konfigurasi Imperatif
Berikut adalah beberapa defnisi dari istilah-istilah yang digunakan dalam dokumen ini:
- objek berkas konfigurasi / berkas konfigurasi: Sebuah file yang
mendefinisikan konfigurasi untuk sebuah objek Kubernetes. Dokumen ini akan memperlihatkan cara menggunakan file konfigurasi dengan perintah
kubectl apply
. File-file konfigurasi biasanya disimpan di sebuah source control seperti Git. - konfigurasi objek live / konfigurasi live: nilai konfigurasi live dari sebuah objek, sebagaimana yang tersimpan di klaster Kubernetes. Nilai-nilai ini disimpan di storage klaster Kubernetes, biasanya etcd.
- writer konfigurasi deklaratif / writer deklaratif: Seseorang atau sebuah komponen perangkat lunak yang membuat pembaruan ke objek live. Live writer yang disebut pada dokumen ini adalah writer yang membuat perubahan terhadap file konfigurasi objek dan menjalankan perintah
kubectl apply
untuk menulis perubahan-perubahan tersebut.
Cara membuat objek
Gunakan perintah kubectl apply
untuk membuat semua objek, kecuali objek-objek yang sudah ada sebelumnya, yang didefinisikan di file-file konfigurasi dalam direktori yang ditentukan:
kubectl apply -f <directory>/
Perintah di atas akan memberi anotasi kubectl.kubernetes.io/last-applied-configuration: '{...}'
pada setiap objek yang dibuat. Anotasi ini berisi konten dari file konfigurasi objek yang digunakan untuk membuat objek tersebut.
Catatan:
Tambahkan parameter-R
untuk memproses seluruh direktori secara rekursif.Berikut sebuah contoh file konfigurasi objek:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
minReadySeconds: 5
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Jalankan perintah kubectl diff
untuk menampilkan objek yang akan dibuat:
kubectl diff -f https://k8s.io/examples/application/simple_deployment.yaml
Buat objek dengan perintah kubectl apply
:
kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml
Tampilkan konfigurasi live dengan perintah kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
Keluaran perintah di atas akan menunjukkan bahwa anotasi kubectl.kubernetes.io/last-applied-configuration
sudah dituliskan ke konfigurasi live, dan anotasi tersebut sesuai dengan file konfigurasi:
kind: Deployment
metadata:
annotations:
# ...
# Ini merupakan representasi dari simple_deployment.yaml dalam format json
# Ini ditulis oleh perintah `kubectl apply` ketika objek dibuat
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment",
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
"ports":[{"containerPort":80}]}]}}}}
# ...
spec:
# ...
minReadySeconds: 5
selector:
matchLabels:
# ...
app: nginx
template:
metadata:
# ...
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
# ...
name: nginx
ports:
- containerPort: 80
# ...
# ...
# ...
# ...
Cara memperbarui objek
Kamu juga bisa menggunakan kubectl apply
untuk memperbarui semua objek yang didefinisikan dalam sebuah direktori, termasuk objek-objek yang sudah ada sebelumnya. Cara ini akan melakukan hal-hal berikut:
- Menyimpan nilai field-field yang ada di file konfigurasi ke konfigurasi live.
- Menghapus field-field yang dihapus di file konfigurasi dari konfigurasi live.
kubectl diff -f <directory>/
kubectl apply -f <directory>/
Catatan:
Tambahkan argumen-R
untuk memproses seluruh direktori secara rekursif.Berikut sebuah contoh file konfigurasi:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
minReadySeconds: 5
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Buat objek dengan perintah kubectl apply
::
kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml
Catatan:
Untuk keperluan ilustrasi, perintah berikut merujuk ke satu file konfigurasi alih-alih ke satu direktori.Tampilkan konfigurasi live dengan perintah kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
Keluaran perintah di atas akan menunjukkan bahwa anotasi kubectl.kubernetes.io/last-applied-configuration
sudah dituliskan ke konfigurasi live, dan anotasi tersebut sesuai dengan file konfigurasi:
kind: Deployment
metadata:
annotations:
# ...
# Berikut merupakan representasi dari simple_deployment.yaml dalam format json
# Representasi berikut ditulis oleh perintah kubectl apply ketika objek dibuat
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment",
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
"ports":[{"containerPort":80}]}]}}}}
# ...
spec:
# ...
minReadySeconds: 5
selector:
matchLabels:
# ...
app: nginx
template:
metadata:
# ...
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
# ...
name: nginx
ports:
- containerPort: 80
# ...
# ...
# ...
# ...
Perbarui nilai replicas
secara langsung di konfigurasi live
dengan menggunakan perintah kubectl scale
. Pembaruan ini tidak menggunakan perintah kubectl apply
:
kubectl scale deployment/nginx-deployment --replicas=2
Tampilkan konfigurasi live dengan perintah kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
Keluaran perintah di atas akan menunjukkan bahwa nilai replicas
telah diubah menjadi 2, dan anotasi last-applied-configuration
tidak memuat nilai replicas
:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
# ...
# perhatikan bahwa anotasi tidak memuat nilai replicas
# karena nilai tersebut tidak diperbarui melalui perintah kubectl-apply
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment",
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
"ports":[{"containerPort":80}]}]}}}}
# ...
spec:
replicas: 2 # ditulis oleh perintah kubectl scale
# ...
minReadySeconds: 5
selector:
matchLabels:
# ...
app: nginx
template:
metadata:
# ...
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
# ...
name: nginx
ports:
- containerPort: 80
# ...
Perbarui file konfigurasi simple_deployment.yaml
, ubah image dari nginx:1.7.9
ke nginx:1.11.9
, dan hapus field minReadySeconds
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.11.9 # perbarui image
ports:
- containerPort: 80
Terapkan perubahan yang telah dibuat di file konfigurasi:
kubectl diff -f https://k8s.io/examples/application/update_deployment.yaml
kubectl apply -f https://k8s.io/examples/application/update_deployment.yaml
Tampilkan konfigurasi live dengan perintah kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
Keluaran perintah di atas akan menunjukkan perubahan-perubahan berikut pada konfiguasi live:
- Field
replicas
tetap bernilai 2 sesuai dengan nilai yang diatur oleh perintahkubectl scale
. Hal ini karena fieldreplicas
dihapuskan dari file konfigurasi. - Nilai field
image
telah diperbarui menjadinginx:1.11.9
daringinx:1.7.9
. - Anotasi
last-applied-configuration
telah diperbari dengan image terbaru. - Field
minReadySeconds
telah dihapus. - Anotasi
last-applied-configuration
tidak lagi memuat fieldminReadySeconds
.
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
# ...
# Anotasi memuat image yang telah diperbarui ke nginx 1.11.9,
# tetapi tidak memuat nilai replica yang telah diperbarui menjadi 2
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment",
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
"spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
"spec":{"containers":[{"image":"nginx:1.11.9","name":"nginx",
"ports":[{"containerPort":80}]}]}}}}
# ...
spec:
replicas: 2 # Diatur oleh `kubectl scale`, tidak diubah oleh `kubectl apply`.
# minReadySeconds dihapuskan oleh `kubectl apply`
# ...
selector:
matchLabels:
# ...
app: nginx
template:
metadata:
# ...
labels:
app: nginx
spec:
containers:
- image: nginx:1.11.9 # Diatur oleh `kubectl apply`
# ...
name: nginx
ports:
- containerPort: 80
# ...
# ...
# ...
# ...
Peringatan:
Mencampur perintahkubectl apply
dengan perintah imperatif untuk konfigurasi objek seperti create
dan replace
tidak dimungkinkan. Hal ini karena create
dan replace
tidak menyimpan anotasi kubectl.kubernetes.io/last-applied-configuration
yang diperlukan oleh kubectl aplly
untuk melakukan pembaruan.Cara menghapus objek
Ada dua cara untuk menghapus objek-objek yang dikelola dengan kubectl apply
.
Rekomendasi: kubectl delete -f <filename>
Penghapusan objek secara manual dengan menggunakan perintah imperatif merupakan cara yang direkomendasikan karena lebih eksplisit dalam menentukan objek apa yang akan dihapus dan lebih kecil kemungkinannya untuk pengguna menghapus objek lain secara tidak sengaja:
kubectl delete -f <filename>
Alternatif: kubectl apply -f <directory/> --prune -l your=label
Lakukan ini hanya jika kamu benar-benar mengetahui apa yang kamu lakukan.
Peringatan:
Perintahkubectl apply --prune
masih dalam versi alpha dan perubahan-perubahan yang tidak memiliki kompatibilitas dengan versi sebelumnya mungkin akan diperkenalkan pada rilis-rilis berikutnya.Peringatan:
Kamu harus berhati-hati ketika menggunakan perintah ini agar kamu tidak menghapus objek-objek lain secara tak sengaja.Sebagai alternatif dari kubectl delete
, kamu bisa menggunakan kubectl apply
untuk mengidentifikasi objek-objek yang hendak dihapus setelah berkas konfigurasi objek-objek tersebut dihapus dari direktori. Ketika dijalankan dengan argumen --prune
, perintah kubectl apply
akan melakukan query ke API server untuk mencari semua objek yang sesuai dengan himpunan label-label tertentu, dan berusaha untuk mencocokkan kofigurasi objek live yg diperoleh terhadap file konfigurasi objek. Jika sebuah objek cocok dengan query yang dilakukan, dan objek tersebut tidak memiliki file konfigurasi di direktori serta tidak memiliki anotasi last-applied-configuration
, objek tersebut akan dihapus.
kubectl apply -f <directory/> --prune -l <labels>
Peringatan:
Perintahkubectl apply
dengan argumen --prune
sebaiknya hanya dijalankan terhadap direktori root yang berisi file-file konfigurasi objek. Menjalankan perintah tadi terhadap sub direktori bisa menyebabkan terhapusnya objek-objek lain secara tidak disengaja jika objek-objek tersebut memenuhi kriteria selektor label yang dispesifikasikan oleh argumen -l <label>
dan tidak muncul di sub direktori.Cara melihat objek
Kamu bisa menggunakan perintah kubectl get
dengan parameter -o yaml
untuk melihat konfigurasi dari sebuah objek live:
kubectl get -f <filename|url> -o yaml
Cara kubectl apply
menghitung perbedaan dan menggabungkan perubahan
Perhatian:
Patch adalah operasi pembaruan yang lingkupnya spesifik terhadap sejumlah field dari sebuah objek alih-alih terhadap keseluruhan objek. Patch memungkinkan pembaruan terhadap himpunan field yang spesifik tanpa harus membaca keseluruhan objek terlebih dulu.Ketika memperbarui konfigurasi live dari sebuah objek, kubectl apply
melakukannya dengan mengirimkan request untuk melakukan patch ke API server. Patch mendefinisikan pembaruan-pembaruan yang likungpnya sepsifik terhadap sejumlah field dari objek konfigurasi live. Perintah kubectl apply
menghitung patch request ini menggunakan file konfigurasi, konfigurasi live, dan anotasi last-applied-configuration
yang tersimpan di konfigurasi live.
Perhitungan penggabungan patch
Perintah kubectl apply
menulis konten dari berkas konfigurasi ke anotasi kubectl.kubernetes.io/last-applied-configuration
. Ini digunakan untuk mengidentifikasi field apa saja yang telah dihapus dari file konfigurasi dan perlu dihapus dari konfigurasi live. Berikut adalah langkah-langkah yang digunakan untuk menghitung field apa saja yang harus dihapus atau diubah:
- Hitung field-field yang perlu dihapus. Ini mencakup field-field yang ada di
last-applied-configuration
tapi tidak ada di file konfigurasi. - Hitung field-field yang perlu ditambah atau diubah. Ini mencakup field-field yang ada di file konfigurasi yang nilainya tidak sama dengan konfigurasi live.
Agar lebih jelas, simak contoh berikut. Misalkan, berikut adalah file konfigurasi untuk sebuah objek Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.11.9 # perbarui image
ports:
- containerPort: 80
Juga, misalkan, berikut adalah konfigurasi live dari objek Deployment yang sama:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
# ...
# perhatikan bagaimana anotasi berikut tidak memuat replicas
# karena replicas tidak diperbarui melalui perintah kubectl apply
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment",
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
"ports":[{"containerPort":80}]}]}}}}
# ...
spec:
replicas: 2 # ditulis oleh perintah kubectl scale
# ...
minReadySeconds: 5
selector:
matchLabels:
# ...
app: nginx
template:
metadata:
# ...
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
# ...
name: nginx
ports:
- containerPort: 80
# ...
Berikut merupakan perhitungan penggabungan yang akan dilakukan oleh perintah kubectl apply
:
- Hitung semua field yang akan dihapus dengan membaca nilai dari
last-applied-configuration
dan membandingkannya dengan nilai yang ada di file konfigurasi. Hapus semua field yang nilainya secara eksplisit diubah menjadi null pada file konfigurasi objek lokal terlepas dari apakah field-field tersebut ada di anotasilast-applied-configuration
atau tidak. Pada contoh di atas, fieldminReadySeconds
muncul pada anotasilast-applied-configuration
, tapi tidak ada di file konfigurasi. Aksi: HapusminReadySeconds
dari konfigurasi live. - Hitung semua field yang akan diubah dengan membaca nilai-nilai dari file konfigurasi dan membandingkannya dengan nilai-nilai yang ada di konfigurasi live. Pada contoh ini, nilai dari field
image
di file konfigurasi tidak sama dengan nilai dari konfigurasi live. Aksi: Ubah nilaiimage
pada konfigurasi live. - Ubah anotasi
last-applied-configuration
agar sesuai dengan nilai yang ada di file konfigurasi. - Gabungkan hasil-hasil dari langkah 1, 2, dan 3 ke dalam satu patch request ke API server.
Berikut konfigurasi live yang dihasilkan oleh proses penggabungan pada contoh di atas:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
# ...
# Anotasi memuat pembaruan image menjadi nginx 1.11.9,
# tetapi tidak memuat pembaruan replicas menjadi 2
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment",
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
"spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
"spec":{"containers":[{"image":"nginx:1.11.9","name":"nginx",
"ports":[{"containerPort":80}]}]}}}}
# ...
spec:
selector:
matchLabels:
# ...
app: nginx
replicas: 2 # Diubah oleh `kubectl scale`, tidak diubah oleh `kubectl apply`.
# minReadySeconds dihapus oleh `kubectl apply`
# ...
template:
metadata:
# ...
labels:
app: nginx
spec:
containers:
- image: nginx:1.11.9 # Diubah oleh `kubectl apply`
# ...
name: nginx
ports:
- containerPort: 80
# ...
# ...
# ...
# ...
Cara penggabungan tipe-tipe field yang berbeda
Cara sebuah field terentu dalam sebuah file konfigurasi digabungkan dengan konfigurasi live bergantung pada tipe field tersebut. Ada beberapa tipe field:
primitif: field yang bertipe string, integer, atau boolean. Sebagai contoh,
image
danreplicas
termasuk sebagai field primitif. Aksi: Replace.map, atau objek: field yang bertipe map atau tipe kompleks yang mengandung sub field. Sebagai contoh,
labels
,annotations
,spec
, danmetadata
termasuk sebagai map. Aksi: Lakukan penggabungan tiap-tiap elemen atau sub field.list: field yang berisi sejumlah item yang tiap itemnya bisa berupa tipe primitif maupun map. Sebagai contoh,
containers
,ports
, danargs
termasuk sebagai list. Aksi: Bervariasi.
Ketika digunakan untuk memperbarui sebuah field bertipe map atau list, perintah kubectl apply
memperbarui nilai tiap-tiap sub elemen ketimbang mengganti nilai semua field. Misalnya, ketika menggabungkan field spec
pada sebuah Deployment, bukan keseluruhan field spec
yang diubah nilainya. Alih-alih, sub field dari spec
seperti replicas
yang kemudian dibandingkan nilainya dan digabungkan.
Menggabungkan perubahan pada field primitif
Field primitif diganti nilainya atau dihapus sama sekali.
Catatan:
-
digunakan untuk menandai sebuah nilai "not applicable" karena nilai tersebut tidak digunakan.Field pada file konfigurasi objek | Field pada objek konfigurasi live | Field pada last-applied-configuration | Aksi |
---|---|---|---|
Ya | Ya | - | Ubah nilai di konfigurasi live mengikuti nilai pada file konfigurasi. |
Ya | Tidak | - | Ubah nilai di konfigurasi live mengikuti nilai pada konfigurasi lokal. |
Tidak | - | Ya | Hapus dari konfigurasi live. |
Tidak | - | Tidak | Tidak melakukan apa-apa, pertahankan nilai konfigurasi live. |
Menggabungkan perubahan pada field bertipe map
Field yang bertipe map digabungkan dengan membandingkan tiap sub field atau elemen dari map:
Catatan:
-
digunakan untuk menandai sebuah nilai "not applicable" karena nilai tersebut tidak digunakan.Key pada file konfigurasi objek | Key pada objek konfigurasi live | Field pada last-applied-configuration | Aksi |
---|---|---|---|
Ya | Ya | - | Bandingkan nilai tiap sub field. |
Ya | Tidak | - | Ubah nilai pada konfigurasi live mengikuti nilai pada konfigurasi lokal. |
Tidak | - | Ya | Hapus dari konfigurasi live. |
Tidak | - | Tidak | Tidak melakukan apa-apa, pertahankan nilai konfigurasi live. |
Menggabungkan perubahan pada field yang bertipe list
Penggabungan perubahan pada sebuah list bisa menggunakan salah satu dari tiga strategi:
- Ganti nilai keseluruhan list.
- Gabungkan nilai tiap-tiap elemen di dalam sebuah list yang elemennya kompleks.
- Gabungkan list yang elemennya primitif.
Pilihan strategi dibuat berbeda-beda bergantung tipe tiap field.
Ganti nilai keseluruhan list
Perlakukan list sama dengan field primitif. Ganti atau hapus keseluruhan list. Ini akan menjaga urutan dari list.
Contoh: Gunakan kubectl apply
untuk memperbarui field args
pada sebuah kontainer di dalam sebuah pod. Ini akan mengubah nilai args
di konfigurasi live mengikuti nilai di file konfigurasi. Elemen args
apapun yang sebelumnya ditambahkan ke konfigurasi live akan hilang. Urutan dari elemen-elemen args
yang didefinisikan di file konfigurasi akan dipertahankan ketika ditulis ke konfigurasi live.
# nilai last-applied-configuration*
args: ["a", "b"]
# nilai berkas konfigurasi
args: ["a", "c"]
# nilai konfigurasi live
args: ["a", "b", "d"]
# hasil setelah penggabungan
args: ["a", "c"]
Penjelasan: Penggabungan menggunakan nilai pada file konfigurasi sebagai nilai baru untuk list args
.
Menggabungkan tiap-tiap elemen dari sebuah list dengan elemen kompleks:
Perlakukan list selayaknya sebuah map, perlakukan field spesifik dari tiap element sebagai sebuah key. Tambah, hapus, atau perbarui tiap-tiap elemen. Operasi ini tidak mempertahankan urutan elemen di dalam list.
Strategi penggabungan ini menggunakan tag khusus patchMergeKey
pada tiap field. Tag patchMergeKey
didefinisikan untuk tiap field pada source code Kubernetes: types.go. Ketika menggabungkan sebuah list yang berisi map, field yang dispesifikasikan sebagai patchMergeKey
untuk tiap elemen digunakan sebagai map key untuk elemen tersebut.
Contoh: Gunakan kubectl apply
untuk memperbarui field containers
pada sebuah PodSpec. Perintah ini akan menggabungkan list containers
seolah-olah list tersebut adalah sebuah map dan tiap elemennya menggunakan name
sebagai key.
# nilai last-applied-configuration
containers:
- name: nginx
image: nginx:1.10
- name: nginx-helper-a # key: nginx-helper-a; akan dihapus pada hasil akhir
image: helper:1.3
- name: nginx-helper-b # key: nginx-helper-b; akan dipertahankan pada hasil akhir
image: helper:1.3
# nilai berkas konfigurasi
containers:
- name: nginx
image: nginx:1.10
- name: nginx-helper-b
image: helper:1.3
- name: nginx-helper-c # key: nginx-helper-c; akan ditambahkan pada hasil akhir
image: helper:1.3
# konfigurasi live
containers:
- name: nginx
image: nginx:1.10
- name: nginx-helper-a
image: helper:1.3
- name: nginx-helper-b
image: helper:1.3
args: ["run"] # Field ini akan dipertahankan pada hasil akhir
- name: nginx-helper-d # key: nginx-helper-d; akan dipertahankan pada hasil akhir
image: helper:1.3
# hasil akhir setelah penggabungan
containers:
- name: nginx
image: nginx:1.10
# Elemen nginx-helper-a dihapus
- name: nginx-helper-b
image: helper:1.3
args: ["run"] # Field dipertahankan
- name: nginx-helper-c # Elemen ditambahkan
image: helper:1.3
- name: nginx-helper-d # Elemen tidak diubah
image: helper:1.3
Penjelasan:
- Kontainer dengan nama "nginx-helper-a" dihapus karena tidak ada kontainer dengan nama tersebut di file konfigurasi.
- Kontainer dengan nama "nginx-helper-b" tetap mempertahankan nilai
args
pada konfigurasi live. Perintahkubectl apply
bisa mengenali bahwa "nginx-helper-b" di konfigurasi live sama dengan "ngnix-helper-b" di file konfigurasi, meskipun keduanya memiliki field yang berbeda (tidak adaargs
pada file konfigurasi). Ini karena nilaipatchMergeKey
di kedua konfigurasi identik. - Kontainer dengan nama "nginx-helper-c" ditambahkan karena tidak ada kontainer dengan nama tersebut di konfigurasi live, tapi ada di file konfigurasi.
- Kontainer dengan nama "nginx-helper-d" dipertahankan karena tidak ada elemen dengan nama tersebut pada last-applied-configuration.
Menggabungkan sebuah list dengan elemen-elemen primitif
Pada versi Kubernetes 1.5, penggabungan list dengan elemen-elemen primitif tidak lagi didukung.
Catatan:
Strategi mana yang dipilih untuk sembarang field ditentukan oleh tagpatchStrategy
pada types.go. Jika patchStrategy
tidak ditentukan untuk sebuah field yang bertipe list, maka list tersebut akan diubah nilainya secara keseluruhan.Nilai default dari sebuah field
API server mengisi field tertentu dengan nilai default pada konfigurasi live jika nilai field-field tersebut tidak dispesifikasikan ketika objek dibuat.
Berikut adalah sebuah file konfigurasi untuk sebuah Deployment. Berkas berikut tidak menspesifikasikan strategy
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
minReadySeconds: 5
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Buat objek dengan perintah kubectl apply
:
kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml
Tampilkan konfigurasi live dengan perintah kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
Keluaran dari perintah tadi menunjukkan bahwa API server mengisi beberapa field dengan nilai default pada konfigurasi live. Field-field berikut tidak dispesifikan pada file konfigurasi.
apiVersion: apps/v1
kind: Deployment
# ...
spec:
selector:
matchLabels:
app: nginx
minReadySeconds: 5
replicas: 1 # nilai default dari apiserver
strategy:
rollingUpdate: # nilai default dari apiserver - diturunkan dari strategy.type
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate # nilai default dari apiserver
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent # nilai default dari apiserver
name: nginx
ports:
- containerPort: 80
protocol: TCP # nilai default dari apiserver
resources: {} # nilai default dari apiserver
terminationMessagePath: /dev/termination-log # nilai default dari apiserver
dnsPolicy: ClusterFirst # nilai default dari apiserver
restartPolicy: Always # nilai default dari apiserver
securityContext: {} # nilai default dari apiserver
terminationGracePeriodSeconds: 30 # nilai default dari apiserver
# ...
Dalam sebuah patch request, field-field dengan nilai default tidak diisi kembali dengan nilai default kecuali secara eksplisit nilainya dihapuskan sebagai bagian dari patch request. Ini bisa menimbulkan hasil yang tak terduga jika sebagian field diisi dengan nilai default yang diturunkan dari nilai field lainnya. Ketika field lain tersebut nilainya diubah, field-field yang diisi dengan nilai default berdasarkan field yang berubah tadi tidak akan diperbarui kecuali secara eksplisit dihapus.
Oleh karena itu, beberapa field yang nilainya diisi secara default oleh server perlu didefinisikan secara eksplisit di file konfigurasi, meskipun nilai yang diinginkan sudah sesuai dengan nilai default dari server. Ini untuk mempermudah mengenali nilai-nilai yang berselisih yang tidak akan diisi dengan nilai default oleh server.
Contoh:
# last-applied-configuration
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
# berkas konfigurasi
spec:
strategy:
type: Recreate # nilai yang diperbarui
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
# konfigurasi live
spec:
strategy:
type: RollingUpdate # nilai default
rollingUpdate: # nilai default yang diturunkan dari type
maxSurge : 1
maxUnavailable: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
# hasil setelah penggabungan - ERROR!
spec:
strategy:
type: Recreate # nilai yang diperbarui: tidak kompatibel dengan field rollingUpdate
rollingUpdate: # nilai default: tidak kompatibel dengan "type: Recreate"
maxSurge : 1
maxUnavailable: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Penjelasan:
- Pengguna sebelumnya sudah membuat sebuah Deployment tanpa mendefinisikan
strategy.type
(seperti yang bisa dilihat padalast-applied-configuration
). - Server mengisi
strategy.type
dengan nilai defaultRollingUpdate
dan mengisistrategy.rollingUpdate
dengan nilai default pada konfigurasi live. - Pengguna mengubah nilai field
strategy.type
menjadiRecreate
pada file konfigurasi. Nilaistrategy.rollingUpdate
tidak berubah dari nilai default, meskipun server sekarang berekspektasi nilai tersebut dihapus. Jika nilaistrategy.rollingUpdate
didefinisikan di awal pada file konfigurasi, akan jelas bagi server bahwa field tersebut perlu dihapus. - Perintah
kubect apply
gagal karenastrategy.rollingUpdate
tidak dihapus. Fieldstrategy.rollingUpdate
tidak bisa didefinisikan jika fieldstrategy.type
berisiRecreate
.
Rekomendasi: Field-field ini harus didefinisikan secara eksplisit di file konfigurasi objek:
- Label Selectors dan PodTemplate pada workloads, misalnya Deployment, StatefulSet, Job, DaemonSet, ReplicaSet, dan ReplicationController
- Strategi Deployment rollout
Cara menghilangkan field-field yang diisi dengan nilai default atau diisi oleh writer lainnya
Field-field yang tidak muncul di file konfigurasi bisa dihilangkan dengan mengisi nilainya dengan null
dan kemudian jalankan kubectl apply
dengan file konfigurasi tersebut. Untuk field-field yang nilainya diisi dengan nilai default oleh server, aksi ini akan mmenyebabkan pengisian ulang field dengan nilai default.
Cara mengubah kepemilikan sebuah field antara file konfigurasi dan writer imperatif
Hanya metode-metode berikut yang bisa kamu gunakan untuk mengubah satu field objek:
- Gunakan
kubectl apply
. - Tulis secara langsung ke konfigurasi live tanpa memodifikasi file konfigurasi: misalnya, dengan perintah
kubectl scale
.
Mengubah kepemilikan dari writer imperatif ke file konfigurasi
Tambahkan field ke file konfigurasi. Hentikan pembaruan secara langsung ke konfigurasi live tanpa melalui kubectl apply
.
Mengubah kepemilikan dari file konfigurasi ke writer imperatif
Pada versi Kubernetes 1.5, mengubah kepemilikan sebuah field dari file konfigurasi memerlukan langkah-langkah manual:
- Hapus field dari file konfigurasi.
- Hapus field dari anotasi
kubectl.kubernetes.io/last-applied-configuration
pada objek live.
Mengubah metode-metode pengelolaan objek
Objek-objek Kubernetes sebaiknya dikelola dengan satu metode dalam satu waktu. Berpindah dari satu metode ke metode lain dimungkinkan, tetapi memerlukan proses manual.
Catatan:
Boleh menggunakan perintah hapus secara imperatif dalam pengelolaan objek secara deklaratif.Migrasi dari pengelolaan dengan perintah imperatif ke konfigurasi objek deklaratif
Migrasi dari pengelolaan objek dengan perintah imperatif ke pengelolaan objek dengan konfigurasi deklaratif memerlukan beberapa langkah manual:
Ekspor objek live ke file konfigurasi lokal:
kubectl get <kind>/<name> -o yaml > <kind>_<name>.yaml
Hapus secara manual field
status
dari file konfigurasi.Catatan:
Tahap ini opsional, karena `kubectl apply` tidak memperbarui *field* status meskipun *field* tersebut ada di *file* konfigurasi.
Ubah anotasi
kubectl.kubernetes.io/last-applied-configuration
pada objek:kubectl replace --save-config -f <kind>_<name>.yaml
Selanjutnya gunakan
kubectl apply
secara eksklusif untuk mengelola objek.
Migrasi dari konfigurasi objek imperatif ke konfigurasi objek deklaratif
Atur anotasi
kubectl.kubernetes.io/last-applied-configuration
pada objek:kubectl replace --save-config -f <kind>_<name>.yaml
Gunakan selalu perintah
kubectl apply
saja untuk mengelola objek.
Pendefinisian selektor controller dan label PodTemplate
Peringatan:
Pembaruan selektor pada controllers sangat tidak disarankan.Cara yang disarankan adalah dengan mendefinisikan sebuah PodTemplate immutable yang hanya digunakan oleh selektor controller tanpa memiliki arti semantik lainnya.
Contoh:
selector:
matchLabels:
controller-selector: "extensions/v1beta1/deployment/nginx"
template:
metadata:
labels:
controller-selector: "extensions/v1beta1/deployment/nginx"
Selanjutnya
2 - Mengelola Objek Kubernetes secara Deklaratif menggunakan Kustomize
Kustomize merupakan sebuah alat untuk melakukan kustomisasi objek Kubernetes melalui sebuah berkas berkas kustomization.
Sejak versi 1.14, kubectl mendukung pengelolaan objek Kubernetes melalui berkas kustomization. Untuk melihat sumber daya yang ada di dalam direktori yang memiliki berkas kustomization, jalankan perintah berikut:
kubectl kustomize <direktori_kustomization>
Untuk menerapkan sumber daya tersebut, jalankan perintah kubectl apply
dengan flag --kustomize
atau -k
:
kubectl apply -k <kustomization_directory>
Sebelum kamu memulai
Instal kubectl
terlebih dahulu.
Kamu harus memiliki klaster Kubernetes, dan perangkat baris perintah kubectl juga harus dikonfigurasikan untuk berkomunikasi dengan klastermu. Jika kamu belum memiliki klaster, kamu dapat membuatnya dengan menggunakan minikube, atau kamu juga dapat menggunakan salah satu dari tempat mencoba Kubernetes berikut ini:
Untuk melihat versi, tekankubectl version
.Gambaran Umum Kustomize
Kustomize adalah sebuah alat untuk melakukan kustomisasi konfigurasi Kubernetes. Untuk mengelola berkas-berkas konfigurasi, kustomize memiliki fitur -fitur di bawah ini:
- membangkitkan (generate) sumber daya dari sumber lain
- mengatur field dari berbagai sumber daya yang bersinggungan
- mengkomposisikan dan melakukan kustomisasi sekelompok sumber daya
Membangkitkan Sumber Daya
ConfigMap dan Secret menyimpan konfigurasi atau data sensitif yang digunakan oleh objek-objek Kubernetes lainnya, seperti Pod.
Biasanya, source of truth dari ConfigMap atau Secret berasal dari luar klaster, seperti berkas .properties
atau berkas kunci SSH.
Kustomize memiliki secretGenerator
dan configMapGenerator
, yang akan membangkitkan (generate) Secret dan ConfigMap dari berkas-berkas atau nilai-nilai literal.
configMapGenerator
Untuk membangkitkan sebuah ConfigMap dari berkas, tambahkan entri ke daftar files
pada configMapGenerator
.
Contoh di bawah ini membangkitkan sebuah ConfigMap dengan data dari berkas .properties
:
# Membuat berkas application.properties
cat <<EOF >application.properties
FOO=Bar
EOF
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-1
files:
- application.properties
EOF
ConfigMap yang telah dibangkitkan dapat dilihat menggunakan perintah berikut:
kubectl kustomize ./
Isinya seperti di bawah ini:
apiVersion: v1
data:
application.properties: |
FOO: Bar
kind: ConfigMap
metadata:
name: example-configmap-1-42cfbf598f
ConfigMap juga dapat dibangkitkan dari pasangan key-value literal. Untuk membangkitkan secara literal, tambahkan entri pada daftar literals
di configMapGenerator
.
Contoh di bawah ini membangkitkan ConfigMap dengan data dari pasangan key-value:
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-2
literals:
- FOO=Bar
EOF
ConfigMap yang dibangkitkan dapat dilihat menggunakan perintah berikut:
kubectl kustomize ./
Isinya seperti ini:
apiVersion: v1
data:
FOO: Bar
kind: ConfigMap
metadata:
name: example-configmap-2-g2hdhfc6tk
secretGenerator
Kamu dapat membangkitkan Secret dari berkas atau pasangan key-value literal. Untuk membangkitkan dari berkas, tambahkan entri pada daftar files
di secretGenerator
.
Contoh di bawah ini membangkitkan Secret dengan data dari berkas:
# Membuat berkas password.txt
cat <<EOF >./password.txt
username=admin
password=secret
EOF
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: example-secret-1
files:
- password.txt
EOF
Isinya seperti ini:
apiVersion: v1
data:
password.txt: dXNlcm5hbWU9YWRtaW4KcGFzc3dvcmQ9c2VjcmV0Cg==
kind: Secret
metadata:
name: example-secret-1-t2kt65hgtb
type: Opaque
Untuk membangkitkan secara literal dari pasangan key-value, tambahkan entri pada daftar literals
di secretGenerator
.
Contoh di bawah ini membangkitkan Secret dengan data dari pasangan key-value:
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: example-secret-2
literals:
- username=admin
- password=secret
EOF
Isinya seperti ini:
apiVersion: v1
data:
password: c2VjcmV0
username: YWRtaW4=
kind: Secret
metadata:
name: example-secret-2-t52t6g96d8
type: Opaque
generatorOptions
ConfigMap dan Secret yang dibangkitkan memiliki informasi sufiks hash. Hal ini memastikan bahwa ConfigMap atau Secret yang baru, dibangkitkan saat isinya berubah.
Untuk menonaktifkan penambahan sufiks ini, kamu bisa menggunakan generatorOptions
. Selain itu, melalui field ini kamu juga bisa mengatur opsi-opsi yang bersinggungan untuk ConfigMap dan Secret yang dibangkitkan.
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-3
literals:
- FOO=Bar
generatorOptions:
disableNameSuffixHash: true
labels:
type: generated
annotations:
note: generated
EOF
Jalankan perintah kubectl kustomize ./
untuk melihat ConfigMap yang dibangkitkan:
apiVersion: v1
data:
FOO: Bar
kind: ConfigMap
metadata:
annotations:
note: generated
labels:
type: generated
name: example-configmap-3
Mengatur field yang bersinggungan
Mengatur field-field yang bersinggungan untuk semua sumber daya Kubernetes dalam sebuah proyek. Beberapa contoh kasusnya seperti di bawah ini:
- mengatur Namespace yang sama untuk semua sumber daya
- menambahkan prefiks atau sufiks yang sama
- menambahkan kumpulan label yang sama
- menambahkan kumpulan anotasi yang sama
Lihat contoh di bawah ini:
# Membuat sebuah deployment.yaml
cat <<EOF >./deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
EOF
cat <<EOF >./kustomization.yaml
namespace: my-namespace
namePrefix: dev-
nameSuffix: "-001"
commonLabels:
app: bingo
commonAnnotations:
oncallPager: 800-555-1212
resources:
- deployment.yaml
EOF
Jalankan perintah kubectl kustomize ./
untuk melihat field-field tersebut telah terisi di dalam sumber daya Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
oncallPager: 800-555-1212
labels:
app: bingo
name: dev-nginx-deployment-001
namespace: my-namespace
spec:
selector:
matchLabels:
app: bingo
template:
metadata:
annotations:
oncallPager: 800-555-1212
labels:
app: bingo
spec:
containers:
- image: nginx
name: nginx
Mengkomposisi dan Melakukan Kustomisasi Sumber Daya
Mengkomposisi kumpulan sumber daya dalam sebuah proyek dan mengelolanya di dalam berkas atau direktori yang sama merupakan hal yang cukup umum dilakukan. Kustomize menyediakan cara untuk mengkomposisi sumber daya dari berkas-berkas yang berbeda, lalu menerapkan patch atau kustomisasi lain di atasnya.
Melakukan Komposisi
Kustomize mendukung komposisi dari berbagai sumber daya yang berbeda. Field resources
pada berkas kustomization.yaml
, mendefinisikan daftar sumber daya yang diinginkan dalam sebuah konfigurasi. Atur terlebih dahulu jalur (path) ke berkas konfigurasi sumber daya pada daftar resources
.
Contoh di bawah ini merupakan sebuah aplikasi NGINX yang terdiri dari sebuah Deployment dan sebuah Service:
# Membuat berkas deployment.yaml
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF
# Membuat berkas service.yaml
cat <<EOF > service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
EOF
# Membuat berkas kustomization.yaml yang terdiri dari keduanya
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
- service.yaml
EOF
Sumber daya dari kubectl kustomize ./
berisi kedua objek Deployment dan Service.
Melakukan Kustomisasi
Patch dapat digunakan untuk menerapkan berbagai macam kustomisasi pada sumber daya. Kustomize mendukung berbagai mekanisme patching yang berbeda melalui patchesStrategicMerge
dan patchesJson6902
. patchesStrategicMerge
adalah daftar dari yang berisi tentang path berkas. Setiap berkas akan dioperasikan dengan cara strategic merge patch. Nama di dalam patch harus sesuai dengan nama sumber daya yang telah dimuat. Kami menyarankan patch-patch kecil yang hanya melakukan satu hal saja.
Contoh membuat sebuah patch di bawah ini akan menambahkan jumlah replika Deployment dan patch lainnya untuk mengatur limit memori.
# Membuat berkas deployment.yaml
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF
# Membuat sebuah patch increase_replicas.yaml
cat <<EOF > increase_replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
EOF
# Membuat patch lainnya set_memory.yaml
cat <<EOF > set_memory.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
template:
spec:
containers:
- name: my-nginx
resources:
limits:
memory: 512Mi
EOF
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
patchesStrategicMerge:
- increase_replicas.yaml
- set_memory.yaml
EOF
Jalankan perintah kubectl kustomize ./
untuk melihat isi dari Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- image: nginx
limits:
memory: 512Mi
name: my-nginx
ports:
- containerPort: 80
Tidak semua sumber daya atau field mendukung strategic merge patch. Untuk mendukung field sembarang pada sumber daya field, Kustomize
menyediakan penerapan patch JSON melalui patchesJson6902
.
Untuk mencari sumber daya yang tepat dengan sebuah patch Json, maka grup, versi, jenis dan nama dari sumber daya harus dispesifikasikan dalam kustomization.yaml
.
Contoh di bawah ini menambahkan jumlah replika dari objek Deployment yang bisa juga dilakukan melalui patchesJson6902
.
# Membuat berkas deployment.yaml
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF
# Membuat patch json
cat <<EOF > patch.yaml
- op: replace
path: /spec/replicas
value: 3
EOF
# Membuat berkas kustomization.yaml
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: my-nginx
path: patch.yaml
EOF
Jalankan perintah kubectl kustomize ./
untuk melihat field replicas
yang telah diperbarui:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- image: nginx
name: my-nginx
ports:
- containerPort: 80
Selain patch, Kustomize juga menyediakan cara untuk melakukan kustomisasi image Container atau memasukkan nilai field dari objek lainnya ke dalam Container tanpa membuat patch. Sebagai contoh, kamu dapat melakukan kustomisasi image yang digunakan di dalam Container dengan menyebutkan spesifikasi field images
di dalam kustomization.yaml
.
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
images:
- name: nginx
newName: my.image.registry/nginx
newTag: 1.4.0
EOF
Jalankan perintah kubectl kustomize ./
untuk melihat image yang sedang digunakan telah diperbarui:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 2
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- image: my.image.registry/nginx:1.4.0
name: my-nginx
ports:
- containerPort: 80
Terkadang, aplikasi yang berjalan di dalam Pod perlu untuk menggunakan nilai konfigurasi dari objek lainnya.
Contohnya, sebuah Pod dari objek Deployment perlu untuk membaca nama Service dari Env atau sebagai argumen perintah.
Ini karena nama Service bisa saja berubah akibat dari penambahan namePrefix
atau nameSuffix
pada berkas kustomization.yaml
.
Kami tidak menyarankan kamu untuk meng-hardcode nama Service di dalam argumen perintah.
Untuk penggunaan ini, Kustomize dapat memasukkan nama Service ke dalam Container melalui vars
.
# Membuat berkas deployment.yaml
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
command: ["start", "--host", "\$(MY_SERVICE_NAME)"]
EOF
# Membuat berkas service.yaml
cat <<EOF > service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
EOF
cat <<EOF >./kustomization.yaml
namePrefix: dev-
nameSuffix: "-001"
resources:
- deployment.yaml
- service.yaml
vars:
- name: MY_SERVICE_NAME
objref:
kind: Service
name: my-nginx
apiVersion: v1
EOF
Jalankan perintah kubectl kustomize ./
untuk melihat nama Service yang dimasukkan ke dalam Container menjadi dev-my-nginx-001
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dev-my-nginx-001
spec:
replicas: 2
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- command:
- start
- --host
- dev-my-nginx-001
image: nginx
name: my-nginx
Base dan Overlay
Kustomize memiliki konsep base dan overlay. base merupakan direktori dengan kustomization.yaml
, yang berisi
sekumpulan sumber daya dan kustomisasi yang terkait. base dapat berupa direktori lokal maupun direktori dari repo remote,
asalkan berkas kustomization.yaml
ada di dalamnya. overlay merupakan direktori dengan kustomization.yaml
yang merujuk pada
direktori kustomization lainnya sebagai base-nya. base tidak memiliki informasi tentang overlay. dan dapat digunakan pada beberapa overlay sekaligus.
overlay bisa memiliki beberapa base dan terdiri dari semua sumber daya yang berasal dari base yang juga dapat memiliki kustomisasi lagi di atasnya.
Contoh di bawah ini memperlihatkan kegunaan dari base:
# Membuat direktori untuk menyimpan base
mkdir base
# Membuat base/deployment.yaml
cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
EOF
# Membuat berkas base/service.yaml
cat <<EOF > base/service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
EOF
# Membuat berkas base/kustomization.yaml
cat <<EOF > base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
EOF
base ini dapat digunakan di dalam beberapa overlay sekaligus. Kamu dapat menambahkan namePrefix
yang berbeda ataupun
field lainnya yang bersinggungan di dalam overlay berbeda. Di bawah ini merupakan dua buah overlay yang menggunakan base yang sama.
mkdir dev
cat <<EOF > dev/kustomization.yaml
resources:
- ../base
namePrefix: dev-
EOF
mkdir prod
cat <<EOF > prod/kustomization.yaml
resources:
- ../base
namePrefix: prod-
EOF
Cara menerapkan/melihat/menghapus objek menggunakan Kustomize
Gunakan --kustomize
atau -k
di dalam perintah kubectl
untuk mengenali sumber daya yang dikelola oleh kustomization.yaml
.
Perhatikan bahwa -k
harus merujuk pada direktori kustomization, misalnya:
kubectl apply -k <direktori kustomization>/
Buatlah kustomization.yaml
seperti di bawah ini:
# Membuat berkas deployment.yaml
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF
# Membuat berkas kustomization.yaml
cat <<EOF >./kustomization.yaml
namePrefix: dev-
commonLabels:
app: my-nginx
resources:
- deployment.yaml
EOF
Jalankan perintah di bawah ini untuk menerapkan objek Deployment dev-my-nginx
:
> kubectl apply -k ./
deployment.apps/dev-my-nginx created
Jalankan perintah di bawah ini untuk melihat objek Deployment dev-my-nginx
:
kubectl get -k ./
kubectl describe -k ./
Jalankan perintah di bawah ini untuk membandingkan objek Deployment dev-my-nginx
dengan kondisi yang diinginkan pada klaster jika manifes telah berhasil diterapkan:
kubectl diff -k ./
Jalankan perintah di bawah ini untuk menghapus objek Deployment dev-my-nginx
:
> kubectl delete -k ./
deployment.apps "dev-my-nginx" deleted
Daftar Fitur Kustomize
Field | Tipe | Deskripsi |
---|---|---|
namespace | string | menambahkan Namespace untuk semua sumber daya |
namePrefix | string | nilai dari field ini ditambahkan di awal pada nama dari semua sumber daya |
nameSuffix | string | nilai dari field ini ditambahkan di akhir pada nama dari semua sumber daya |
commonLabels | map[string]string | label untuk ditambahkan pada semua sumber daya dan selektor |
commonAnnotations | map[string]string | anotasi untuk ditambahkan pada semua sumber daya |
resources | []string | setiap entri di dalam daftar ini harus diselesaikan pada berkas konfigurasi sumber daya yang sudah ada |
configmapGenerator | []ConfigMapArgs | setiap entri di dalam daftar ini membangkitkan ConfigMap |
secretGenerator | []SecretArgs | setiap entri di dalam daftar ini membangkitkan Secret |
generatorOptions | GeneratorOptions | memodifikasi perilaku dari semua generator ConfigMap dan Secret |
bases | []string | setiap entri di dalam daftar ini harus diselesaikan ke dalam sebuah direktori yang berisi berkas kustomization.yaml |
patchesStrategicMerge | []string | setiap entri di dalam daftar ini harus diselesaikan dengan strategic merge patch dari sebuah objek Kubernetes |
patchesJson6902 | []Json6902 | setiap entri di dalam daftar ini harus diselesaikan ke suatu objek Kubernetes atau patch Json |
vars | []Var | setiap entri digunakan untuk menangkap teks yang berasal dari field sebuah sumber daya |
images | []Image | setiap entri digunakan untuk memodifikasi nama, tag dan/atau digest untuk sebuah image tanpa membuat patch |
configurations | []string | setiap entri di dalam daftar ini harus diselesaikan ke sebuah berkas yang berisi konfigurasi transformer Kustomize |
crds | []string | setiap entri di dalam daftar ini harus diselesaikan ke sebuah berkas definisi OpenAPI untuk tipe Kubernetes |
Selanjutnya
3 - Pengelolaan Objek Kubernetes dengan Perintah Imperatif
Objek-objek Kubernetes bisa dibuat, diperbarui, dan dihapus secara langsung dengan menggunakan perintah-perintah imperatif yang ada pada command-line kubectl
. Dokumen ini menjelaskan cara perintah-perintah tersebut diorganisir dan cara menggunakan perintah-perintah tersebut untuk mengelola objek live.
Kelebihan dan kekurangan
Perintah kubectl
mendukung tiga cara pengelolaan objek:
- Perintah imperatif
- Konfigurasi objek imperatif
- Konfigurasi objek deklaratif
Lihat Pengelolaan Objek Kubernetes untuk mengenali lebih lanjut kelebihan dan kekurangan dari tiap pengelolaan objek.
Cara membuat objek
Perangkat kubectl
mendukung perintah-perintah berbentuk kata kerja untuk membuat beberapa tipe objek yang paling umum. Perintah-perintah tersebut diberi nama yang mudah dikenali oleh pengguna yang belum familiar dengan tipe-tipe objek Kubernetes.
run
: Membuat sebuah objek Deployment untuk menjalankan kontainer di satu atau lebih Pod.expose
: Membuat sebuah objek Service untuk mengatur lalu lintas beban antar Pod.autoscale
: Membuat sebuah objek Autoscaler untuk melakukan scaling horizontal secara otomatis terhadap sebuah objek controller, misalnya sebuah objek Deployment.
Perangkat kubectl
juga mendukung perintah-perintah pembuatan objek yang berdasarkan pada tipe objek. Perintah-perintah ini mendukung lebih banyak tipe objek dan lebih eksplisit tentang intensi mereka. Tapi, perintah-perintah ini memerlukan pengguna untuk memahami tipe dari objek-objek yang hendak mereka buat.
create <objecttype> [<subtype>] <instancename>
Beberapa tipe objek memiliki sub tipe yang bisa kamu spesifikasikan pada perintah create
. Misalnya, objek Service memiliki beberapa sub tipe seperti ClusterIP, LoadBalancer, dan NodePort. Berikut adalah sebuah contoh cara membuat sebuah Service dengan sub tipe NodePort:
kubectl create service nodeport <myservicename>
Pada contoh di atas, perintah create service nodeport
merupakan sub perintah dari create service
.
Kamu bisa menggunakan parameter -h
untuk mencari argumen-argumen dan paramenter-parameter yang didukung oleh sebuah sub perintah:
kubectl create service nodeport -h
Cara memperbarui objek
Perintah kubectl
mendukung perintah-perintah berbasis kata kerja untuk beberapa operasi pembaruan yang umum. Perintah-perintah ini diberi nama yang memudahkan pengguna yang belum familiar dengan objek-objek Kubernetes untuk melakukan pembaruan tanpa terlebih dulu mengetahui field-field spesifik yang harus diperbarui:
scale
: Melakukan scaling horizontal terhadap sebuah controller untuk menambah atau menghapus Pod dengan memperbarui jumlah replika dari controller tersebut.annotate
: Menambah atau menghapus anotasi sebuah objek.label
: Menambah atau menghapus label sebuah objek.
Perintah kubectl
juga mendukung perintah-perintah pembaruan berdasarkan salah satu aspek dari sebuah objek. Untuk tiap tipe objek yang berbeda, memperbarui sebuah aspek tertentu bisa berarti memperbarui sekumpulan field yang berbeda pula:
set
<field>
: Memperbarui salah satu aspek dari sebuah objek.
Catatan:
Pada Kubernetes versi 1.5, tidak semua perintah yang berdasarkan kata kerja berasosiasi dengan perintah yang berdasarkan aspek tertentu.Perangkat kubectl
juga mendukung beberapa cara lain untuk memperbarui objek live secara langsung, meskipun cara-cara berikut membutuhkan pemahaman yang lebih tentang skema objek Kubernetes.
edit
: Secara langsung mengedit konfigurasi mentah dari sebuah objek live dengan membuka konfigurasinya di sebuah editor.patch
: Secara langsung memodifikasi field-field spesifik dari sebuah objek live dengan menggunakan patch string. Untuk detil lebih lanjut mengenaipatch string
, lihat bagian tentang patch pada Konvensi API.
Cara menghapus objek
Kamu bisa menggunakan perintah delete
pada sebuah objek dari sebuah klaster:
delete <type>/<name>
Catatan:
Kamu bisa menggunakankubectl delete
baik untuk perintah imperatif maupun konfigurasi objek imperatif. Perbedaannya hanya pada argumen yang diberikan ke perintah tersebut. Untuk menggunakan kubectl delete
sebagai perintah imperatif, argumen yang diberikan adalah objek yang hendak dihapus. Berikut adalah sebuah contoh perintah kubectl delete
dengan sebuah objek Deployment bernama nginx sebagai argumen:kubectl delete deployment/nginx
Cara melihat objek
Ada beberapa perintah untuk menampilkan informasi tentang sebuah objek:
get
: Menampilkan informasi dasar dari objek-objek yang sesuai dengan parameter dari perintah ini. Gunakanget -h
untuk melihat daftar opsi yang bisa digunakan.describe
: Menampilkan agregat informasi detil dari objek-objek yang sesuai dengan parameter dari perintah ini.logs
: Menampilkan isi stdout dan stderr dari sebuah kontainer yang berjalan di sebuah Pod.
Menggunakan perintah set
untuk memodifikasi objek sebelum dibuat
Ada beberapa field objek yang tidak memiliki parameter yang bisa kamu gunakan pada perintah create
. Pada kasus-kasus tersebut, kamu bisa menggunakan kombinasi dari perintah set
dan create
untuk menspesifikasikan nilai untuk field-field tersebut sebelum objek dibuat. Ini dilakukan dengan melakukan piping pada hasil dari perintah create
ke perintah set
, dan kemudian mengembalikan hasilnya ke perintah create
. Simak contoh berikut:
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run | kubectl set selector --local -f - 'environment=qa' -o yaml | kubectl create -f -
- Perintah
kubectl create service -o yaml --dry-run
membuat konfigurasi untuk sebuah Service, tapi kemudian menuliskan konfigurasi tadi ke stdout dalam format YAML alih-alih mengirimnya ke API Server Kubernetes. - Perintah
kubectl set selector --local -f - -o yaml
membaca konfigurasi dari stdin, dan menuliskan pembaruan konfigurasi ke stdout dalam format YAML. - Perintah
kubectl create -f -
membuat objek dengan menggunakan konfigurasi yang disediakan pada stdin.
Menggunakan --edit
untuk memodifikasi objek sebelum dibuat
Kamu bisa menggunakan perintah kubectl create --edit
untuk membuat perubahan terhadap sebuah objek sebelum objek tersebut dibuat. Simak contoh berikut:
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run > /tmp/srv.yaml
kubectl create --edit -f /tmp/srv.yaml
- Perintah
kubectl create service
membuat konfigurasi untuk objek Service dan menyimpannya di/tmp/srv.yaml
. - Perintah
kubectl create --edit
membuka berkas konfigurasi untuk disunting sebelum objek dibuat.
Selanjutnya
4 - Pengelolaan Objek Kubernetes Secara Imperatif dengan Menggunakan File Konfigurasi
Objek-objek Kubernetes bisa dibuat, diperbarui, dan dihapus dengan menggunakan perangkat command-line kubectl
dan file konfigurasi objek yang ditulis dalam format YAML atau JSON. Dokumen ini menjelaskan cara mendefinisikan dan mengelola objek dengan menggunakan file konfigurasi.
Kelebihan dan kekurangan
Perintah kubectl
mendukung tiga cara pengelolaan objek:
- Perintah imperatif
- Konfigurasi objek imperatif
- Konfigurasi objek deklaratif
Lihat Pengelolaan Objek Kubernetes untuk mengenali lebih lanjut kelebihan dan kekurangan dari tiap cara pengelolaan objek.
Cara membuat objek
Kamu bisa menggunakan perintah kubectl create -f
untuk membuat sebuah objek dari sebuah file konfigurasi. Rujuk dokumen referensi API Kubernetes untuk detil lebih lanjut.
kubectl create -f <nama-file|url>
Cara memperbarui objek
Peringatan:
Memperbarui objek dengan perintahreplace
akan menghilangkan semua bagian dari spesifikasi objek yang tidak dispesifikasikan pada file konfigurasi. Oleh karena itu, perintah ini sebaiknya tidak digunakan terhadap objek-objek yang spesifikasinya sebagian dikelola oleh klaster, misalnya Service dengan tipe LoadBalancer
, di mana field externalIPs
dikelola secara terpisah dari file konfigurasi. Field-field yang dikelola secara terpisah harus disalin ke file konfigurasi untuk mencegah terhapus oleh perintah replace
.Kamu bisa menggunakan perintah kubectl replace -f
untuk memperbarui sebuah objek live sesuai dengan sebuah file konfigurasi.
kubectl replace -f <nama-file|url>
Cara menghapus objek
Kamu bisa menggunakan perintah kubectl delete -f
untuk menghapus sebuah objek yang dideskripsikan pada sebuah file konfigurasi.
kubectl delete -f <nama-file|url>
Cara melihat objek
Kamu bisa menggunakan perintah kubectl get -f
untuk melihat informasi tentang sebuah objek yang dideskripsikan pada sebuah file konfigurasi.
kubectl get -f <nama-file|url> -o yaml
Parameter -o yaml
menetapkan bahwa keseluruhan konfigurasi objek ditulis ke file yaml. Gunakan perintah kubectl get -h
untuk melihat daftar pilihan selengkapnya.
Keterbatasan
Perintah-perintah create
, replace
, dan delete
bekerja dengan baik saat tiap konfigurasi dari sebuah objek didefinisikan dan dicatat dengan lengkap pada file konfigurasi objek tersebut. Akan tetapi, ketika sebuah objek live diperbarui dan pembaruannya tidak dicatat di file konfigurasinya, pembaruan tersebut akan hilang ketika perintah replace
dieksekusi di waktu berikutnya. Ini bisa terjadi saat sebuah controller, misalnya sebuah HorizontalPodAutoscaler
, membuat pembaruan secara langsung ke sebuah objek live. Berikut sebuah contoh:
- Kamu membuat sebuah objek dari sebuah file konfigurasi.
- Sebuah sumber lain memperbarui objek tersebut dengan mengubah beberapa field.
- Kamu memperbarui objek tersebut dengan
kubectl replace
dari file konfigurasi. Perubahan yang dibuat dari sumber lain pada langkah nomor 2 di atas akan hilang.
Jika kamu perlu mendukung beberapa writer untuk objek yang sama, kamu bisa menggunakan kubectl apply
untuk mengelola objek tersebut.
Membuat dan mengedit objek dari URL tanpa menyimpan konfigurasinya
Misalkan kamu memiliki URL dari sebuah file konfigurasi objek. Kamu bisa menggunakan kubectl create --edit
untuk membuat perubahan pada konfigurasi sebelum objek tersebut dibuat. Langkah ini terutama berguna untuk mengikuti tutorial atau untuk pekerjaan-pekerjaan yang menggunakan sebuah file konfigurasi di URL terentu yang perlu dimodifikasi.
kubectl create -f <url> --edit
Migrasi dari perintah imperatif ke konfigurasi objek imperatif
Migrsasi dari perintah imperatif ke konfigurasi objek imperatif melibatkan beberapa langkah manual.
- Ekspor objek live ke sebuah file konfigurasi objek lokal:
kubectl get <kind>/<name> -o yaml --export > <kind>_<name>.yaml
Hapus secara manual field status dari file konfigurasi objek.
Untuk pengelolaan objek selanjutnya, gunakan perintah
replace
secara eksklusif.
kubectl replace -f <kind>_<name>.yaml
Mendefinisikan controller selectors dan label PodTemplate
Peringatan:
Memperbarui selectors pada controllers sangat tidak disarankan.Pendekatan yang direkomendasikan adalah mendefinisikan sebuah label PodTemplate tunggal dan immutable yang hanya digunakan oleh controller selector tersebut, tanpa makna semantik lainnya.
Contoh label:
selector:
matchLabels:
controller-selector: "extensions/v1beta1/deployment/nginx"
template:
metadata:
labels:
controller-selector: "extensions/v1beta1/deployment/nginx"