Apa itu Ingress di Kubernetes
Kubernetes Ingress adalah objek API yang mengelola akses eksternal ke Service dalam sebuah klaster Kubernetes. Ingress berfungsi sebagai load balancer Layer 7 yang memungkinkan pod-pod Anda diakses dari luar klaster. Ia mengarahkan lalu lintas eksternal berdasarkan host dan path dalam URL.
Biasanya, Anda akan memiliki kontroler Ingress yang bertanggung jawab untuk memenuhi permintaan Ingress, seringkali dengan menggunakan load balancer. Kontroler tersebut mendengarkan API Kubernetes untuk resource Ingress dan memperbarui load balancer sesuai dengan itu.
Mengakses Pod Melalui Ingress
Saya akan menunjukkan bagaimana cara mengakses Pod sederhana helloworld
ke lalu lintas eksternal menggunakan resource Ingress. Kita akan menggunakan Minikube untuk membuat klaster Kubernetes lokal.
Memulai Minikube
Mulai Minikube dengan menggunakan perintah di bawah ini.
$ minikube start
Menambahkan Addon Ingress
Minikube mendukung addon, yaitu sejumlah fitur dan integrasi yang diaktifkan secara default. Untuk mendapatkan fungsionalitas Ingress, kita perlu mengaktifkan addon Ingress:
$ minikube addons enable ingress
Anda dapat memeriksa apakah kontroler Ingress berjalan dengan mencarinya di antara pod-pod di Namespace ingress-nginx
.
$ kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
helloworld 1/1 Running 0 12m
ingress-nginx-admission-create-7jxrq 0/1 Completed 0 30m
ingress-nginx-admission-patch-w7m8w 0/1 Completed 1 30m
ingress-nginx-controller-6cc5ccb977-qqbl6 1/1 Running 0 30m
Membuat Pod, NodePort, dan Ingress
Buat Pod helloworld
dan NodePort di Namespace ingress-nginx
.
$ kubectl run --image=gcr.io/google-samples/hello-app:1.0 --port=8080 --restart=Never helloworld --namespace ingress-nginx
$ kubectl expose pod helloworld --type NodePort --port 8080 --name helloworld-nodeport --namespace ingress-nginx
Sekarang, mari buat resource Ingress yang akan mengekspos Service helloworld-nodeport
pada semua path /
.
Berkas ingress.yaml
akan terlihat seperti ini:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: helloworld
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: helloworld-nodeport
port:
number: 8080
Terapkan konfigurasi tersebut:
$ kubectl apply -f ingress.yaml
Menampilkan Resource Ingress
Gunakan perintah berikut untuk melihat semua resource Ingress:
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
helloworld nginx * 192.168.49.2 80 45s
Mengambil IP Kontroler Ingress
Anda dapat mengambil IP yang ditugaskan untuk kontroler Ingress Anda dengan menjalankan:
$ kubectl get ingress | awk '{ print $4 }' | tail -1
IP ini adalah yang akan Anda gunakan untuk mengakses Service Anda.
Mengakses helloworld-nodeport Melalui Ingress
Sekarang, mari akses Service helloworld-nodeport
melalui Ingress:
$ curl $(kubectl get ingress -n ingress-nginx | awk '{ print $4 }' | tail -1)
192.168.49.2
Perintah ini mengambil alamat IP kontroler Ingress dan mengirimkan permintaan curl
ke alamat tersebut. Jika semuanya diatur dengan benar, Anda seharusnya melihat keluaran dari Service helloworld-nodeport
.
Membuat Resource Ingress Baru
Kita juga dapat membuat versi kedua dari Service kita, helloworld_v2
, dan mengeksposnya melalui Ingress dengan menggunakan path yang berbeda.
Pertama, mari buat Pod baru untuk helloworld_v2
, ekspos sebagai Service dengan NodePort, dan buat resource Ingress untuknya.
Berkas ingress_path.yaml
harus terlihat seperti ini:
kind: Ingress
metadata:
name: helloworld-v2
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /helloworld-v2
pathType: Prefix
backend:
service:
name: helloworld-v2-nodeport
port:
number: 8080
Selanjutnya, jalankan perintah berikut untuk membuat Pod, Service, dan resource Ingress:
# Create the helloworld-v2 pod
$ kubectl run --image=gcr.io/google-samples/hello-app:2.0 --port=8080 --restart=Never helloworld-v2 --namespace ingress-nginx
# Expose the pod as a service
$ kubectl expose pod helloworld-v2 --type=NodePort --port=8080 --name=helloworld-v2-nodeport --namespace ingress-nginx
# Create the Ingress resource
$ kubectl apply -f ingress_path.yaml
Menguji Akses ke Pod helloworld-v2 dari dalam klaster
Mari kita buat Pod sementara dengan curl
terpasang untuk menguji akses ke Pod helloworld-v2
dari dalam klaster.
$ kubectl run --namespace ingress-nginx --restart=Never --image=curlimages/curl:7.68.0 -it --rm curl sh
Sekarang, gunakan curl
untuk membuat permintaan ke Pod helloworld-v2
:
/ $ curl 10.244.0.8:8080 # 10.244.0.8 is obtained from `kubectl get pod,svc -o wide -n ingress-nginx`
Hello, world!
Version: 2.0.0
Hostname: helloworld-v2
Menguji Akses ke Service helloworld-v2-nodeport dari dalam Klaster
Sekarang, dari Pod sementara yang sama, mari kita uji akses ke Service helloworld-v2-nodeport
:
/ $ curl helloworld-v2-nodeport:8080
Hello, world!
Version: 2.0.0
Hostname: helloworld-v2
Mengakses Service helloworld-v2-nodeport Melalui Path Ingress /helloworld_v2
Akhirnya, mari akses Service helloworld-v2-nodeport
secara eksternal melalui path Ingress /helloworld_v2
:
$ curl $(kubectl get ingress helloworld-v2 -n ingress-nginx | awk '{ print $4 }' | tail -1)/helloworld-v2
Hello, world!
Version: 2.0.0
Hostname: helloworld-v2