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 :
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 :
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 :
Untuk membuat Service bisa menggunakan kode konfigurasi template kurang lebih seperti ini :
7.1.1-template-service.yaml
Contoh, bisa seperti di bawah ini :
7.1.2-nginx-service.yaml
Untuk perintah dalam Service kurang lebih seperti ini :
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 :
Dan saat ini kita sudah berada di bash command Pod curl. Sekrang kita coba akses kontennya :
Seperti itu untuk penggunaan Service, kurang lebih bisa di gambarkan seperti ini :
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 :
Berikut perintah-perintahnya juga dengan kita mencoba langsung dengan service yang ada :
Melihat Environment Variable
Kita akan coba sesuai dengan yang ada di bawah ini :
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 :
Untuk mengaksesnya kita akan coba seperti di bawah ini :
Terlihat aplikasi nginx sudah bisa di akses melalui local DNS.
Melihat Semua Endpoint
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 :
Untuk melihat Service Endpoint :
Membuat Service bisa menggunakan kode konfiurasi berikut :
7.2.1-template-service-with-domain.yaml
Berikut penjelasannya :
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
Berikut penjelasan singkatnya :
Seperti ini contohnya :
7.2.3-nginx-example-serviceexternal.yaml
Kita akan coba dengan catatan seperti di bawah :
Bisa diliat pada, Cluster IP untuk ExternalName tidak tersedia karena bersifat hanya mengakses example.com
Jika dilihat di atas, Pod telah berhasil mengambil data page dari example.com melalui External 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.
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 :
<NodeIP>:<NodePort>
.Dan macam cara untuk mengekspos Service :
Sebelumnya, kita udah bahas singkat tentang cara mengekspos service, dan salah satunya menggunakan metode NodePort. Pengertian NodePort bisa dilihat gambar di bawah ini :
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 :
Dan untuk membuat Service dengan NodePort ikuti langkah ini :
7.3.1.1-template-service-nodeport.yaml
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
Pada konfigurasi di atas, akan di buat Replica Set yang berisi 2 Pod Nginx dan service nodeport yang diatur di 30001.
Kita coba :
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 :
Diperhatikan, IP Port Cluster berbeda dengan IP Port Node yang diakses diluar. Jika coba cek pakai yg IP Port Cluster .
Maka tak ada hasil, karena tugas jalinan data itu hanya melalui service yang sudah di buat.
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 :
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 :
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
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
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) :
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 :
Ya, bisa dilihat, Loadbalancer mirip dengan NodePort, dengan menggunakan cara akses yang sama seperti NodePort.
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 :
Untuk diagram Ingres bisa dilihat di gambar di bawah ini :
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) :
Untuk mengenable addons (termasuk Ingress) yang terdisable gunakan perintah ini :
Untuk melihat apakah sebuah addons udah berjalan gunakan perintah ini :
Kita akan coba untuk addons Ingress :
Terlihat bahwa minikube menginstall addons terlebih dahulu untuk menjalankan Ingress
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 :
Untuk melihat Ingress :
Menghapus Ingress :
Melihat IP Adress Minikube :
Dan Ingress bisa di buat dengan file konfigurasi seperti ini :
7.3.3.1-template-ingress.yaml
Berikut pernjelasannya :
Dan berikut contohnya :
7.3.3.2-ingress-replicaset-nginx.yaml
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 :
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 :
Dan terllihat, jika sudah akses menggunakan nginx.khannedy.local
nginx akan berjalan.