Mengekspos aplikasi menggunakan Service


Halaman ini menunjukkan cara membuat Kubernetes Services di cluster Google Kubernetes Engine (GKE). Untuk penjelasan tentang konsep Service dan diskusi tentang berbagai jenis Service, lihat Service.

Pengantar

Tujuan penggunaan Service adalah mengelompokkan serangkaian endpoint Pod ke dalam satu resource. Anda dapat mengonfigurasi berbagai cara untuk mengakses pengelompokan. Secara default, Anda mendapatkan alamat IP cluster stabil yang dapat digunakan klien di dalam cluster untuk menghubungi Pod di Service. Klien mengirim permintaan ke alamat IP yang stabil, dan permintaan tersebut dirutekan ke salah satu Pod di Service.

Ada lima jenis Service:

  • ClusterIP (default)
  • NodePort
  • LoadBalancer
  • ExternalName
  • Headless

Secara default, cluster Autopilot bersifat publik. Jika memilih cluster Autopilot pribadi, Anda harus mengonfigurasi Cloud NAT untuk membuat koneksi internet keluar, misalnya mengambil image dari DockerHub.

Topik ini memiliki beberapa latihan. Dalam setiap latihan, Anda akan membuat Deployment dan mengekspos Pod-nya dengan membuat Service. Kemudian, kirim permintaan HTTP ke Service.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.
* Membuat cluster GKE.

Membuat Service jenis ClusterIP

Di bagian ini, Anda akan membuat Service jenis ClusterIP.

kubectl apply

Berikut manifes untuk Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: metrics
      department: sales
  replicas: 3
  template:
    metadata:
      labels:
        app: metrics
        department: sales
    spec:
      containers:
      - name: hello
        image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"

Salin manifes ke file bernama my-deployment.yaml, lalu buat Deployment:

kubectl apply -f my-deployment.yaml

Pastikan bahwa tiga Pod sedang berjalan:

kubectl get pods

Output-nya menunjukkan tiga Pod yang sedang berjalan:

NAME                            READY   STATUS    RESTARTS   AGE
my-deployment-dbd86c8c4-h5wsf   1/1     Running   0          7s
my-deployment-dbd86c8c4-qfw22   1/1     Running   0          7s
my-deployment-dbd86c8c4-wt4s6   1/1     Running   0          7s

Berikut manifes untuk Service jenis ClusterIP:

apiVersion: v1
kind: Service
metadata:
  name: my-cip-service
spec:
  type: ClusterIP
  # Uncomment the below line to create a Headless Service
  # clusterIP: None
  selector:
    app: metrics
    department: sales
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

Service memiliki pemilih yang menentukan dua label:

  • app: metrics
  • department: sales

Setiap Pod di Deployment yang Anda buat sebelumnya memiliki dua label tersebut. Jadi, Pod di Deployment akan menjadi anggota Service ini.

Salin manifes ke file bernama my-cip-service.yaml, lalu buat Service:

kubectl apply -f my-cip-service.yaml

Tunggu beberapa saat agar Kubernetes dapat menetapkan alamat internal yang stabil ke Service, kemudian lihat Service tersebut:

kubectl get service my-cip-service --output yaml

Output menunjukkan nilai untuk clusterIP:

spec:
  clusterIP: 10.59.241.241

Catat nilai clusterIP Anda untuk nanti.

Konsol

Membuat Deployment

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workload

  2. Klik Deploy.

  3. Di bagian Tentukan container, pilih Image container yang tersedia.

  4. Untuk Jalur image, masukkan us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0

  5. Klik Selesai, lalu klik Lanjutkan.

  6. Di bagian Konfigurasi, untuk Nama Aplikasi, masukkan my-deployment.

  7. Di bagian Label, buat label berikut:

    • Kunci: app dan Nilai: metrics
    • Kunci: department dan Nilai: sales
  8. Di Cluster, pilih cluster tempat Anda ingin membuat Deployment.

  9. Klik Deploy.

  10. Jika Deployment sudah siap, halaman Detail deployment akan terbuka. Pada Pod yang dikelola, Anda dapat melihat bahwa Deployment memiliki satu atau beberapa Pod yang berjalan.

Membuat Service untuk mengekspos Deployment Anda

  1. Di halaman Deployment details, klik Actions > Expose.
  2. Pada dialog Explore, di bagian Port mapping, tetapkan nilai berikut:

    • Port: 80
    • Target port: 8080
    • Protocol: TCP
  3. Dari menu drop-down Service type, pilih Cluster IP.

  4. Klik Expose.

  5. Jika Service sudah siap, halaman Detail Service akan terbuka, dan Anda dapat melihat detail Service. Di bagian Cluster IP, catat alamat IP yang ditetapkan Kubernetes ke Service Anda. Ini adalah alamat IP yang dapat digunakan klien internal untuk memanggil Service.

Mengakses Service

Menampilkan daftar Pod yang sedang berjalan:

kubectl get pods

Di output, salin salah satu nama Pod yang diawali dengan my-deployment.

NAME                            READY   STATUS    RESTARTS   AGE
my-deployment-dbd86c8c4-h5wsf   1/1     Running   0          2m51s

Masukkan shell ke salah satu container Anda yang sedang berjalan:

kubectl exec -it POD_NAME -- sh

Ganti POD_NAME dengan nama salah satu Pod di my-deployment.

Di shell Anda, instal curl:

apk add --no-cache curl

Di container, buat permintaan ke Service menggunakan alamat IP cluster dan port 80. Perhatikan bahwa 80 adalah nilai kolom port Service Anda. Ini adalah port yang Anda gunakan sebagai klien Service.

curl CLUSTER_IP:80

Ganti CLUSTER_IP dengan nilai clusterIP di Service Anda.

Permintaan Anda diteruskan ke salah satu Pod anggota di port TCP 8080, yang merupakan nilai kolom targetPort. Perhatikan bahwa setiap Pod anggota Service harus memiliki container yang memproses port 8080.

Responsnya akan menunjukkan output hello-app:

Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-h5wsf

Untuk keluar dari shell ke container, masukkan exit.

Membuat Service jenis NodePort

Di bagian ini, Anda akan membuat Service jenis NodePort.

kubectl apply

Berikut manifes untuk Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment-50000
spec:
  selector:
    matchLabels:
      app: metrics
      department: engineering
  replicas: 3
  template:
    metadata:
      labels:
        app: metrics
        department: engineering
    spec:
      containers:
      - name: hello
        image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50000"

Perhatikan objek env dalam manifes. Objek env menentukan bahwa variabel lingkungan PORT untuk container yang berjalan akan memiliki nilai 50000. Aplikasi hello-app memproses port yang ditentukan oleh variabel lingkungan PORT. Jadi dalam latihan ini, Anda meminta container untuk memproses port 50000.

Salin manifes ke file bernama my-deployment-50000.yaml, lalu buat Deployment:

kubectl apply -f my-deployment-50000.yaml

Pastikan bahwa tiga Pod sedang berjalan:

kubectl get pods

Berikut adalah manifes untuk Service jenis NodePort:

apiVersion: v1
kind: Service
metadata:
  name: my-np-service
spec:
  type: NodePort
  selector:
    app: metrics
    department: engineering
  ports:
  - protocol: TCP
    port: 80
    targetPort: 50000

Salin manifes ke file bernama my-np-service.yaml, lalu buat Service:

kubectl apply -f my-np-service.yaml

Lihat Service:

kubectl get service my-np-service --output yaml

Output menunjukkan nilai nodePort:

...
  spec:
    ...
    ports:
    - nodePort: 30876
      port: 80
      protocol: TCP
      targetPort: 50000
    selector:
      app: metrics
      department: engineering
    sessionAffinity: None
    type: NodePort
...

Buat aturan firewall untuk mengizinkan traffic TCP pada port node Anda:

gcloud compute firewall-rules create test-node-port \
    --allow tcp:NODE_PORT

Ganti NODE_PORT dengan nilai kolom nodePort Service Anda.

Konsol

Membuat Deployment

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workload

  2. Klik Deploy.

  3. Di bagian Tentukan container, pilih Image container yang tersedia.

  4. Untuk Jalur image, masukkan us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0.

  5. Klik Add Environment Variable.

  6. Untuk Kunci, masukkan PORT, dan untuk Nilai, masukkan 50000.

  7. Klik Selesai, lalu klik Lanjutkan.

  8. Di bagian Konfigurasi, untuk Nama Aplikasi, masukkan my-deployment-50000.

  9. Di bagian Label, buat label berikut:

    • Kunci: app dan Nilai: metrics
    • Kunci: department dan Nilai: engineering
  10. Di Cluster, pilih cluster tempat Anda ingin membuat Deployment.

  11. Klik Deploy.

  12. Jika Deployment sudah siap, halaman Detail deployment akan terbuka. Pada Pod yang dikelola, Anda dapat melihat bahwa Deployment memiliki satu atau beberapa Pod yang berjalan.

Membuat Service untuk mengekspos Deployment Anda

  1. Di halaman Deployment details, klik Actions > Expose.
  2. Pada dialog Explore, di bagian Port mapping, tetapkan nilai berikut:

    • Port: 80
    • Target port: 50000
    • Protocol: TCP
  3. Dari menu drop-down Service type, pilih Node port.

  4. Klik Expose.

  5. Jika Service sudah siap, halaman Detail Service akan terbuka, dan Anda dapat melihat detail Service. Di bagian Port, catat Port Node yang ditetapkan Kubernetes untuk Service Anda.

Membuat aturan firewall untuk port node

  1. Buka halaman Kebijakan firewall di Konsol Google Cloud.

    Buka Kebijakan firewall

  2. Klik Create firewall rule.

  3. Untuk Name, masukkan test-node-port.

  4. Dari menu drop-down Targets, pilih Semua instance di jaringan.

  5. Untuk Source IPv4 ranges, masukkan 0.0.0.0/0.

  6. Di bagian Protocols and ports, pilih Specified protocols and ports.

  7. Pilih kotak centang tcp, lalu masukkan nilai port node yang Anda catat.

  8. Klik Buat.

Mendapatkan alamat IP node

Temukan alamat IP eksternal salah satu node Anda:

kubectl get nodes --output wide

Outputnya mirip dengan hal berikut ini:

NAME          STATUS    ROLES     AGE    VERSION        EXTERNAL-IP
gke-svc-...   Ready     none      1h     v1.9.7-gke.6   203.0.113.1

Tidak semua cluster memiliki alamat IP eksternal untuk node. Misalnya, node dalam cluster pribadi tidak memiliki alamat IP eksternal.

Mengakses Service

Di kolom URL browser Anda, masukkan kode berikut:

NODE_IP_ADDRESS:NODE_PORT

Ganti kode berikut:

  • NODE_IP_ADDRESS: alamat IP eksternal dari salah satu node Anda, yang ditemukan saat membuat Service di tugas sebelumnya.
  • NODE_PORT: nilai port node Anda.

Outputnya mirip dengan hal berikut ini:

Hello, world!
Version: 2.0.0
Hostname: my-deployment-50000-6fb75d85c9-g8c4f

Membuat Service jenis LoadBalancer

Di bagian ini, Anda akan membuat Service jenis LoadBalancer.

kubectl apply

Berikut manifes untuk Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment-50001
spec:
  selector:
    matchLabels:
      app: products
      department: sales
  replicas: 3
  template:
    metadata:
      labels:
        app: products
        department: sales
    spec:
      containers:
      - name: hello
        image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50001"

Perhatikan bahwa container dalam Deployment ini akan diproses pada port 50001.

Salin manifes ke file bernama my-deployment-50001.yaml, lalu buat Deployment:

kubectl apply -f my-deployment-50001.yaml

Pastikan bahwa tiga Pod sedang berjalan:

kubectl get pods

Berikut manifes untuk Service jenis LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-lb-service
spec:
  type: LoadBalancer
  selector:
    app: products
    department: sales
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 50001

Salin manifes ke file bernama my-lb-service.yaml, dan buat Service:

kubectl apply -f my-lb-service.yaml

Saat Anda membuat Service jenis LoadBalancer, pengontrol Google Cloud akan aktif dan mengonfigurasi Load Balancer Jaringan passthrough eksternal. Tunggu sebentar hingga pengontrol mengonfigurasi Load Balancer Jaringan passthrough eksternal dan membuat alamat IP yang stabil.

Lihat Service:

kubectl get service my-lb-service --output yaml

Output akan menunjukkan alamat IP eksternal stabil di bagian loadBalancer:ingress:

...
spec:
  ...
  ports:
  - ...
    port: 60000
    protocol: TCP
    targetPort: 50001
  selector:
    app: products
    department: sales
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.10

Konsol

Membuat Deployment

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workload

  2. Klik Deploy.

  3. Di bagian Tentukan container, pilih Image container yang tersedia.

  4. Untuk Jalur image, masukkan us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0.

  5. Klik Add Environment Variable.

  6. Untuk Kunci, masukkan PORT, dan untuk Nilai, masukkan 50001.

  7. Klik Selesai, lalu klik Lanjutkan.

  8. Di bagian Konfigurasi, untuk Nama Aplikasi, masukkan my-deployment-50001.

  9. Di bagian Label, buat label berikut:

    • Kunci: app dan Nilai: products
    • Kunci: department dan Nilai: sales
  10. Di Cluster, pilih cluster tempat Anda ingin membuat Deployment.

  11. Klik Deploy.

  12. Jika Deployment sudah siap, halaman Detail deployment akan terbuka. Pada Pod yang dikelola, Anda dapat melihat bahwa Deployment memiliki satu atau beberapa Pod yang berjalan.

Membuat Service untuk mengekspos Deployment Anda

  1. Di halaman Deployment details, klik Actions > Expose.
  2. Pada dialog Explore, di bagian Port mapping, tetapkan nilai berikut:

    • Port: 60000
    • Target port: 50001
    • Protocol: TCP
  3. Dari menu drop-down Service type, pilih Load balancer.

  4. Klik Expose.

  5. Jika Service sudah siap, halaman Detail Service akan terbuka, dan Anda dapat melihat detail Service. Di bagian Load Balancer, catat alamat IP eksternal load balancer.

Mengakses Service

Tunggu beberapa menit hingga GKE mengonfigurasi load balancer.

Di kolom URL browser Anda, masukkan kode berikut:

LOAD_BALANCER_ADDRESS:60000

Ganti LOAD_BALANCER_ADDRESS dengan alamat IP eksternal load balancer Anda.

Responsnya akan menunjukkan output hello-app:

Hello, world!
Version: 2.0.0
Hostname: my-deployment-50001-68bb7dfb4b-prvct

Perhatikan bahwa nilai port dalam Service bersifat tidak tentu. Contoh sebelumnya menunjukkan hal ini dengan menggunakan nilai port 60.000.

Membuat Service jenis ExternalName

Di bagian ini, Anda akan membuat Service jenis ExternalName.

Service jenis ExternalName menyediakan alias internal untuk nama DNS eksternal. Klien internal membuat permintaan menggunakan nama DNS internal, dan permintaan tersebut akan dialihkan ke nama eksternal.

Berikut manifes untuk Service jenis ExternalName:

apiVersion: v1
kind: Service
metadata:
  name: my-xn-service
spec:
  type: ExternalName
  externalName: example.com

Pada contoh sebelumnya, nama DNS-nya adalah my-xn-service.default.svc.cluster.local. Saat klien internal membuat permintaan ke my-xn-service.default.svc.cluster.local, permintaan akan dialihkan ke example.com.

Menggunakan kubectl expose untuk membuat Service

Selain menulis manifes Service, Anda dapat membuat Service menggunakan kubectl expose untuk mengekspos Deployment.

Untuk mengekspos my-deployment, yang ditampilkan sebelumnya dalam topik ini, Anda dapat memasukkan perintah ini:

kubectl expose deployment my-deployment --name my-cip-service \
    --type ClusterIP --protocol TCP --port 80 --target-port 8080

Untuk mengekspos my-deployment-50000, yang ditampilkan sebelumnya dalam topik ini, Anda dapat memasukkan perintah ini:

kubectl expose deployment my-deployment-50000 --name my-np-service \
    --type NodePort --protocol TCP --port 80 --target-port 50000

Untuk mengekspos my-deployment-50001, yang ditampilkan sebelumnya dalam topik ini, Anda dapat memasukkan perintah ini:

kubectl expose deployment my-deployment-50001 --name my-lb-service \
    --type LoadBalancer --port 60000 --target-port 50001

Pembersihan

Setelah menyelesaikan latihan di halaman ini, ikuti langkah berikut untuk menghapus resource dan mencegah timbulnya biaya yang tidak diinginkan pada akun Anda:

kubectl apply

Menghapus Service Anda

kubectl delete services my-cip-service my-np-service my-lb-service

Menghapus Deployment Anda

kubectl delete deployments my-deployment my-deployment-50000 my-deployment-50001

Menghapus aturan firewall

gcloud compute firewall-rules delete test-node-port

Konsol

Menghapus Service Anda

  1. Buka halaman Services di Konsol Google Cloud.

    Buka Service

  2. Pilih Service yang Anda buat dalam latihan ini, lalu klik Delete.

  3. Saat diminta untuk mengonfirmasi, klik Hapus.

Menghapus Deployment Anda

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workload

  2. Pilih Deployment yang Anda buat dalam latihan ini, lalu klik Delete.

  3. Jika diminta untuk mengonfirmasi, pilih kotak centang Hapus Autoscaler Pod Horizontal yang tertaut dengan Deployment yang dipilih, lalu klik Hapus.

Menghapus aturan firewall

  1. Buka halaman Kebijakan firewall di Konsol Google Cloud.

    Buka Kebijakan firewall

  2. Centang kotak test-node-port, lalu klik Delete.

  3. Saat diminta untuk mengonfirmasi, klik Hapus.

Langkah selanjutnya