Traffine I/O

Bahasa Indonesia

2022-06-19

Ingress dalam Kubernetes

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.

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

bash
$ minikube addons enable ingress

Anda dapat memeriksa apakah kontroler Ingress berjalan dengan mencarinya di antara pod-pod di Namespace ingress-nginx.

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

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

ingress.yaml
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:

bash
$ kubectl apply -f ingress.yaml

Menampilkan Resource Ingress

Gunakan perintah berikut untuk melihat semua resource Ingress:

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

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

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

ingress_path.yaml
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:

bash
# 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.

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

bash
/ $ 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:

bash
/ $ 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:

bash
$ 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

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!