Implementasi Ingress, ELB dan SSL (Bagian 6)

Membaca dari tulisan ini https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ingress-guide-nginx-example.html untuk mengetahui perbedaan NodePort, LoadBalancer dan Ingress.

Apa itu Ingress?

Di Kubernetes, Ingress adalah objek yang memungkinkan akses ke layanan Kubernetes dari luar cluster Kubernetes. Konfigurasi ini diatur dengan membuat kumpulan peraturan (rules) yang menentukan koneksi masuk mana yang boleh menjangkau layanan apa.

Konfigurasi ini memungkinkan untuk menggabungkan aturan perutean menjadi satu pintu. Misalnya, untuk mengatur alamat example.com/api/v1/ ke layanan api-v1, dan mengatur alamat example.com/api/v2/ ke layanan api-v2. Dengan Ingress, kita dapat mengatur ini tanpa membuat banyak LoadBalancer atau mengekspos setiap layanan di Node. Karena kenaikan jumlah loadbalancer artinya menaikan biaya bulanan.

NGINX Ingress hanya merupakan salah satu implementasi Ingress Controller menggunakan NGINX. Selain NGINX, bisa juga menggunakan Traefik dan lainnya.

ELB (Elastic Load Balancing)

ELB di Kops AWS digunakan sebagai domain akhir yang digunakan user untuk mengakses service. Bentuknya berupa kombinasi acak angka dan huruf seperti berikut aa788cc64fc9911e7b8820e801320750-1559002290.ap-southeast-1.elb.amazonaws.com.

Kembali mengingat langkah sebelumnya.

git clone https://github.com/tuanpembual/nodejs-aws-workshop.git

Pada tulisan saya bagian 5, bisa kita jadikan patokan. Yaitu pada file recipes/nginx.yml bagian kind: service. Saya membuat service type sebagai LoadBalancer yang mengaktifkan satu URL ELB. Jika saya memiliki service nginx lainnya, maka saya akan menggunakan lebih dari satu URL elb. Padahal sewa ELB lumayan.

Berikut perbandingan di 6 – Kubernetes (kops)

# Deploy the pods
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-router
spec:
  selector:
    matchLabels:
      app: nginx-router
  replicas: 2 # tells deployment to run 2 pods matching the template
  template: # create pods using pod definition in this template
    metadata:
      labels:
        app: nginx-router
    spec:
      containers:
      - name: nginx-router
        image: tuanpembual/nginx-router
        ports:
        - containerPort: 80
---
# This service is used to expose the router using a load balancer
apiVersion: v1
kind: Service
metadata:
  name: nginx-router
spec:
  selector:
    app: nginx-router
  ports:
    - port: 80
      targetPort: 80
type: LoadBalancer

Lihat pada baris 33, type: LoadBalancer.

Bagiamana solusi menghemat ELB? Silahkan implemetasi Ingres-NGINX

Implemetasi Ingress-NGINX

Hasilnya adalah: kita cukup menggunakan satu alamat ELB, kemudian aplikasi-aplikasi kita cukup diarahkan menggunakan ELB tersebut dan dilanjutkan mengatur CNAME pada domain.

Panduan ini merunut dari https://kubernetes.github.io/ingress-nginx/deploy/

  1. Hapus deployment nginx sebelumnya
    cd 6\ -\ Kubernetes\ \(kops\)/code
    kubectl delete -f recips/nginx.yml
    
  2. Buat SSL untuk ELB sesuai domain yg diinginkan pada menu ACM pada AWS Console. Request a certificate > Public > isi domain= namadomain.id dan *.namadomain.id (setup wilcard subdomain). Kemudian ikuti langkah untuk validasi. Validasi saya memilih dengan email dan dikirim email admin@namadomain.id. Setelah selesai, catat ARNnya dengan format sebagai berikut:"arn:aws:acm:ap-southeast-1:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX".
  3. Lakukan Deploy Ingress-NGINX mandatory. File yaml sudah saya masukkan di repo, cukup ubah-suai.
    cd ../7\ -\ Ingress\ Nginx\ \(elb\)/code
    kubectl apply -f ingress/mandatory.yaml
    
  4. Untuk AWS, saya memilih konfigurasi layer 7. "use HTTP as the listener protocol for port 80 and terminate TLS in the ELB". Ganti baris pada file provider/aws/service-l7.yaml ganti ARN valid sesuai keluaran langkah 2. “arn:aws:acm:ap-southeast-1:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX”. Lakukan deployment:
    kubectl apply -f ingress/service-l7.yaml
    kubectl apply -f ingress/patch-configmap-l7.yaml
    

Redeploy Service

Pindah ke direktory 7 – Ingress NGINX (ELB). Pada recipes/locations.yml dan recipes/characters di bagian service, saya menambahkan type: Nodeport.

Lakukan deployment:

kubectl apply -f recipes/locations.yml
kubectl apply -f recipes/characters.yml

Konfigurasi Ingress-NGINX Rules

Saya membuat file baru pada path ingress/rule-ingress-nginx.yml yang isinya sebagai berikut:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: s-ingress
  annotations:
    ## Untuk menaikan batas upload file
    nginx.ingress.kubernetes.io/proxy-body-size: "10M"
    ## Memaksa jalan di https
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  rules:

##//Service Location n Characters
  - host: namadomain.id
    http:
      paths:
      - path: /api/characters
        backend:
          serviceName: characters-service
          servicePort: 8081
      - path: /api/locations
        backend:
          serviceName: locations-service
          servicePort: 8081

Konfigurasi diatas untuk mengarahkan namadomain.id/api/characters/ ke layanan characters-service, dan mengatur alamat namadomain.id//api/locations/ ke layanan location-service sesuai port masing-masing.

Jika menggunakan lebih satu domain dan atau menggunakan subdomain, pengaturannya masih sama. Cukup buat CNAME url ELB ke domain dan subdomain yang dinginkan. Sedang untuk subfolder cukup dipastikan aplikasinya mampu diakses dari subfolder. Ini tips lain yang saya dapat ketika mengkonfigurasi app express js dan Ruby on Rails. Cara mengaturnya akan saya tuliskan dipostingan yang berbeda.

Konfigurasi diatas sudah otomatis mengarahkan port 80 ke 443 dengan SSL yang sudah kita buat di langkah sebelumnya.

Ingress-NGINX Annotations

Masih banyak opsi-opsi dari NGINX yang bisa kita terapkan di konfigurasi Ingress. Saya hanya menggunakan beberapa saja yg dibutuhkan. Pustaka Annotations lainnya bisa didapat dari tautan berikut https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

Itu saja. Semoga tulisan ini membantu kawan-kawan semua.

Estu~

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google

You are commenting using your Google account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.