Traffine I/O

Bahasa Indonesia

2022-06-18

Pod dalam Kubernetes

Apa itu Pod dalam Kubernetes

Dalam Kubernetes, Pod adalah unit terkecil yang dapat dibuat dan dikelola. Ini adalah kelompok satu atau lebih kontainer dengan resource penyimpanan/jaringan bersama, dan spesifikasi untuk menjalankan kontainer-kontainer tersebut. Kontainer-kontainer dalam Pod secara otomatis ditempatkan dan dijadwalkan bersama di mesin fisik atau mesin virtual (VM) yang sama dalam kluster. Mereka juga memiliki konteks bersama dan dapat berkomunikasi satu sama lain menggunakan localhost.

Bagaimana Pod Bekerja

Pod dirancang untuk mendukung beberapa proses yang saling berkoordinasi (sebagai kontainer) yang cukup terkait erat. Misalnya, sebuah Pod mungkin terdiri dari server web dan proses terpisah yang mengambil konten untuk dipublikasikan oleh server web. Kontainer-kontainer dalam Pod berbagi Alamat IP dan ruang port, dan dapat saling menemukan melalui localhost. Mereka juga dapat berkomunikasi satu sama lain menggunakan komunikasi antar-proses standar seperti semafor SystemV atau shared memory POSIX. Kontainer-kontainer dalam Pod yang berbeda memiliki alamat IP yang berbeda dan tidak berbagi namespace IPC.

Setiap Pod diisolasi oleh beberapa namespace kernel dan ruang jaringan. Ini berarti bahwa sementara proses-proses dalam sebuah Pod dapat saling melihat dan berkomunikasi dengan bebas, mereka terisolasi dari proses yang berjalan di Pod lain.

Pod sebagai Host Virtual

Dalam Kubernetes, Pod berperilaku seperti host virtual. Ini mampu menjalankan beberapa kontainer di dalamnya. Semua kontainer di dalam satu Pod berbagi namespace jaringan yang sama, yang berarti mereka berbagi alamat IP dan ruang port yang sama. Kontainer dalam Pod yang sama dapat berkomunikasi satu sama lain menggunakan localhost. Kontainer-kontainer dalam Pod yang sama juga berbagi volume penyimpanan yang sama, memungkinkan mereka untuk membaca dan menulis file yang sama.

Berinteraksi dengan Pod

Saya akan menggunakan pendekatan praktis untuk memahami dan bekerja dengan Pod dalam Kubernetes. Saya akan mendeploy aplikasi sederhana ke kluster Kubernetes menggunakan Minikube.

Persiapan Minikube

Minikube adalah alat yang memungkinkan Anda menjalankan kluster Kubernetes satu node di mesin Anda secara lokal. Ini sangat nyaman bagi para pengembang yang ingin bereksperimen dengan Kubernetes atau mengembangkan dengan menggunakan Kubernetes dalam kegiatan sehari-hari.

Mulai Minikube dengan menjalankan perintah berikut di terminal Anda:

bash
$ minikube start

Perintah ini akan membuat dan mengkonfigurasi mesin virtual yang menjalankan kluster Kubernetes satu node.

Mendeploy Aplikasi

Sekarang Minikube berjalan, mari kita mendeploy aplikasi sederhana.

Untuk membuat Pod yang menjalankan aplikasi helloworld, jalankan perintah berikut:

bash
$ kubectl run --image=bhargavshah86/kube-test:v0.1 --restart=Never helloworld

pod/helloworld created

Melihat Daftar Pod

Untuk melihat daftar Pod yang sedang berjalan, gunakan perintah berikut:

bash
$ kubectl get pods

NAME         READY   STATUS    RESTARTS   AGE
helloworld   1/1     Running   0          59s

Melihat Log dari Sebuah Pod

Anda dapat memeriksa log yang dihasilkan oleh kontainer-kontainer dalam sebuah Pod. Untuk memeriksa log dari Pod helloworld, gunakan perintah berikut:

bash
$ kubectl logs helloworld

2022/06/18 00:25:38 Server listening on port 8080

Memeriksa Metadata Pod

Untuk melihat informasi lebih rinci tentang Pod, termasuk konfigurasi dan statusnya, gunakan perintah describe:

bash
$ kubectl describe pod helloworld

Menjalankan Perintah di Dalam Kontainer yang Berjalan

Terkadang, Anda mungkin perlu menjalankan perintah di dalam kontainer yang berjalan. Anda dapat menggunakan perintah kubectl exec untuk ini. Misalnya, untuk membuka shell di dalam kontainer yang berjalan di Pod helloworld, gunakan perintah berikut:

bash
$ kubectl exec -it helloworld sh
/usr/share/nginx/html #

Setelah selesai, Anda dapat mengetik exit untuk keluar dari shell.

/usr/share/nginx/html # exit

Menghapus Sebuah Pod

Untuk menghapus Pod helloworld, gunakan perintah berikut:

bash
$ kubectl delete pod helloworld

Mengkonfigurasi Variabel Lingkungan Kontainer

Anda dapat mendefinisikan variabel lingkungan untuk kontainer dalam Pod pada saat membuat Pod. Misalnya, mari buat Pod baru bernama helloworld-env dan atur variabel lingkungan bernama TEST_ENV:

bash
$ kubectl run helloworld-env --env TEST_ENV=hello_world --image bhargavshah86/kube-test:v0.1 --restart Never

Untuk memeriksa bahwa variabel lingkungan diatur dengan benar, Anda dapat membuka shell di dalam kontainer dan menggunakan perintah env:

bash
$ kubectl exec -it helloworld-env sh
/usr/share/nginx/html # env

PWD=/usr/share/nginx/html
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
NJS_VERSION=0.3.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.16.0
TERM=xterm
PKG_RELEASE=1
HOME=/root
SHLVL=1
HOSTNAME=helloworld-env
TEST_ENV=hello_world
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443

Anda melihat TEST_ENV=hello_world pada daftar variabel lingkungan.

Ketik exit untuk keluar dari shell.

Mengubah Port Host yang Ditetapkan untuk Kontainer

Anda dapat memetakan port host dengan menambahkan opsi --port.

bash
$ kubectl run --port 8080 --image bhargavshah86/kube-test:v0.1 --restart Never helloworld

Jaringan Pod

Saya akan menjelaskan cara kerja jaringan dalam lingkungan Kubernetes dengan fokus pada komunikasi antar Pod, peran lingkungan Minikube, dan mengexpose Pod ke jaringan eksternal.

Menguji Akses ke Pod HelloWorld dari Pod Lain dalam Kluster

Dalam kluster Kubernetes, Pod dapat saling berkomunikasi secara langsung menggunakan alamat IP masing-masing. Hal ini penting untuk microservices yang sering bergantung pada komunikasi antar layanan.

Mari kita menguji ini dengan mengakses Pod HelloWorld kita dari Pod lain dalam kluster.

Pertama, buat Pod helloworld dan periksa alamat IP-nya:

bash
$ kubectl run --image gcr.io/google-samples/hello-app:1.0 --restart Never helloworld
$ kubectl get pod,svc -o wide

NAME             READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
pod/helloworld   1/1     Running   0          17s   10.244.0.11   minikube   <none>           <none>

Selanjutnya, buat Pod sementara dengan menggunakan gambar curl untuk tujuan pengujian:

bash
$ kubectl run --restart Never --image curlimages/curl:7.68.0 -it --rm curl sh

Sekarang, gunakan curl untuk mengirim permintaan ke Pod helloworld:

/ $ curl 10.244.0.11:8080

Hello, world!
Version: 1.0.0
Hostname: helloworld
/ $ curl 10.244.0.11
curl: (7) Failed to connect to 10.244.0.11 port 80: Connection refused
/ $ curl 10.244.0.11:8080
Hello, world!
Version: 1.0.0
Hostname: helloworld

Anda melihat respons pesan Hello, world!. Ini menunjukkan bahwa Pod dalam kluster Kubernetes yang sama dapat saling berkomunikasi menggunakan alamat IP masing-masing.

Mengapa Tidak Dapat Menghubungkan ke IP Pod dari Sistem Operasi Host

Kita tidak dapat menghubungkan ke Pod dari sistem operasi host.

bash
$ kubectl get pods -o=jsonpath='{.items[0].status.podIP}'
$ curl $(kubectl get pods -o=jsonpath='{.items[0].status.podIP}'):8080

Perintah di atas akan timeout.

Lingkungan Minikube

Minikube adalah alat yang membantu Anda menjalankan kluster Kubernetes satu node secara lokal. Kluster ini berjalan di dalam mesin virtual (VM). Hal ini memperkenalkan lapisan jaringan tambahan.

Dalam Minikube, kluster Kubernetes berjalan di dalam VM, dan VM ini memiliki konfigurasi jaringan tersendiri. Karena itu, sistem operasi host (misalnya, MacOS, Windows) berada dalam jaringan yang berbeda dengan kluster Kubernetes di dalam VM.

Mesin host memiliki rentang IP-nya sendiri (misalnya, 192.168.88.15), dan VM memiliki rentang IP yang berbeda (misalnya, 192.168.64.1). Di dalam VM, Kubernetes mungkin menggunakan rentang IP lain untuk Pod (misalnya, 172.17.0.1). Karena adanya rentang IP dan jaringan yang berbeda ini, mesin host tidak dapat mengakses langsung alamat IP Pod.

Mengexpose Pod ke Jaringan Eksternal

Karena Pod tidak dapat diakses langsung dari mesin host atau jaringan eksternal, kita perlu menggunakan "Services" Kubernetes untuk mengeksposnya.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!