diff --git a/content/id/docs/setup/production-environment/_index.md b/content/id/docs/setup/production-environment/_index.md new file mode 100644 index 0000000000..798024b963 --- /dev/null +++ b/content/id/docs/setup/production-environment/_index.md @@ -0,0 +1,4 @@ +--- +title: Lingkungan Produksi +weight: 30 +--- diff --git a/content/id/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md b/content/id/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md new file mode 100644 index 0000000000..4b7b15e91c --- /dev/null +++ b/content/id/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md @@ -0,0 +1,638 @@ +--- +title: Membuat sebuah klaster dengan control-plane tunggal menggunakan kubeadm +content_template: templates/task +weight: 30 +--- + +{{% capture overview %}} + +Perkakas `kubeadm` membantu kamu membuat sebuah klaster Kubernetes minimum yang layak dan sesuai dengan _best practice_. Bahkan, kamu dapat menggunakan `kubeadm` untuk membuat sebuah klaster yang lolos [uji Kubernetes Conformance](https://kubernetes.io/blog/2017/10/software-conformance-certification). +`kubeadm` juga mendukung fungsi siklus hidup (_lifecycle_) +klaster lainnya, seperti [_bootstrap token_](/docs/reference/access-authn-authz/bootstrap-tokens/) dan pembaruan klaster (_cluster upgrade_). + +`kubeadm` merupakan perkakas yang bagus jika kamu membutuhkan: + +- Sebuah cara yang sederhana untuk kamu mencoba Kubernetes, mungkin untuk pertama kalinya. +- Sebuah cara bagi pengguna lama (_existing users_) untuk mengotomatiskan penyetelan sebuah klaster dan menguji aplikasi mereka. +- Sebuah komponen dasar pada ekosistem lain dan/atau perkakas penginstal lain dengan cakupan + yang lebih luas. + +Kamu dapat menginstal dan menggunakan `kubeadm` pada berbagai macam mesin: laptop milikmu, sekelompok +server di _cloud_, sebuah Raspberry Pi, dan lain-lain. Baik itu men-_deploy_ pada +_cloud_ ataupun _on-premise_, kamu dapat mengintegrasikan `kubeadm` pada sistem _provisioning_ seperti +Ansible atau Terraform. + +{{% /capture %}} + +{{% capture prerequisites %}} + +Untuk mengikuti panduan ini, kamu membutuhkan: + +- Satu mesin atau lebih, yang menjalankan sistem operasi Linux yang kompatibel dengan deb atau rpm; sebagai contoh: Ubuntu atau CentOS. +- 2 GiB atau lebih RAM per mesin--kurang dari nilai tersebut akan menyisakan sedikit ruang untuk + aplikasi-aplikasimu. +- Sedikitnya 2 CPU pada mesin yang akan kamu gunakan sebagai Node _control-plane_. +- Koneksi internet pada seluruh mesin pada klaster. Kamu dapat menggunakan internet + publik ataupun pribadi. + + +Kamu juga harus menggunakan versi `kubeadm` yang dapat men-_deploy_ versi +Kubernetes yang ingin kamu gunakan pada klaster barumu. + +[Kebijakan dukungan versi Kubernetes dan _version skew_](https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions) juga berlaku pada `kubeadm` dan Kubernetes secara umum. +Periksa kebijakan tersebut untuk mempelajari tentang versi Kubernetes dan `kubeadm` +mana saja yang didukung. Laman ini ditulis untuk Kubernetes {{< param "version" >}}. + +Fitur `kubeadm` secara umum berstatus _General Availability_ (GA). Beberapa sub-fitur sedang +berada dalam pengembangan. Implementasi pembuatan klaster dapat berubah +sedikit seiring dengan berevolusinya kubeadm, namun secara umum implementasinya sudah cukup stabil. + +{{< note >}} +Semua perintah di dalam `kubeadm alpha`, sesuai definisi, didukung pada level _alpha_. +{{< /note >}} + +{{% /capture %}} + +{{% capture steps %}} + +## Tujuan + +* Menginstal Kubernetes klaster dengan _control-plane_ tunggal atau [klaster dengan ketersediaan tinggi](/docs/setup/production-environment/tools/kubeadm/high-availability/) +* Menginstal jaringan Pod pada klaster sehingga Pod dapat + berinteraksi satu sama lain + +## Instruksi + +### Menginstal kubeadm pada hos + +Lihat ["Menginstal kubeadm"](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/). + +{{< note >}} +Jika kamu sudah menginstal kubeadm sebelumnya, jalankan `apt-get update && +apt-get upgrade` atau `yum update` untuk mendapatkan versi kubeadm paling baru. + +Ketika kamu melakukan pembaruan, kubelet melakukan _restart_ setiap beberapa detik sambil menunggu dalam kondisi _crashloop_ sampai +kubeadm memberikan perintah yang harus dilakukan. _Crashloop_ ini memang diantisipasi dan normal. +Setelah kamu menginisialisasi _control-plane_, kubelet akan berjalan normal. +{{< /note >}} + +### Menginisialisasi Node _control-plane_ + +Node _control-plane_ adalah mesin dimana komponen-komponen _control plane_ berjalan, termasuk +{{< glossary_tooltip term_id="etcd" >}} (basis data klaster) dan +{{< glossary_tooltip text="API Server" term_id="kube-apiserver" >}} +(yang akan berkomunikasi dengan perkakas _command line_ {{< glossary_tooltip text="kubectl" term_id="kubectl" >}}. + +1. (Direkomendasikan) Jika kamu berencana untuk memperbarui klaster `kubeadm` dengan _control-plane_ tunggal +menjadi ketersediaan tinggi kamu harus menentukan `--control-plane-endpoint` agar mengarah ke _endpoint_ yang digunakan bersama +untuk semua Node _control-plane_. _Endpoint_ tersebut dapat berupa nama DNS atau sebuah alamat IP dari _load-balancer_. +2. Pilih _add-on_ jaringan Pod, dan pastikan apakah diperlukan argumen untuk +diberikan pada `kubeadm init`. Tergantung +penyedia pihak ketiga yang kamu pilih, kamu mungkin harus mengatur `--pod-network-cidr` dengan nilai +yang spesifik pada penyedia tertentu. Lihat [Menginstal _add-on_ jaringan Pod](#jaringan-pod). +3. (Opsional) Sejak versi 1.14, `kubeadm` mencoba untuk mendeteksi _runtime_ kontainer pada Linux +dengan menggunakan daftar _domain socket path_ yang umum diketahui. Untuk menggunakan _runtime_ kontainer yang berbeda atau +jika ada lebih dari satu yang terpasang pada Node yang digunakan, tentukan argumen `--cri-socket` +pada `kubeadm init`. Lihat [Menginstal _runtime_](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-runtime). +4. (Opsional) Kecuali ditentukan sebelumnya, `kubeadm` akan menggunakan antarmuka jaringan yang diasosiasikan +dengan _default gateway_ untuk mengatur alamat _advertise_ untuk API Server pada Node _control-plane_ ini. +Untuk menggunakan antarmuka jaringan yang berbeda, tentukan argumen `--apiserver-advertise-address=` +pada `kubeadm init`. Untuk men-_deploy_ klaster Kubernetes IPv6 menggunakan pengalamatan IPv6, kamu +harus menentukan alamat IPv6, sebagai contoh `--apiserver-advertise-address=fd00::101` +5. (Opsional) Jalankan `kubeadm config images pull` sebelum `kubeadm init` untuk memastikan +konektivitas ke _container image registry_ gcr.io. + +Untuk menginisialisasi Node _control-plane_ jalankan: + +```bash +kubeadm init +``` + +### Pertimbangan mengenai apiserver-advertise-address dan ControlPlaneEndpoint + +Meski `--apiserver-advertise-address` dapat digunakan untuk mengatur alamat _advertise_ untuk server +API pada Node _control-plane_ ini, `--control-plane-endpoint` dapat digunakan untuk mengatur _endpoint_ yang digunakan bersama +untuk seluruh Node _control-plane_. + +`--control-plane-endpoint` tidak hanya mengizinkan alamat IP tetapi juga nama DNS yang dapat dipetakan ke alamat IP. +Silakan hubungi administrator jaringan kamu untuk mengevaluasi solusi-solusi yang mempertimbangkan pemetaan tersebut. + +Berikut contoh pemetaannya: + +``` +192.168.0.102 cluster-endpoint +``` + +Di mana `192.168.0.102` merupakan alamat IP dari Node ini dan `cluster-endpoint` merupakan nama DNS _custom_ yang dipetakan pada IP ini. +Hal ini memungkinkan kamu untuk memberikan `--control-plane-endpoint=cluster-endpoint` pada `kubeadm init` dan memberikan nama DNS yang sama pada +`kubeadm join`. Kemudian kamu dapat memodifikasi `cluster-endpoint` untuk mengarah pada alamat _load-balancer_ dalam skenario +ketersediaan tinggi (_highly availabile_). + +Mengubah klaster _control plane_ tunggal yang dibuat tanpa `--control-plane-endpoint` menjadi klaster dengan ketersediaan tinggi +tidak didukung oleh kubeadm. + +### Informasi lebih lanjut + +Untuk informasi lebih lanjut mengenai argumen-argumen `kubeadm init`, lihat [panduan referensi kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm/). + +Untuk daftar pengaturan konfigurasi yang lengkap, lihat [dokumentasi berkas konfigurasi](/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file). + +Untuk menyetel komponen-komponen _control plane_, termasuk pemasangan IPv6 opsional pada _liveness probe_ untuk komponen-komponen _control plane_ dan server etcd, berikan argumen ekstra pada tiap komponen seperti yang didokumentasikan pada [argumen-argumen _custom_](/docs/setup/production-environment/tools/kubeadm/control-plane-flags/). + +Untuk menjalankan `kubeadm init` lagi, sebelumnya kamu harus [membongkar klaster](#pembongkaran). + +Jika kamu menggabungkan sebuah Node dengan arsitektur yang berbeda ke klastermu, pastikan DaemonSets yang di_deploy_ +memiliki _image_ kontainer yang mendukung arsitektur tersebut. + +Pertama-tama `kubeadm init` akan menjalankan sekumpulan _precheck_ untuk memastikan mesin +siap untuk menjalankan Kubernetes. Kumpulan _precheck_ ini menunjukkan peringatan-peringatan dan akan berhenti jika terjadi kesalahan. Kemudian `kubeadm init` +akan mengunduh dan menginstal komponen-komponen _control plane_ klaster. Hal ini membutuhkan waktu beberapa menit. +Keluaran yang dihasilkan terlihat seperti berikut ini: + +```none +[init] Using Kubernetes version: vX.Y.Z +[preflight] Running pre-flight checks +[preflight] Pulling images required for setting up a Kubernetes cluster +[preflight] This might take a minute or two, depending on the speed of your internet connection +[preflight] You can also perform this action in beforehand using 'kubeadm config images pull' +[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" +[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" +[kubelet-start] Activating the kubelet service +[certs] Using certificateDir folder "/etc/kubernetes/pki" +[certs] Generating "etcd/ca" certificate and key +[certs] Generating "etcd/server" certificate and key +[certs] etcd/server serving cert is signed for DNS names [kubeadm-cp localhost] and IPs [10.138.0.4 127.0.0.1 ::1] +[certs] Generating "etcd/healthcheck-client" certificate and key +[certs] Generating "etcd/peer" certificate and key +[certs] etcd/peer serving cert is signed for DNS names [kubeadm-cp localhost] and IPs [10.138.0.4 127.0.0.1 ::1] +[certs] Generating "apiserver-etcd-client" certificate and key +[certs] Generating "ca" certificate and key +[certs] Generating "apiserver" certificate and key +[certs] apiserver serving cert is signed for DNS names [kubeadm-cp kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4] +[certs] Generating "apiserver-kubelet-client" certificate and key +[certs] Generating "front-proxy-ca" certificate and key +[certs] Generating "front-proxy-client" certificate and key +[certs] Generating "sa" key and public key +[kubeconfig] Using kubeconfig folder "/etc/kubernetes" +[kubeconfig] Writing "admin.conf" kubeconfig file +[kubeconfig] Writing "kubelet.conf" kubeconfig file +[kubeconfig] Writing "controller-manager.conf" kubeconfig file +[kubeconfig] Writing "scheduler.conf" kubeconfig file +[control-plane] Using manifest folder "/etc/kubernetes/manifests" +[control-plane] Creating static Pod manifest for "kube-apiserver" +[control-plane] Creating static Pod manifest for "kube-controller-manager" +[control-plane] Creating static Pod manifest for "kube-scheduler" +[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" +[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s +[apiclient] All control plane components are healthy after 31.501735 seconds +[uploadconfig] storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace +[kubelet] Creating a ConfigMap "kubelet-config-X.Y" in namespace kube-system with the configuration for the kubelets in the cluster +[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "kubeadm-cp" as an annotation +[mark-control-plane] Marking the node kubeadm-cp as control-plane by adding the label "node-role.kubernetes.io/master=''" +[mark-control-plane] Marking the node kubeadm-cp as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] +[bootstrap-token] Using token: +[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles +[bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials +[bootstraptoken] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token +[bootstraptoken] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster +[bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace +[addons] Applied essential addon: CoreDNS +[addons] Applied essential addon: kube-proxy + +Your Kubernetes control-plane has initialized successfully! + +To start using your cluster, you need to run the following as a regular user: + + mkdir -p $HOME/.kube + sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config + sudo chown $(id -u):$(id -g) $HOME/.kube/config + +You should now deploy a Pod network to the cluster. +Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: + /docs/concepts/cluster-administration/addons/ + +You can now join any number of machines by running the following on each node +as root: + + kubeadm join : --token --discovery-token-ca-cert-hash sha256: +``` + +Untuk membuat kubectl bekerja bagi pengguna _non-root_, jalankan perintah-perintah berikut, yang juga merupakan +bagian dari keluaran `kubeadm init`: + +```bash +mkdir -p $HOME/.kube +sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config +sudo chown $(id -u):$(id -g) $HOME/.kube/config +``` + +Secara alternatif, jika kamu adalah pengguna `root`, kamu dapat menjalankan: + +```bash +export KUBECONFIG=/etc/kubernetes/admin.conf +``` + +Buatlah catatan dari perintah `kubeadm join` yang dihasilkan `kubeadm init`. Kamu +membutuhkan perintah ini untuk [menggabungkan Node-Node ke klaster](#menggabungkan-node). + +_Token_ digunakan untuk otentikasi bersama (_mutual authentication_) antara Node _control-plane_ dan Node-Node yang +akan bergabung. _Token_ yang didapat di sini bersifat rahasia. Simpan dengan aman, karena siapapun yang memiliki token tersebut +dapat menambahkan Node-Node yang dapat mengotentikasikan diri ke klaster. Kamu dapat menampilkan daftar _token_, +membuat, dan menghapus _token_ dengan perintah `kubeadm token`. Lihat +[panduan referensi kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm-token/). + +### Menginstal _add-on_ jaringan Pod {#jaringan-pod} + +{{< caution >}} +Bagian ini berisi informasi penting mengenai penyetelan jejaring dan +urutan _deployment_. +Baca seluruh saran ini dengan saksama sebelum melanjutkan. + +**Kamu harus men-_deploy_ +_add-on_ jaringan Pod berbasis {{< glossary_tooltip text="_Container Network Interface_" term_id="cni" >}} +(CNI) sehingga Pod dapat berkomunikasi satu sama lain. +DNS klaster (CoreDNS) tidak akan menyala sebelum jaringan dipasangkan.** + +- Perlu diperhatikan bahwa jaringan Pod tidak boleh tumpang tindih dengan jaringan hos + manapun: kamu akan menemui beberapa masalah jika terjadi tumpang tindih. + (Jika kamu menemukan adanya bentrokan antara jaringan Pod + pilihan _plugin_ jaringan dengan jaringan hos, kamu harus memikirkan blok + CIDR yang cocok untuk digunakan, kemudian menggunakannya pada saat `kubeadm init` dengan + `--pod-network-cidr`, atau sebagai penggantinya pada YAML _plugin_ jaringan kamu). + +- Secara bawaan, `kubeadm` mengatur klastermu untuk menggunakan dan melaksanakan penggunaan + [RBAC](/docs/reference/access-authn-authz/rbac/) (_role based access control_). + Pastikan _plugin_ jaringan Pod mendukung RBAC, dan begitu juga seluruh manifes + yang kamu gunakan untuk men-_deploy_-nya. + +- Jika kamu ingin menggunakan IPv6--baik jaringan _dual-stack_, ataupun jaringan _single-stack_ IPv6 + --untuk klastermu, pastikan _plugin_ jaringan Pod + mendukung IPv6. + Dukungan IPv6 telah ditambahkan pada CNI sejak [v0.6.0](https://github.com/containernetworking/cni/releases/tag/v0.6.0). + +{{< /caution >}} + +{{< note >}} +Saat ini Calico adalah satu-satunya _plugin_ CNI yang dapat menerima uji e2e (_end-to-end_) oleh proyek kubeadm. +Jika kamu menemukan isu terkait _plugin_ CNI kamu harus membuat tiket pada pelacak isu masing-masing _plugin_, +bukan pada pelacak isu kubeadm maupun kubernetes. +{{< /note >}} + +Beberapa proyek eksternal menyediakan jaringan Pod Kubernetes menggunakan CNI, beberapa di antaranya juga +mendukung [Network Policy](/docs/concepts/services-networking/networkpolicies/). + +Lihat daftar +[_add-on_ jejaring dan _network policy_](https://kubernetes.io/docs/concepts/cluster-administration/addons/#networking-and-network-policy) yang tersedia. + +Kamu dapat menginstal _add-on_ jaringan Pod dengan perintah berikut pada Node +_control-plane_ atau Node yang memiliki kredensial kubeconfig: + +```bash +kubectl apply -f +``` + +Kamu hanya dapat menginstal satu jaringan Pod per klaster. +Di bawah ini kamu dapat menemukan instruksi instalasi untuk beberapa _plugin_ jaringan Pod yang populer: + +{{< tabs name="tabs-pod-install" >}} + +{{% tab name="Calico" %}} +[Calico](https://docs.projectcalico.org/latest/introduction/) merupakan penyedia jejaring dan _network policy_. Calico mendukung sekumpulan opsi jejaring yang fleksibel sehingga kamu dapat memilih opsi yang paling efisien untuk situasimu, termasuk jaringan _non-overlay_ dan _overlay_, dengan atau tanpa BGP. Calico menggunakan mesin yang sama untuk melaksanakan _network policy_ pada hos, Pod, dan (jika menggunakan Istio & Envoy) aplikasi yang berada pada lapisan _service mesh_. Calico bekerja pada beberapa arsitektur, meliputi `amd64`, `arm64`, dan `ppc64le`. + +Secara bawaan, Calico menggunakan `192.168.0.0/16` sebagai CIDR jaringan Pod, namun hal ini dapat diatur pada berkas calico.yaml. Agar Calico dapat bekerja dengan benar, kamu perlu memberikan CIDR yang sama pada perintah `kubeadm init` menggunakan opsi `--pod-network-cidr=192.168.0.0/16` atau melalui konfigurasi kubeadm. + +```shell +kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml +``` + +{{% /tab %}} + +{{% tab name="Cilium" %}} +Agar Cilium dapat bekerja dengan benar, kamu harus memberikan `--pod-network-cidr=10.217.0.0/16` pada `kubeadm init`. + +Untuk men-_deploy_ Cilium kamu hanya perlu menjalankan: + +```shell +kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.6/install/kubernetes/quick-install.yaml +``` + +Ketika seluruh Pod Cilium sudah bertanda `READY`, kamu dapat mulai menggunakan klaster. + +```shell +kubectl get pods -n kube-system --selector=k8s-app=cilium +``` +Keluarannya akan tampil seperti berikut: +``` +NAME READY STATUS RESTARTS AGE +cilium-drxkl 1/1 Running 0 18m +``` + +Cilium dapat digunakan sebagai kube-proxy, lihat [Kubernetes tanpa kube-proxy](https://docs.cilium.io/en/stable/gettingstarted/kubeproxy-free). + +Untuk informasi lebih lanjut mengenai penggunaan Cilium dengan Kubernetes, lihat [panduan Instalasi Kubernetes untuk Cilium](https://docs.cilium.io/en/stable/kubernetes/). + +{{% /tab %}} + +{{% tab name="Contiv-VPP" %}} +[Contiv-VPP](https://contivpp.io/) menggunakan CNF vSwitch berbasis [FD.io VPP](https://fd.io/) yang dapat diprogram, +menawarkan layanan dan jejaring _cloud-native_ yang memiliki banyak fungsi dan berkinerja tinggi. + +Contiv-VPP mengimplementasikan Service dan Network Policy Kubernetes pada _user space_ (on VPP). + +Silakan merujuk pada panduan pemasangan berikut: [Pemasangan Manual Contiv-VPP](https://github.com/contiv/vpp/blob/master/docs/setup/MANUAL_INSTALL.md) +{{% /tab %}} + +{{% tab name="Kube-router" %}} + +Kube-router mengandalkan kube-controller-manager untuk mengalokasikan CIDR Pod untuk Node-Node. Maka dari itu, gunakan `kubeadm init` dengan opsi `--pod-network-cidr`. + +Kube-router menyediakan jejaring Pod, _network policy_, dan IP Virtual Server(IPVS)/Linux Virtual Server(LVS) berbasis _service proxy_ yang memiliki kinerja tinggi. + +Informasi mengenai penggunaan `kubeadm` untuk mendirikan klaster Kubernetes dengan Kube-router, dapat dilihat di [panduan pemasangan resminya](https://github.com/cloudnativelabs/kube-router/blob/master/docs/kubeadm.md). +{{% /tab %}} + +{{% tab name="Weave Net" %}} + +Untuk informasi lebih lanjut mengenai pemasangan klaster Kubernetes menggunakan Weave Net, silakan lihat [Mengintegrasikan Kubernetes melalui Addon](https://www.weave.works/docs/net/latest/kube-addon/). + +Weave Net bekerja pada platform `amd64`, `arm`, `arm64` dan `ppc64le` tanpa membutuhkan tindakan ekstra. +Weave Net menyalakan mode _hairpin_ secara bawaan. Hal ini mengizinkan Pod untuk mengakses dirinya sendiri melalui alamat IP Service +jika mereka tidak tahu PodIP miliknya. + +```shell +kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" +``` +{{% /tab %}} + +{{< /tabs >}} + + +Setelah jaringan Pod dipasangkan, kamu dapat mengonfirmasi hal tersebut dengan +memastikan Pod CoreDNS berada pada kondisi `Running` pada keluaran `kubectl get pods --all-namespaces`. +Dan setelah Pod CoreDNS sudah menyala dan berjalan, kamu dapat melanjutkan (pemasangan klaster) dengan menggabungkan Node-Node yang lain. + +Jika jaringan belum bekerja atau CoreDNS tidak berada pada kondisi `Running`, periksalah/lihatlah +[panduan penyelesaian masalah](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/) +untuk `kubeadm`. + +### Isolasi Node _control plane_ + +Secara bawaan, klaster tidak akan menjadwalkan Pod pada Node _control-plane_ untuk alasan +keamanan. Jika kamu ingin Pod dapat dijadwalkan pada Node _control-plane_, sebagai contoh untuk +klaster Kubernetes bermesin-tunggal untuk pengembangan, jalankan: + +```bash +kubectl taint nodes --all node-role.kubernetes.io/master- +``` + +Dengan keluaran seperti berikut: + +``` +node "test-01" untainted +taint "node-role.kubernetes.io/master:" not found +taint "node-role.kubernetes.io/master:" not found +``` + +Hal ini akan menghapus _taint_ `node-role.kubernetes.io/master` pada Node manapun yang +memilikinya, termasuk Node _control-plane_, sehingga _scheduler_ akan dapat +menjadwalkan Pod di manapun. + +### Menggabungkan Node-Node {#menggabungkan-node} + +Node adalah tempat beban kerja (Container, Pod, dan lain-lain) berjalan. Untuk menambahkan Node baru pada klaster lakukan hal berikut pada setiap mesin: + +* SSH ke mesin +* Gunakan pengguna _root_ (mis. `sudo su -`) +* Jalankan perintah hasil keluaran `kubeadm init`. Sebagai contoh: + +```bash +kubeadm join --token : --discovery-token-ca-cert-hash sha256: +``` + +Jika kamu tidak memiliki _token_, kamu bisa mendapatkannya dengan menjalankan perintah berikut pada Node _control-plane_: + +```bash +kubeadm token list +``` + +Keluarannya akan tampil seperti berikut: + +```console +TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS +8ewj1p.9r9hcjoqgajrj4gi 23h 2018-06-12T02:51:28Z authentication, The default bootstrap system: + signing token generated by bootstrappers: + 'kubeadm init'. kubeadm: + default-node-token +``` + +Secara bawaan, _token_ akan kadaluarsa dalam 24 jam. Jika kamu menggabungkan Node ke klaster setelah _token_ kadaluarsa, +kamu dapat membuat _token_ baru dengan menjalankan perintah berikut pada Node _control-plane_: + +```bash +kubeadm token create +``` + +Keluarannya akan tampil seperti berikut: + +```console +5didvk.d09sbcov8ph2amjw +``` + +Jika kamu tidak memiliki nilai `--discovery-token-ca-cert-hash`, kamu bisa mendapatkannya dengan menjalankan perintah berantai berikut pada Node _control-plane_: + +```bash +openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ + openssl dgst -sha256 -hex | sed 's/^.* //' +``` + +Keluaran yang diberikan kurang lebih akan ditampilkan sebagai berikut: + +```console +8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78 +``` + +{{< note >}} +Untuk menentukan _tuple_ IPv6 untuk `:`, alamat IPv6 harus be ditutup dengan kurung siku, sebagai contoh: `[fd00::101]:2073`. +{{< /note >}} + +Keluaran yang diberikan kurang lebih akan ditampilkan sebagai berikut: + +``` +[preflight] Running pre-flight checks + +... (log output of join workflow) ... + +Node join complete: +* Certificate signing request sent to control-plane and response + received. +* Kubelet informed of new secure connection details. + +Run 'kubectl get nodes' on control-plane to see this machine join. +``` + +Beberapa saat kemudian, kamu akan melihat Node tersebut pada keluaran dari `kubectl get nodes` ketika dijalankan pada Node _control-plane_. + +### (Opsional) Mengendalikan klaster dari mesin selain Node _control-plane_ + +Untuk membuat kubectl bekerja pada mesin lain (mis. laptop) agar dapat berbicara dengan +klaster, kamu harus menyalin berkas kubeconfig administrator dari Node _control-plane_ +ke mesin seperti berikut: + +```bash +scp root@:/etc/kubernetes/admin.conf . +kubectl --kubeconfig ./admin.conf get nodes +``` + +{{< note >}} +Contoh di atas mengasumsikan akses SSH dinyalakan untuk _root_. Jika tidak berlaku +demikian, kamu dapat menyalin berkas `admin.conf` untuk dapat diakses oleh pengguna lain +dan `scp` menggunakan pengguna lain tersebut. + +Berkas `admin.conf` memberikan penggunanya privilese (_privilege_) _superuser_ terhadap klaster. +Berkas ini harus digunakan seperlunya. Untuk pengguna biasa, direkomendasikan +untuk membuat kredensial unik dengan privilese _whitelist_. Kamu dapat melakukan +ini dengan perintah `kubeadm alpha kubeconfig user --client-name `. +Perintah tersebut akan mencetak berkas KubeConfig ke STDOUT yang harus kamu simpan +ke dalam sebuah berkas dan mendistribusikannya pada para pengguna. Setelah itu, whitelist +privilese menggunakan `kubectl create (cluster)rolebinding`. +{{< /note >}} + +### (Opsional) Memproksi API Server ke localhost + +Jika kamu ingin terhubung dengan API Server dari luar klaster kamu dapat menggunakan +`kubectl proxy`: + +```bash +scp root@:/etc/kubernetes/admin.conf . +kubectl --kubeconfig ./admin.conf proxy +``` + +Kini kamu dapat mengakses API Server secara lokal melalui `http://localhost:8001/api/v1` + +## Pembongkaran + +Jika kamu menggunakan server sekali pakai untuk membuat klaster, sebagai ujicoba, kamu dapat +mematikannya tanpa perlu melakukan pembongkaran. Kamu dapat menggunakan +`kubectl config delete-cluster` untuk menghapus referensi lokal ke +klaster. + +Namun, jika kamu ingin mengatur ulang klaster secara lebih rapih, pertama-tama kamu +harus [menguras (_drain_) Node](/docs/reference/generated/kubectl/kubectl-commands#drain) +dan memastikan Node sudah kosong, kemudian mengembalikan pengaturan pada Node kembali seperti semula. + +### Menghapus Node + +Berinteraksi dengan Node _control-plane_ menggunakan kredensial yang sesuai, jalankan: + +```bash +kubectl drain --delete-local-data --force --ignore-daemonsets +kubectl delete node +``` + +Lalu, pada Node yang dihapus, atur ulang semua kondisi `kubeadm` yang telah dipasang: + +```bash +kubeadm reset +``` + +Proses pengaturan ulang tidak mengatur ulang atau membersihkan kebijakan iptables atau tabel IPVS. Jika kamu ingin mengatur ulang iptables, kamu harus melakukannya secara manual: + +```bash +iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X +``` + +Jika kamu ingin mengatur ulang tabel IPVS, kamu harus menjalankan perintah berikut: + +```bash +ipvsadm -C +``` + +Jika kamu ingin mengulang dari awal, cukup jalankan `kubeadm init` atau `kubeadm join` dengan +argumen yang sesuai. + +### Membersihkan _control plane_ + +Kamu dapat menggunakan `kubeadm reset` pada hos _control plane_ untuk memicu pembersihan +best-effort. + +Lihat dokumentasi referensi [`kubeadm reset`](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) +untuk informasi lebih lanjut mengenai sub-perintah ini dan +opsinya. + +{{% /capture %}} + +{{% capture discussion %}} + +## Selanjutnya + +* Pastikan klaster berjalan dengan benar menggunakan [Sonobuoy](https://github.com/heptio/sonobuoy) +* Lihat [Memperbaharui klaster kubeadm](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/) + untuk detail mengenai pembaruan klaster menggunakan `kubeadm`. +* Pelajari penggunaan `kubeadm` lebih lanjut pada [dokumentasi referensi kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm) +* Pelajari lebih lanjut mengenai [konsep-konsep](/docs/concepts/) Kubernetes dan [`kubectl`](/docs/user-guide/kubectl-overview/). +* Lihat halaman [Cluster Networking](/docs/concepts/cluster-administration/networking/) untuk daftar +_add-on_ jaringan Pod yang lebih banyak. +* Lihat [daftar _add-on_](/docs/concepts/cluster-administration/addons/) untuk + mengeksplor _add-on_ lainnya, termasuk perkakas untuk _logging_, _monitoring_, _network policy_, visualisasi & + pengendalian klaster Kubernetes. +* Atur bagaimana klaster mengelola log untuk peristiwa-peristiwa klaster dan dari + aplikasi-aplikasi yang berjalan pada Pod. + Lihat [Arsitektur Logging](/docs/concepts/cluster-administration/logging/) untuk + gambaran umum tentang hal-hal yang terlibat. + +### Umpan balik + +* Untuk masalah kekutu (_bug_), kunjungi [kubeadm GitHub issue tracker](https://github.com/kubernetes/kubeadm/issues) +* Untuk dukungan, kunjungi kanal Slack + [#kubeadm](https://kubernetes.slack.com/messages/kubeadm/) +* Kanal Slack umum pengembangan SIG Cluster Lifecycle: + [#sig-cluster-lifecycle](https://kubernetes.slack.com/messages/sig-cluster-lifecycle/) +* SIG Cluster Lifecycle [SIG information](https://github.com/kubernetes/community/tree/master/sig-cluster-lifecycle#readme) +* Milis SIG Cluster Lifecycle: + [kubernetes-sig-cluster-lifecycle](https://groups.google.com/forum/#!forum/kubernetes-sig-cluster-lifecycle) + +## Kebijakan _version skew_ + +`kubeadm` versi v{{< skew latestVersion >}} dapat men-_deploy_ klaster dengan _control plane_ versi v{{< skew latestVersion >}} atau v{{< skew prevMinorVersion >}}. +`kubeadm` v{{< skew latestVersion >}} juga dapat memperbarui klaster yang dibuat dengan kubeadm v{{< skew prevMinorVersion >}}. + +Karena kita tidak dapat memprediksi masa depan, CLI kubeadm v{{< skew latestVersion >}} mungkin atau tidak mungkin dapat men-_deploy_ klaster v{{< skew nextMinorVersion >}}. + +Sumber daya ini menyediakan informasi lebih lanjut mengenai _version skew_ yang didukung antara kubelet dan _control plane_, serta komponen Kubernetes lainnya: + +* [Kebijakan versi and version-skew Kubernetes](/docs/setup/release/version-skew-policy/) +* [Panduan instalasi](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl) spesifik untuk kubeadm + +## Keterbatasan + +### Ketahanan klaster + +Klaster yang dibuat pada panduan ini hanya memiliki Node _control-plane_ tunggal, dengan basis data etcd tunggal +yang berjalan di atasnya. Hal ini berarti jika terjadi kegagalan pada Node _control-plane_, klaster dapat kehilangan +data dan mungkin harus dibuat kembali dari awal. + +Solusi: + +* Lakukan [back up etcd](https://coreos.com/etcd/docs/latest/admin_guide.html) secara reguler. Direktori data + etcd yang dikonfigurasi oleh kubeadm berada di `/var/lib/etcd` pada Node _control-plane_. + +* Gunakan banyak Node _control-plane_. Kamu dapat membaca + [Opsi untuk topologi dengan ketersediaan tinggi](/docs/setup/production-environment/tools/kubeadm/ha-topology/) untuk memilih topologi + klaster yang menyediakan ketersediaan lebih tinggi. + +### Kompatibilitas platform + +_Package_ dbm/rpm dan _binary_ kubeadm dibuat untuk amd64, arm (32-bit), arm64, ppc64le, dan s390x +mengikuti [proposal multi-platform](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/multi-platform.md). + +_Image_ kontainer _multiplatform_ untuk _control plane_ dan _addon_ juga telah didukung sejak v1.12. + +Hanya beberapa penyedia jaringan yang menawarkan solusi untuk seluruh platform. Silakan merujuk pada daftar +penyedia jaringan di atas atau dokumentasi dari masing-masing penyedia untuk mencari tahu apakah penyedia tersebut +mendukung platform pilihanmu. + +## Penyelesaian masalah + +Jika kamu menemui kesulitan dengan kubeadm, silakan merujuk pada [dokumen penyelesaian masalah](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/). + +{{% /capture %}}