Kubernetes Vanilla atau versi Kubernetes orisinil merupakan aplikasi opensource untuk Container Orchestration dengan berbagai fleksibilitas yang dapat diintegrasikan lebih lanjut bersama komponen atau tools lain dari pihak ketiga. Berbeda dengan distribusi Kubernetes (seperti OpenShift dan OKD) yang menawarkan kemudahan dalam instalasi, Kubernetes (atau sering disebut k8s) seringkali membutuhkan effort yang lebih besar dalam membangun klaster-nya jika dilakukan secara manual tanpa layanan dari vendor atau cloud provider (seperti EKS atau GKS). Namun sebenarnya kita dapat melakukannya dengan lebih effortless menggunakan tools untuk provisioning infrastruktur maupun konfigurasi, seperti Terraform dan Ansible.
Struktur Klaster
Pada artikel ini saya akan membangun klaster Kubernetes yang terdiri dari satu Control Plane atau Master Node, serta dua Worker Node. Untuk pengelolaan container di dalam klaster saya akan menggunakan Docker. Infrastruktur akan didirikan di cloud provider AWS (Amazon Web Service).
Provisioning
Provisioning dalam urusan cloud native sering dianggap sebagai proses menyediakan suatu layanan. Segala proses yang terjadi dalam menyediakan layanan tersebut dapat dilakukan secara manual, namun seiring berkembangnya zaman tentu saja kini banyak sekali tools yang bermunculan dan menawarkan kemampuan untuk membuat process automation. Misalnya pada artikel ini, Terraform akan digunakan untuk melakukan provisioning infrastruktur pada AWS. Sementara dalam melakukan konfigurasi atau setup setiap instance, Ansible Playbook adalah tools yang akan bertanggung jawab untuk melakukannya. Ansible Playbook akan melakukan beberapa proses mulai dari update sistem operasi, setup Docker, memasang kubelet, etcd, membuat token bagi worker node hingga berbagai keperluan setup k8s lainnya sampai selesai.
Prerequisites
Pastikan beberapa prasyarat berikut ini sudah terpenuhi sebelum melakukan tahap lebih lanjut.
Access Key
Untuk mendapatkan access key AWS, kita harus memiliki akun AWS. Access Key ini sama dengan yang biasanya digunakan sebagai credentials aws-cli, dan pada artikel ini access key tersebut akan dipakai oleh Terraform untuk mengeksekusi perintah sesuai dengan script yang kita buat. Untuk lebih lengkapnya silahkan lihat dokumentasi resmi AWS. Simpan access key tersebut ke dalam sebuah file, misalnya credentials seperti berikut ini.
Nantinya perintah tersebut akan menghasilkan sebuah file SSH Key bernama infra-k8s.pem. Selanjutnya kita perlu merubah permissionnya supaya dapat digunakan untuk mengakses instance.
1
$ chmod 400 infra-k8s.pem
Info
Dalam artikel ini saya menggunakan region us-east-1 atau North Virginia. Jika ingin menggunakan regional lain, silahkan lihat dokumentasi resmi AWS.
Infrastructure Provisioning
Pasang Paket Terraform
Pasang paket terraform pada komputer lokal seperti berikut.
1
$ sudo pacman -Sy terraform
Info
Saya menggunakan sistem operasi GNU/Linux dengan distro Arch-based yang memiliki package manager pacman. Silahkan sesuaikan dengan perintah package manager pada distro masing-masing.
Script Terraform
Selanjutnya silahkan buat file baru untuk menulis script terraform. Misalnya saya membuat file infra.tf yang akan berisi script Terraform seperti berikut ini.
Sesuaikan variabel subnet_id dengan id Subnet VPC yang telah kita buat sebelumnya. Sedangkan variabel ami merupakan id dari Amazon Machine Image yang value nya tergantung dari distro apa yang akan kita jalankan pada setiap instance EC2 untuk informasi lebih lanjut kita dapat melihatnya dari dokumentasi resmi AWS karena setiap region dan distro hingga sistem operasi memiliki AMI ID yang berbeda-beda. Terlihat bahwa saya membuka seluruh traffic dari inbound dan outbound yang tentu saja tidaklah aman, sesuaikan dengan kebutuhan port Kubernetes pada umumnya.
Inisialiasi terraform untuk mengunduh dependency yang diperlukan dengan perintah berikut.
1
$ terraform init
Eksekusi Terraform
Sekarang jalankan provisioning menggunakan terraform sesuai dengan script yang telah dibuat sebelumnya.
1
$ terraform apply
Configuration Provisioning
Pasang Paket Ansible
Pasang ansible pada komputer lokal menggunakan perintah berikut.
1
$ sudo pacman -Sy ansible
Konfigurasi Ansible
Kita perlu membuat sebuah file bernama ansible.cfg yang berisi konfigurasi seperti berikut.
Variabel remote_user adalah user pada instance EC2 yang akan dipakai untuk penerapan provisioning, by-default pada AWS untuk AMI Ubuntu 18 menggunakan user ubuntu. Jika menggunakan AMI lain maka kita perlu menyesuaikannya.
Inventory Ansible Playbook
Jalankan perintah berikut untuk mendapatkan IP Publik dari Master Node.
- hosts:allgather_facts:falsetasks:- name:Add Google official GPG keybecome:yesapt_key:url:https://packages.cloud.google.com/apt/doc/apt-key.gpgstate:present- name:Add Kubernetes Repositorybecome:yesapt_repository:repo:deb http://apt.kubernetes.io/ kubernetes-xenial mainstate:presentfilename:kubernetesmode:0600- name:Installing Kubernetes Cluster Packagesbecome:yesapt:force:Truename:- kubeadm- kubectl- kubeletstate:present- name:Hold kubeadmbecome:yesdpkg_selections:name:kubeadmselection:hold- name:Hold kubectlbecome:yesdpkg_selections:name:kubectlselection:hold- name:Hold kubeletbecome:yesdpkg_selections:name:kubeletselection:hold- name:Add line Net Bridge on sysctl.confbecome:yeslineinfile:path:/etc/sysctl.confline:net.bridge.bridge-nf-call-iptables=1- name:Add line 'max_map_count' on sysctl.confbecome:yeslineinfile:path:/etc/sysctl.confline:vm.max_map_count=262144- name:Apply change on sysctlbecome:yesbecome_method:sudoshell:sysctl -p- hosts:publicgather_facts:falsetasks:- name:Initialize k8s clusterbecome:yesbecome_method:sudoshell:kubeadm reset -f- name:Start k8s initbecome:yesbecome_method:sudoshell:kubeadm init --pod-network-cidr=10.244.0.0/16register:kubeadm_result- debug:var:kubeadm_result.stdout_lines- name:Make configuration folder for k8sbecome:yesbecome_user:ubuntufile:state:directorypath:/home/ubuntu/.kubemode:0755- name:Copy configuration k8s into homebecome:yescopy:src:/etc/kubernetes/admin.confdest:/home/ubuntu/.kube/configremote_src:yesowner:ubuntu- name:apply network plugin flannelbecome:yesbecome_user:ubuntushell:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml- hosts:nodesgather_facts:falsevars_prompt:- name:"kubeadm"prompt:"kubeadm Command "private:notasks:- name:Reset kubeadmbecome:yesbecome_method:sudoshell:kubeadm reset -f- name:Prune docker imagesbecome:yesbecome_method:sudoshell:sudo docker image prune -af- name:Retriving input command kubeadmbecome:yesbecome_method:sudoshell:"{{ kubeadm }}"
Kemudian terapkan script tersebut dengan Ansible Playbook seperti berikut.
1
$ ansible k8s.yml
Joining Cluster
Di tengah proses, kita akan diberikan sebuah token yang harus dimasukkan secara manual. Token tersebut digunakan oleh Worker Node untuk bergabung ke dalam klaster.
Jika berhasil maka akan muncul tampilan seperti berikut ini.
1
2
3
4
PLAY RECAP *******************************************************************************************************
18.233.242.19 : ok=15changed=14unreachable=0failed=0skipped=0rescued=0ignored=03.224.63.65 : ok=12changed=12unreachable=0failed=0skipped=0rescued=0ignored=054.198.25.43 : ok=12changed=12unreachable=0failed=0skipped=0rescued=0ignored=0
Post Installation
Menghapus Worker Node Elastic IP
Karena Worker Node sudah tidak lagi membutuhkan IP Publik, maka kita akan menghapusnya dengan cara merubah script file infra.tf yang sebelumnya kita buat. Jadikan beberapa baris konfigurasi menjadi comment seperti berikut ini.
1
2
3
4
5
## Elastic IP for Node Server (Temporary)
#resource "aws_eip" "lb-node" {
# count = 2
# instance = aws_instance.node[count.index].id
#}
Dan tambahkan comment juga pada baris konfigurasi variabel associate_public_ip_address.
1
#associate_public_ip_address = false
Kemudian jalankan kembali Terraform seperti berikut.
1
$ terraform apply
Periksa dan jika sudah benar maka ketik yes dan tekan Enter. Apabila berhasil maka akan muncul tampilan seperti berikut.
Sesuaikan dengan alamat IP Publik yang dimiliki oleh Master Node atau Control Plane.
Setelah berhasil masuk, sekarang jalankan perintah berikut.
1
$ kubectl get nodes
Maka akan muncul daftar node yang terhubung pada klaster.
1
2
3
4
NAME STATUS ROLES AGE VERSION
ip-172-31-16-20 Ready control-plane,master 8m50s v1.20.2
ip-172-31-25-81 Ready <none> 7m41s v1.20.2
ip-172-31-29-192 Ready <none> 7m40s v1.20.2
Dengan menggunakan Terraform dan Ansible, kita dapat membangun klaster Kubernetes sendiri pada AWS. Salah satu keunggulan yang saya rasakan adalah fleksibilitas yang tinggi, dimana saya dapat menggunakan spesifikasi instance yang terbilang rendah untuk mencoba membangun klaster Kubernetes jika dibandingkan dengan menggunakan distribusi Kubernetes (seperti OKD atau OpenShift). Jika semua script telah tersedia, maka proses instalasi klaster bisa dikatakan sangat cepat.