Apa yang bisa kami bantu?

A. Pendahuluan

Kubernetes Ingress membuat cara yang fleksibel untuk melakukan routing traffic dari luar cluster ke layanan NEO Kubernetes Anda. Resource ingress adalah suatu objek dalam Kubernetes yang dapat mendefinisikan rule untuk routing trafik HTTP dan HTTPS ke objek services. Disini Ingress Controller beguna untuk menerapkan rule dengan menerima trafik (seperti Load Balancer) dan mengarahkannya ke objek service tertentu. Kebanyakan Ingress Controller hanya menggunakan satu Load Balancer untuk semua ingress dan hal ini lebih efektif daripada membuat Load Balancer untuk setiap service yang akan diekspos.  

 

Helm adalah sebuah package manager untuk mengelola Kubernetes, menggunakan Helm Charts dengan Kubernetes dapat menyediakan konfigurasi dan mengelola lifecycle untuk melakukan update, rollback dan menghapus aplikasi Kubernetes.  

Pada panduan kali ini Anda akan melakukan setup Nginx Ingress Controller dengan Helm pada layanan NEO Kubernetes. Anda akan membuat Ingress Resource untuk routing trafik dari domain/subdomain Anda ke objek services. Setelah itu Anda akan melakukan setup Ingress dan setup Cert Manager ke layanan NEO Kubernetes dengan sertifikat Let’s Encrypt yang secara otomatis akan mengamankan ingress Anda.  

B. Persiapan :  

  • Layanan NEO Kubernetes sudah siap digunakan 
  • Tata cara order layanan NEO Kubernetes bisa dilihat pada link berikut.  
  • Helm sudah terinstall pada layanan NEO Kubernetes  
  • Jika belum install, bisa melihat panduan pada link berikut.  
  • Domain atau subdomain yang sudah dipointing ke IP Public layanan NEO Kubernetes

C. Langkah-langkah :

Langkah Pertama – Deploy Aplikasi  

Sebelum Anda deploy Nginx Ingress Controller, Anda akan deploy aplikasi web sederhana hello-kubernetes yang memiliki objek services yang akan diroute trafiknya.

Aplikasi yang dideploy ada dua menggunakan image yang sama dengan teks yang berbeda untuk membedakan satu sama lain.  

 

1. Login SSH ke Layanan NEO Kubernetes Anda dan buatlah file dengan nama hello-kubernetes-first.yaml dengan teks editor favorit Anda :

vim hello-kubernetes-first.yaml

apiVersion: v1
kind: Service
metadata:
 name: hello-kubernetes-first
spec:
 type: ClusterIP
 ports:
 - port: 80
   targetPort: 8080
 selector:
   app: hello-kubernetes-first
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: hello-kubernetes-first
spec:
 replicas: 3
 selector:
   matchLabels:
     app: hello-kubernetes-first
 template:
   metadata:
     labels:
       app: hello-kubernetes-first
   spec:
     containers:
     - name: hello-kubernetes
       image: paulbouwer/hello-kubernetes:1.10
       ports:
       - containerPort: 8080
       env:
       - name: MESSAGE
         value: Hello from the first deployment!

 

Keterangan :  

Konfigurasi diatas mendefinisikan Deployment dan Service. Dimana Deployment membuat 3 replica dengan image paulbouwer/hello-kubernetes:1.10 dan variable environment MESSAGE (teks yang akan tampil di aplikasi). Service disini mendefinisikan untuk expose Deployment dengan port 80.  

Simpan dan kelar dari teks editor.  

 

2. Kemudian apply konfigurasi diatas dengan menjalankan perintah :

kubectl create -f hello-kubernetes-first.yaml

 

3. Verifikasi objek :  

kubectl get service hello-kubernetes-first

Anda akan melihat type Sevicenya ClusterIP dan semua trafik akan diteruskan ke Deployment dengan port 8080. Nah sekarang Anda sudah membuat Deployment aplikasi yang pertama, selanjutnya Anda akan membuat Deployment aplikasi yang kedua.  

 

4. Buat file hello-kubernetes-second.yaml :

apiVersion: v1
kind: Service
metadata:
 name: hello-kubernetes-second
spec:
 type: ClusterIP
 ports:
 - port: 80
   targetPort: 8080
 selector:
   app: hello-kubernetes-second
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: hello-kubernetes-second
spec:
 replicas: 3
 selector:
   matchLabels:
     app: hello-kubernetes-second
 template:
   metadata:
     labels:
       app: hello-kubernetes-second
   spec:
     containers:
     - name: hello-kubernetes
       image: paulbouwer/hello-kubernetes:1.10
       ports:
       - containerPort: 8080
       env:
       - name: MESSAGE
         value: Hello from the second deployment!

 

Strukturnya sama seperti dengan Deployment pertama namun hanya berbeda pada MESSAGE aplikasinya saja.  

Simpan dan keluar dan teks editor.  

5. Lalu jalankan perintah berikut untuk membuat Deploymentnya :

kubectl create -f hello-kubernetes-second.yaml

 

6. Verifikasi Services yang kedua :

kubectl get service

Verfikasi objek Servces

Langkah Kedua – Install Nginx Ingress Controller

1. Untuk install Nginx Ingress Controller pada layanan NEO Kubernetes, Anda harus menambahkan repostiory Helm terlebih dahulu dengan perintah :  

helm repo add nginx-stable https://helm.nginx.com/stable

2. Update repo sistem Helm :

helm repo update

3. Selanjutnya silakan jalankan perintah berikut untuk menginstall Nginx Ingress Controller :

helm install nginx-ingress nginx-stable/nginx-ingress --set rbac.create=true

4. Periksa service Nginx Ingress Controller :

kubectl get svc

Verfikasi objek Servces

Adapun External-IP nya akan tetap berstatus pending, dikarenakan layanan NEO Kubernetes ini tidak memiliki Load Balancer secara terpisah. Namun jangan khawatir Anda tetap bisa mengakses aplikasi Anda secara publik menggunakan IP Public yang sudah disediakan oleh layanan NEO Kubernetes.  

 

Langkah Ketiga – Expose Aplikasi dengan Ingress  

Saat ini Anda akan membuat Ingress Resource dan menggunakannya untuk expose Deployment aplikasi hello-kubernetes pada domain/subdomain yang Anda inginkan.

1. Gunakan teks editor favorit Anda untuk membuat file ingress :

vim hello-kubernetes-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: hello-kubernetes-ingress
 annotations:
spec:
 rules:
 - host: demo1[dot]domainAnda[dot]id
   http:
     paths:
     - pathType: Prefix
       path: "/"
       backend:
         service:
           name: hello-kubernetes-first
           port:
             number: 80
 - host: demo2[dot]domainAnda[dot]id
   http:
     paths:
     - pathType: Prefix
       path: "/"
       backend:
         service:
           name: hello-kubernetes-second
           port:
             number: 80

 

Keterangan :  

Nama Ingress yang dibuat adalah hello-kubernetes-ingress, kemudian Anda menspesifikkan akses subdomain demo1[dot]domainAnda[dot]id untuk service hello-kubernetes-first sedangkan subdomain demo1[dot]domainAnda[dot]id  service hello-kubernetes-second. Pastikan Anda sudah pointing kedua subdomain tersebut ke IP Public layanan NEO Kubernetes.  

 

2. Silakan create Ingress-nya dengan perintah sebagai berikut :

kubectl apply -f hello-kubernetes-ingress.yaml

3. Periksa Ingress :

kubectl get ingress  

Verfikasi objek Ingress

 

4. Lalu coba akses pada browser Anda untuk kedua subdomain diatas, hasilnya seperti berikut ini :

-  demo1[dot]domainAnda[dot]id

Hasil akses aplikasi satu tanpa TLS

-  demo2[dot]domainAnda[dot]id

Hasil akses aplikasi dua tanpa TLS


Terlihat kedua web diatas masih belum terpoteksi TLS atau belum secure.

Sampai disini Anda sudah berhasil mengakses aplikasi hello-kubernetes dengan subdomain Anda. Hal tersebut menandakan bahwa Nginx Ingress Controller-nya sudah berhasil melakukan request routing dari sisi client ke service cluster layanan NEO Kubernetes Anda. Langkah berikutnya Anda akan setup Cert-Manager untuk mengamankan Ingress Resource Anda dengan sertifikat TLS free dari Let’s Encrypt.  

 

Langkah Keempat – Setup SSL untuk Ingress dengan Cert-Manager

Untuk mengamankan Ingress Resource, Anda perlu untuk install Cert-Manager, membuat ClusterIssuer untuk production dan memodifikasi konfigurasi Ingress untuk sertifikat TLS-nya. Ketika sudah berhasil diinstall dan dikonfigurasikan, maka aplikasi Anda akan berjalan menggunakan HTTPS.  

ClusterIssuer adalah resource Cert-Manager dalam Kubernetes yang dapat melakukan provisioning sertifikat TLS untuk Cluster secara keseluruhan.

1. Sebelum install Cert-Manager pada layanan NEO Kubernetes Anda, buatlah namespace-nya terlebih dahulu :

kubectl create namespace cert-manager

2. Kemudian silakan install resource CustomResourceDefinition :

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.crds.yaml

3. Tambahkan repository Helm Jetstack :

helm repo add jetstack https://charts.jetstack.io –force-update

4. Lalu install Helm Chart Cert-Manager :

helm install cert-manager --namespace cert-manager --version v1.16.2 jetstack/cert-manager

Proses Instalasi Helm Cert-Manager

Gambar diatas menunjukkan instalasinya berhasil.  

 

5. Anda sekarang akan membuat issuer untuk sertifikat Let’s Encrypt :

vim production_issuer.yaml

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
 name: letsencrypt-prod
spec:
 acme:
   # Email address used for ACME registration
   email: emailuser[at]domainAnda[dot]id
   server: https://acme-v02.api.letsencrypt.org/directory
   privateKeySecretRef:
     # Name of a secret used to store the ACME account private key
     name: letsencrypt-prod-private-key
   # Add a single challenge solver, HTTP01 using nginx
   solvers:
   - http01:
       ingress:
         class:

 

Keterangan :  

Konfigurasi diatas mendefinisikan bahwa CluserIssuer kontak Let’s Encrypt untuk menerbitkan sertifikat TLS. Anda juga akan membutuhkan email untuk menerima notifkasi berkaitan dengan keamanan dan waktu expired sertifikat TLS Anda.  

Simpan dan keluar dan teks editor.

6. Jalankan perintah berikut :

kubectl apply -f production_issuer.yaml

 

7. Dengan kondisi Cert-Manager yang sudah terinstall, selanjutnya Anda bisa memasukkan konfigurasinya ke file Ingress sebelumnya dan edit dengan detail sebagai berikut :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: hello-kubernetes-ingress
 annotations:
   cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
 tls:
 - hosts:
   - demo1[dot]domainAnda[dot]id
   - demo2[dot]domainAnda[dot]id
   secretName: hello-kubernetes-tls
 rules:
 - host: demo1[dot]domainAnda[dot]id
   http:
     paths:
     - pathType: Prefix
       path: "/"
       backend:
         service:
           name: hello-kubernetes-first
           port:
             number: 80
 - host: demo2[dot]domainAnda[dot]id
   http:
     paths:
     - pathType: Prefix
       path: "/"
       backend:
         service:
           name: hello-kubernetes-second
           port:
             number: 80

Keterangan :  

Tambahkan baris konfigurasi yang diblock hijau. Adapun file sertifikat TLS nya nantinya akan disimpan pada objek Secret dengan nama hello-kubernetes-tls dalam kondisi terenkripsi.

Simpan dan keluar dari teks editor.

 

8. Update file Ingress dengan menjalankan perintah berikut ini :

kubectl apply -f hello-kubernetes-ingress.yaml

9. Anda bisa menunggu beberapa menit untuk proses penerbitan sertifikat TLS nya. Anda bisa melihat statusnya dengan perintah :

kubectl describe certificate hello-kubernetes-tls

Apabila baris terakhir outputnya The certificate has been successfully issued berarti sertifikat TLS nya sudah berhasil diterbitkan dan statusnya Ready.  

Sertifikat TLS berhasil diterbitkan

 

Status TLS

D. Uji Coba :

Anda sudah berhasil menerbitkan sertifikat TLS untuk aplikasi hello-kubernetes, sekarang buka browsernya kembali dan refresh. Jika sudah muncul gembok disebelah URL nya makan menjukkan website sudah menggunakan HTTPS.

-  https://demo1[dot]domainAnda[dot]id

Hasil akses aplikasi satu dengan TLS


-  https://demo2[dot]domainAnda[dot]id

Hasil akses aplikasi dua dengan TLS

E. Kesimpulan

Anda sekarang sudah berhasil Setup Nginx Ingress Controller dan Cert-Manager pada layanan NEO Kubernetes menggunakan Helm. Saat ini Anda bisa expose aplikasi ke internet melalui domain ataupun subdomain Anda dengan sertifikat TLS dari Let’s Encrypt.

Semoga panduan ini dapat membantu Anda. Temukan bantuan lainnya melalui Knowledge Base Biznet Gio. Jika Anda masih memiliki kendala silahkan hubungi support@biznetgio.com atau (021) 5714567.