## Chapter 7 : Networking & Service Access ### 7.1 Service Service adalah resource di Kubernetes yang digunakan untuk membuat satu gerbang untuk mengakses satu atau lebih Pod. Service memiliki IP address dan Port yang tidak pernah berubah selama service itu ada. Gambarannya, client bisa mengakses service tersebut, dan secara otomatis akan meneruskan ke Pod yang ada dibelakang service tersebut. Dengan begini Client tidak perlu tahu lokasi tiap Pod, dan Pod bisa bertambah, berkurang, atau berpindah, tanpa harus mengganggu Client. Begini gambaran tanpa adanya services di Cluster : ![14](https://hackmd.io/_uploads/HyEL3b2sC.png) Misal pada gamabr anda ingin mengakses Pod A, kita yang sevagai client tak tahu, Pod A itu berlokasi dimana dan sedangkan apakah sekelas klien harus tahu posisi Pod A berada dimana? Tentu tidak. Maka dari itu ada namanya services. Dan untuk adanya services di Cluster gambarannnya sepert ini : ![15](https://hackmd.io/_uploads/By3Dhbhi0.png) Services akan membantu pengguna agar tak harus menghafalkan lokasi Pod berada atau semacamnya, yang terpenting layanan terus terkoneksi di Cluster tersebut. Karakterisitik dari Service yang perlu diketahui adalah : - Service akan mendistribusikan trafik ke Pod yang ada di belakangnya secara seimbang, - Service akan menggunakan label selector untuk mengetahui Pod mana yang ada dibelakang service tersebut. Untuk membuat Service bisa menggunakan kode konfigurasi template kurang lebih seperti ini : 7.1.1-template-service.yaml ```yaml apiVersion: v1 kind: Service metadata: name: service-name spec: selector: label-key1: label-value1 ports: - port: 8080 targetPort: 80 ``` Contoh, bisa seperti di bawah ini : 7.1.2-nginx-service.yaml ```yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx spec: replicas: 3 selector: matchLabels: name: nginx template: metadata: name: nginx labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: name: nginx ports: - port: 8080 targetPort: 80 --- apiVersion: v1 kind: Pod metadata: name: curl labels: name: curl spec: containers: - name: curl image: khannedy/nginx-curl ``` Untuk perintah dalam Service kurang lebih seperti ini : - Membuat Service ``` $ kubectl create -f (filename.yaml) ``` - Melihat Service ``` $ kubectl get services ``` - Menghapus Service ``` $ kubectl delete service (servicename) ``` - Mengakses Service dari Dalam Cluster ``` $ kubectl exec (podname)-it -- /bin/sh $ curl http://cluster-ip:port/ ``` ``` $ kubectl create -f 7.1.2-nginx-service.yaml replicaset.apps/nginx created service/nginx-service created pod/curl created $ kubectl get all NAME READY STATUS RESTARTS AGE pod/curl 1/1 Running 0 52s pod/nginx-sqldr 1/1 Running 0 52s pod/nginx-vlk5v 1/1 Running 0 52s pod/nginx-w58b4 1/1 Running 0 52s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d service/nginx-service ClusterIP 10.110.104.126 <none> 8080/TCP 52s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx 3 3 3 52s ``` Jika dilihat layanan yang dibuat, bahwa terdapat service yang bertambah yaitu `service/nginx-service` dengan IP akses 10.110.104.126 dan port 8080. > *Jika anda berpikir, kita bisa akses langusng dengan IP 10.110.104.126, maka kurang tepat, karena IP tersebut IP dalam Cluster Kubernetes* Jika tersadar, pada konfigurasi Pod terakhir atau yang berisi curl, itu merupakan Pod yang digunakan untuk mengakses Pod nginx (Pod pertama) melalui service yang dibuat. Nanti, akan masuk ke Pod yang ke 3 (curl) tersebut untuk akses nginx. Kita akan coba akses , melalui Pod ketiga dengan melewati service yang dibuat : ``` $ kubectl exec -it curl -- /bin/sh / # ``` Dan saat ini kita sudah berada di bash command Pod curl. Sekrang kita coba akses kontennya : ``` / # curl http://10.110.104.126:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> / # ``` Seperti itu untuk penggunaan Service, kurang lebih bisa di gambarkan seperti ini : ![16](https://hackmd.io/_uploads/Hyr4ah2iC.png) Oke, sekarnag kita akan bahas lebih dalam terkait Mengakses Service. Bagaimana Cara Mengakses Service? Seandainya aplikasi di Pod butuh mengaskses Pod lain via Service, bagaimana cara mengetahui IP Address Service tersebut? Cara manual adalah dengan membuat service terlebih dahulu, lalu memasukkannya ke dalam konfigurasi aplikasinya secara manual. Atau adakah cara yang lebih otomatis? Untuk Mengakses Service dapat dilakukan dengan cara ini : - Menggunakan Environment Variable - Menggunakan DNS Berikut perintah-perintahnya juga dengan kita mencoba langsung dengan service yang ada : - Melihat Environment Variable ``` $ kubectl exec (podname) -- (env) ``` Kita akan coba sesuai dengan yang ada di bawah ini : ``` $ kubectl exec -it curl -- /bin/sh / # env KUBERNETES_SERVICE_PORT=443 KUBERNETES_PORT=tcp://10.96.0.1:443 HOSTNAME=curl SHLVL=1 HOME=/root PKG_RELEASE=1 TERM=xterm KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 NGINX_VERSION=1.17.10 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_SERVICE_PORT_8080_TCP_ADDR=10.110.104.126 NGINX_SERVICE_SERVICE_HOST=10.110.104.126 KUBERNETES_PORT_443_TCP_PORT=443 NJS_VERSION=0.3.9 KUBERNETES_PORT_443_TCP_PROTO=tcp NGINX_SERVICE_PORT_8080_TCP_PORT=8080 NGINX_SERVICE_PORT_8080_TCP_PROTO=tcp NGINX_SERVICE_PORT=tcp://10.110.104.126:8080 NGINX_SERVICE_SERVICE_PORT=8080 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 NGINX_SERVICE_PORT_8080_TCP=tcp://10.110.104.126:8080 KUBERNETES_SERVICE_HOST=10.96.0.1 PWD=/ ``` Perhatikan pada bagian `NGINX_SERVICE_SERVICE_HOST=10.110.104.126` dan `NGINX_SERVICE_SERVICE_PORT=8080`, nah sudah ketemu untuk akses IP dari service tersebut. Nis gunakan curl dengan IP address tersebut untuk mengakses. - Mengakses Menggunakan DNS Disetiap service yang dibuat, pasti disediakan local DNS oleh Kubernetes, dengan format seperti ini : ``` (servicename).(namespacename).svc.cluster.local ``` Untuk mengaksesnya kita akan coba seperti di bawah ini : ``` / # curl http://nginx-service.default.svc.cluster.local:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> ``` Terlihat aplikasi nginx sudah bisa di akses melalui local DNS. - Melihat Semua Endpoint ``` $ kubectl get endpoints ``` ### 7.2 External Services Biasanya Service digunakan sebagai gateway untuk internal Pod. Tetapi Service juga bisa digunakan sebagai gateway untuk aplikasi eksternal yang berada diluar kubernetes cluster. Gambaran untuk external service kurang lebih seperti ini : ![Hos](https://hackmd.io/_uploads/HyTOciToA.png) Untuk melihat Service Endpoint : ``` $ kubectl describe service (podname) $ kubectl get endpoints (servicename) ``` Membuat Service bisa menggunakan kode konfiurasi berikut : 7.2.1-template-service-with-domain.yaml ```yaml apiVersion: v1 kind: Service metadata: name: external-service labels: label-key1: label-value1 spec: type: ExternalName externalName: example.com ports: - port: 80 ``` Berikut penjelasannya : - **kind: Service**; yang jelas dan pasti untuk membuat Eksternal Service - **type: ExternalName**; digunakan untuk mengakses aplikasi eksternal. - **externalName: example.com**; kemana service akan terkoneksi, pada kasus ini akan terkoneksi example.com Pada konfigurasi di atas, akan berarti ketika saya masuk ke external service tersebut, maka akan mas Lalu, selain menggunakan domain, bisa juga melalui endpoint, seperti di bawah ini : 7.2.2-template-service-with-endpoint.yaml ```yaml apiVersion: v1 kind: Service metadata: name: external-service labels: label-key1: label-value1 spec: ports: - port: 80 --- apiVersion: v1 kind: Endpoints metadata: name: external-service labels: label-key1: label-value1 subsets: - addresses: - ip: 11.11.11.11 - ip: 22.22.22.22 ports: - port: 80 ``` Berikut penjelasan singkatnya : - **kind: Endpoints**; jadi untuk khusus endpoints akan di atur endpoints dan melempar ke sebuah terget. - **ip**; IP untuk menargetkan koneksi ke sistem. Seperti ini contohnya : 7.2.3-nginx-example-serviceexternal.yaml ```yaml apiVersion: v1 kind: Service metadata: name: example-service labels: name: example-service spec: type: ExternalName externalName: example.com ports: - port: 80 --- apiVersion: v1 kind: Pod metadata: name: curl labels: name: curl spec: containers: - name: curl image: khannedy/nginx-curl ``` Kita akan coba dengan catatan seperti di bawah : ``` $ kubectl create -f 7.2.3-nginx-example-serviceexternal.yaml service/example-service created pod/curl created $ kubectl get all NAME READY STATUS RESTARTS AGE pod/curl 1/1 Running 0 36s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/example-service ExternalName <none> example.com 80/TCP 36s service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 95s ``` Bisa diliat pada, Cluster IP untuk ExternalName tidak tersedia karena bersifat hanya mengakses example.com ``` $ kubectl exec -it curl -- bin/sh / # curl http://example-service.default.svc.cluster.local <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html> / # ``` Jika dilihat di atas, Pod telah berhasil mengambil data page dari example.com melalui External Service. ### 7.3 Mengekspos Service Selanjutnya, akan dibahas tentang mengekspos Service, maksudnya aplikasi kita bisa diakses dari luar Pod. Pada dasarnya, untuk mengekspos Pod perlu cara tertentu, tidak bisa hanya dengan cara biasa melalui Port Forwarding karena hal tersebut ditujukan untuk tujuan berbeda. Kadang ada kebutuhan kita perlu untuk mengekspos service keluar Tujuannya adalah agar aplikasi dari luar Kubernetes Cluster bisa mengakses Pod yang berada di belakang service tersebut. ![18](https://hackmd.io/_uploads/S1nKjoRsA.png) Misal pada kasus di gambar, bagaimana cara agar Pod bisa terkoneksi dengan servis dan terkoneksi langsung dengan Mobile Application. Oke, kita akan mempelajarinya. Sebelumnya, kita akan belajar tentang tipe-tipe service terlebih dahulu, yaitu : - **ClusterIP**: Mengekpos Service di dalam internal kubernetes cluster. - **ExternalName**: Memetakan Service ke externalName.(misalnya: example.com) - **NodePort**: Mengekspos Service pada setiap IP node dan port yang sama. Kita dapat mengakses Service dengan tipe ini, dari luar cluster melalui `<NodeIP>:<NodePort>`. - **LoadBalancer**: Mengekspos Service secara eksternal dengan menggunakan LoadBalancer yang disediakan oleh penyedia layanan cloud. Dan macam cara untuk mengekspos Service : - Dengan menggunakan NodePort, sehingga Node akan membuka port yang akan meneruskan request ke Service yang dituju. - Dengan menggunakan LoadBalancer, sehingga Service bisa diakses via LoadBalancer, dan LoadBalancer akan meneruskan request ke NodePort dan dilanjutkan ke Service. - Menggunakan Ingress, dimana Ingress adalah resource yang memang ditujukan untuk mengekspos Service. Namun Ingress hanya beroperasi di level HTTP. #### 7.3.1 NodePort Sebelumnya, kita udah bahas singkat tentang cara mengekspos service, dan salah satunya menggunakan metode NodePort. Pengertian NodePort bisa dilihat gambar di bawah ini : ![19](https://hackmd.io/_uploads/S17w0eghC.png) Jadi, seperti di gambar. NodePort merupakan pengaturan yang membiarkan node membuka atau menyediakan port akses. Port bisa otomatis atau manual. Seperti di gambar, jadi jika anda ingin mengakses Service, bisa melewati node-node tersebut dan akan di teruskan ke Service. Lalu Service akan meneruskan ke Pod-Pod yang di pilih. Untuk melihat NodePort bisa jalankan perintah ini : ```bash $ minikube service (servicename) ``` Dan untuk membuat Service dengan NodePort ikuti langkah ini : 7.3.1.1-template-service-nodeport.yaml ```yaml apiVersion: v1 kind: Service metadata: name: service-name labels: label-key1: label-value1 spec: type: NodePort selector: label-key1: label-value1 ports: - port: 80 targetPort: 80 nodePort: 32767 ``` Sama seperti membuat service, tapi pastikan gunakan `type: NodePort` jika tidak, dia akan secara default menggunakan ClusterIP. Dan pastikan tulis pada port nodePort nya berapa. Sebagai contoh, kita aka buat dengan konfigurasi : 7.3.1.2-nginx-service-nodeport.yaml ```yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx spec: replicas: 3 selector: matchLabels: name: nginx template: metadata: name: nginx labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: name: nginx ports: - port: 80 targetPort: 80 nodePort: 30001 ``` Pada konfigurasi di atas, akan di buat Replica Set yang berisi 2 Pod Nginx dan service nodeport yang diatur di 30001. Kita coba : ``` $ kubectl create -f 7.3.1.2-template-service-nodeport.yaml replicaset.apps/nginx created service/nginx-service created $ kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-5v4tx 1/1 Running 0 34s pod/nginx-kh9gn 1/1 Running 0 34s pod/nginx-v4zhm 1/1 Running 0 34s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h service/nginx-service NodePort 10.102.141.163 <none> 80:30001/TCP 34s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx 3 3 3 34s ``` Jika kalian lihat, pada `service/nginx-service` Node sudah memiliki IP Address dengan port nodenya. Dan untuk tau kita bisa mengaksesnya kita bisa gunakan perintah : ``` $ minikube service nginx-service |-----------|---------------|-------------|---------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|---------------|-------------|---------------------------| | default | nginx-service | 80 | http://192.168.49.2:30001 | |-----------|---------------|-------------|---------------------------| * Opening service default/nginx-service in default browser... http://192.168.49.2:30001 $ curl http://192.168.49.2:30001 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> ``` Diperhatikan, IP Port Cluster berbeda dengan IP Port Node yang diakses diluar. Jika coba cek pakai yg IP Port Cluster . ``` $ curl 10.102.141.163:80 ^C $ curl 10.102.141.163:30001 ^C ``` Maka tak ada hasil, karena tugas jalinan data itu hanya melalui service yang sudah di buat. #### 7.3.2 LoadBalancer Kubernetes bisa menggunakan LoadBalancer bawaan dari Cloud Provider sebagai cara untuk mengekspos Service. Cloud Provider seperti Google Cloud atau Amazon Web Service biasanya memiliki Cloud LoadBalancer. LoadBalancer akan melakukan load balance request ke NodePort. Sayangnya Service LoadBalancer ini tidak bisa di test di local seperti menggunakan Minikube. Begini untuk pola kerja dari LoadBalancer : ![20](https://hackmd.io/_uploads/BkUFAlg3A.png) Sebenarnya mirip seperti NodePort, yang dimana node menyediakan port dan mengakses ke service lalu ke Pod. Tetapi, untuk LoadBalancer dibedakan dengan adanya load balancer untuk menyeimbangkan beban trafik. Jika berdasarkan gambar, alur trafik dari client akan di urus oleh LoadBalancer, beban akan di atur antara melewati Node 1 atau Node 2 tergantung algoritma yang diatur, dan tidak ribet bingung juga untuk mengatur jalan antara Node 1 atau Node 2. Coba kita lihat untuk 2 Service : ![21](https://hackmd.io/_uploads/r1DeV-xhR.png) Pada gambar, 2 service akan terdapat 2 LoadBalancer. Satu untuk Service 1 & 1 untuk 2 Service 2, jadi otomatis beban klien akan diatur dengan LoadBalancer, klien hanya menentukan jalur kemana dia akan pergi. Begini untuk membuat Service berbasis, bisa dilihat template di bawah ini : 7.3.2.1-template-service-loadbalancer.yaml ```yaml apiVersion: v1 kind: Service metadata: name: service-name labels: label-key1: label-value1 spec: type: LoadBalancer selector: label-key1: label-value1 ports: - port: 80 targetPort: 80 ``` Pastikan typenya LoadBalancer, dan node port juga tida k diperlukan karena node port akan ditentukan otomati oleh Service. Bisa lihat, contoh langsungnya : 7.3.2.2-3x-nginx-servicelaodbalancer.yaml ```yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx spec: replicas: 3 selector: matchLabels: name: nginx template: metadata: name: nginx labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: LoadBalancer selector: name: nginx ports: - port: 80 targetPort: 80 ``` Pada YAML di atas, berisikan replica set yang diisi 3 pod nginx dengan adanya service berbasis loadBalancer. Kita coba jalankan (walau tak sampai loadBalancer karena loadBalancer hanya ada di Cloud Service) : ``` $ kubectl create -f 7.3.2.2-3x-nginx-servicelaodbalancer.yaml replicaset.apps/nginx created service/nginx-service created $ kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-pr2b9 1/1 Running 0 53s pod/nginx-rlkp5 1/1 Running 0 53s pod/nginx-svhsj 1/1 Running 0 53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 48s service/nginx-service LoadBalancer 10.104.158.87 <pending> 80:30627/TCP 53s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx 3 3 3 53s ``` Seperti yang terlihat di atas, sudah berisi pengaturan yang sama tapi hanya beda di `service/nginx-service` yang hanya bertipe LoadBalancer. Kita akan coba akses seperti biasa dahulu : ``` $ minikube service nginx-service |-----------|---------------|-------------|---------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|---------------|-------------|---------------------------| | default | nginx-service | 80 | http://192.168.49.2:30627 | |-----------|---------------|-------------|---------------------------| * Opening service default/nginx-service in default browser... http://192.168.49.2:30627 $ curl 192.168.49.2:30627 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> ``` Ya, bisa dilihat, Loadbalancer mirip dengan NodePort, dengan menggunakan cara akses yang sama seperti NodePort. #### 7.3.3 Ingress Ingress adalah salah satu cara yang bisa digunakan untuk mengekspos Service yang berbeda dengan LoadBalancer atau NodePort, jika menggunakan Ingress, client hanya butuh tahu satu lokasi IP Address Ingress. Ketika client melakukan request ke Ingress, pemilihan service nya ditentukan menggunakan hostname dari request, dan Ingress hanya mendukung protokol HTTP. Ingress bisa menjawab dari massalah masalah sebelumnya, seperti di bawah ini : - **Jika menggunakan NodePort**, maka semua Node harus terekspos ke public, dan client harus tau semua IP Address semua Node - **Jika menggunakan LoadBalancer**, maka semua LoadBalancer harus terekspos ke public, dan client harus tau semua IP Address semua LoadBalancer Untuk diagram Ingres bisa dilihat di gambar di bawah ini : ![22](https://hackmd.io/_uploads/S1oYN6f3A.png) Sebenarnya Ingress adalah nginx, cara kerjanya pun mirip server yang berjalan nginx yang bisa menerima dan mengirim request dari domain. Oke, saatnya kita mencoba ingress dengan bantuan perintah di bawah ini : Untuk melihat addons (termasuk Ingress) : ``` $ minikube addons list ``` Untuk mengenable addons (termasuk Ingress) yang terdisable gunakan perintah ini : ``` $ minikube addons enable (addonsname) ``` Untuk melihat apakah sebuah addons udah berjalan gunakan perintah ini : ``` $ kubectl get pod --namespace ingress-nginx ``` Kita akan coba untuk addons Ingress : ``` $ minikube addons enable ingress * ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub. You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS - Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1 - Using image registry.k8s.io/ingress-nginx/controller:v1.10.1 - Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1 * Verifying ingress addon... * The 'ingress' addon is enabled ``` Terlihat bahwa minikube menginstall addons terlebih dahulu untuk menjalankan Ingress ``` $ minikube addons list |-----------------------------|----------|--------------|--------------------------------| | ADDON NAME | PROFILE | STATUS | MAINTAINER | |-----------------------------|----------|--------------|--------------------------------| | ambassador | minikube | disabled | 3rd party (Ambassador) | | auto-pause | minikube | disabled | minikube | | cloud-spanner | minikube | disabled | Google | | csi-hostpath-driver | minikube | disabled | Kubernetes | | dashboard | minikube | disabled | Kubernetes | | default-storageclass | minikube | enabled ✅ | Kubernetes | | efk | minikube | disabled | 3rd party (Elastic) | | freshpod | minikube | disabled | Google | | gcp-auth | minikube | disabled | Google | | gvisor | minikube | disabled | minikube | | headlamp | minikube | disabled | 3rd party (kinvolk.io) | | helm-tiller | minikube | disabled | 3rd party (Helm) | | inaccel | minikube | disabled | 3rd party (InAccel | | | | | [info@inaccel.com]) | | ingress | minikube | enabled ✅ | Kubernetes | | ingress-dns | minikube | disabled | minikube | | inspektor-gadget | minikube | disabled | 3rd party | | | | | (inspektor-gadget.io) | | istio | minikube | disabled | 3rd party (Istio) | | istio-provisioner | minikube | disabled | 3rd party (Istio) | | kong | minikube | disabled | 3rd party (Kong HQ) | | kubeflow | minikube | disabled | 3rd party | | kubevirt | minikube | disabled | 3rd party (KubeVirt) | | logviewer | minikube | disabled | 3rd party (unknown) | | metallb | minikube | disabled | 3rd party (MetalLB) | | metrics-server | minikube | disabled | Kubernetes | | nvidia-device-plugin | minikube | disabled | 3rd party (NVIDIA) | | nvidia-driver-installer | minikube | disabled | 3rd party (Nvidia) | | nvidia-gpu-device-plugin | minikube | disabled | 3rd party (Nvidia) | | olm | minikube | disabled | 3rd party (Operator Framework) | | pod-security-policy | minikube | disabled | 3rd party (unknown) | | portainer | minikube | disabled | 3rd party (Portainer.io) | | registry | minikube | disabled | minikube | | registry-aliases | minikube | disabled | 3rd party (unknown) | | registry-creds | minikube | disabled | 3rd party (UPMC Enterprises) | | storage-provisioner | minikube | enabled ✅ | minikube | | storage-provisioner-gluster | minikube | disabled | 3rd party (Gluster) | | storage-provisioner-rancher | minikube | disabled | 3rd party (Rancher) | | volumesnapshots | minikube | disabled | Kubernetes | | yakd | minikube | disabled | 3rd party (marcnuri.com) | |-----------------------------|----------|--------------|--------------------------------| $ kubectl get pods --namespace ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-b4gtq 0/1 Completed 0 2d6h ingress-nginx-admission-patch-xdwxz 0/1 Completed 0 2d6h ingress-nginx-controller-768f948f8f-lnq7f 1/1 Running 1 (6m37s ago) 2d6h $ kubectl get all --namespace ingress-nginx NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-b4gtq 0/1 Completed 0 2d6h pod/ingress-nginx-admission-patch-xdwxz 0/1 Completed 0 2d6h pod/ingress-nginx-controller-768f948f8f-lnq7f 1/1 Running 1 (24m ago) 2d6h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller NodePort 10.99.252.218 <none> 80:32019/TCP,443:31461/TCP 2d6h service/ingress-nginx-controller-admission ClusterIP 10.111.39.15 <none> 443/TCP 2d6h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 2d6h NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-768f948f8f 1 1 1 2d6h NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4m22s 2d6h job.batch/ingress-nginx-admission-patch Complete 1/1 5m11s 2d6h ``` Terlihat ingress sudah berjalan, pada terminal di atas cukup untuk menggambarkan proses peng-enablean Ingress. Untuk selanjutnya cara untuk membuat Ingress di Minikube, tapi sebelum membuat, bisa di perhatikan lagi perintah-perintah di bawah : Untuk membuat Ingress bisa menggunakan perintah ini : ```bash $ kubectl create -f (ingress.yaml) ``` Untuk melihat Ingress : ``` $ kubectl get ingresses ``` Menghapus Ingress : ``` $ kubectl delete ingress (ingressname) ``` Melihat IP Adress Minikube : ``` $ minikube ip ``` Dan Ingress bisa di buat dengan file konfigurasi seperti ini : 7.3.3.1-template-ingress.yaml ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-name labels: label-key1: label-value1 spec: rules: - host: sub.domain.com http: paths: - path: / pathType: Prefix backend: service: name: service-name port: number: 80 ``` Berikut pernjelasannya : - **host**, untuk mengakses suatu ingress menggunakan host apa? maka dari itu ada konfigurasi host. Contoh : service1.sigma.com - **path**, disini bisa di atur untuk direktori mana yang ingin di tembak ke ingress. - **pathType** : Pada versi terbaru, field pathType wajib ada, biasanya menggunakan nilai Prefix untuk rute yang dimulai dengan path tertentu. - **service-name, port** : menentukan nama service atau port service yang ingin di tembak. Dan berikut contohnya : 7.3.3.2-ingress-replicaset-nginx.yaml ```yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx spec: replicas: 3 selector: matchLabels: name: nginx template: metadata: name: nginx labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: name: nginx ports: - port: 80 targetPort: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress labels: name: nginx-ingress spec: rules: - host: nginx.khannedy.local http: paths: - path: / ``` Disini, konfigurasi terdapat 3 point, yaitu : Replica Set, qService(untuk ekspos Ingress), dan Ingress. Dan bisa di lihat untuk serviceName dan servicePort sesuai yang ada. Mari kita eksekusi : ``` $ kubectl create -f 7.3.3.2-ingress-replicaset-nginx.yaml replicaset.apps/nginx created service/nginx-service created ingress.networking.k8s.io/nginx-ingress created $ kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-9ppvg 1/1 Running 0 4m56s pod/nginx-pd9zv 1/1 Running 0 4m56s pod/nginx-xqvfn 1/1 Running 0 4m56s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4m57s service/nginx-service ClusterIP 10.111.96.73 <none> 80/TCP 4m55s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx 3 3 3 4m57s $ kubectl get ingresses NAME CLASS HOSTS ADDRESS PORTS AGE nginx-ingress nginx nginx.khannedy.local 192.168.49.2 80 5m56s ``` Terlihat sudah terbuat dan berjalan. Danuntuk menggunakan domain `nginx.khannedy.local` tinggal di daftar kan ke mesin host dan di domainkan dengan membeli atau menggunakan jasa domain dari luar. Jadi, saat mengakses `nginx.kannedy.local` akan di lempar ke Ingress dengan IP Address tertentu dan di akseskannya isi konten. Kita akan coba masukkan IP Address ke Host agar bisa akses melalui domain : ``` $ minikube ip 192.168.49.2 $ sudo nano /etc/hosts 127.0.0.1 localhost 127.0.1.1 minkube 192.168.49.2 nginx.khannedy.local #tambahkan ini # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters $ curl nginx.khannedy.local <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> ``` Dan terllihat, jika sudah akses menggunakan `nginx.khannedy.local` nginx akan berjalan.