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:
$ 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:
$ 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:
$ 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:
$ 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
:
$ 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:
$ 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:
$ 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
:
$ 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
:
$ 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
.
$ 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:
$ 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:
$ 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.
$ 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.