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 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
Buka halaman Workloads di Konsol Google Cloud.
Klik add_box Deploy.
Di bagian Tentukan container, pilih Image container yang tersedia.
Untuk Jalur image, masukkan
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
Klik Selesai, lalu klik Lanjutkan.
Di bagian Konfigurasi, untuk Nama Aplikasi, masukkan
my-deployment
.Di bagian Label, buat label berikut:
- Kunci:
app
dan Nilai:metrics
- Kunci:
department
dan Nilai:sales
- Kunci:
Di Cluster, pilih cluster tempat Anda ingin membuat Deployment.
Klik Deploy.
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
- Di halaman Deployment details, klik list Actions > Expose.
Pada dialog Explore, di bagian Port mapping, tetapkan nilai berikut:
- Port:
80
- Target port:
8080
- Protocol:
TCP
- Port:
Dari menu drop-down Service type, pilih Cluster IP.
Klik Expose.
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
Buka halaman Workloads di Konsol Google Cloud.
Klik add_box Deploy.
Di bagian Tentukan container, pilih Image container yang tersedia.
Untuk Jalur image, masukkan
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
.Klik add Add Environment Variable.
Untuk Kunci, masukkan
PORT
, dan untuk Nilai, masukkan50000
.Klik Selesai, lalu klik Lanjutkan.
Di bagian Konfigurasi, untuk Nama Aplikasi, masukkan
my-deployment-50000
.Di bagian Label, buat label berikut:
- Kunci:
app
dan Nilai:metrics
- Kunci:
department
dan Nilai:engineering
- Kunci:
Di Cluster, pilih cluster tempat Anda ingin membuat Deployment.
Klik Deploy.
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
- Di halaman Deployment details, klik list Actions > Expose.
Pada dialog Explore, di bagian Port mapping, tetapkan nilai berikut:
- Port:
80
- Target port:
50000
- Protocol:
TCP
- Port:
Dari menu drop-down Service type, pilih Node port.
Klik Expose.
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
Buka halaman Kebijakan firewall di Konsol Google Cloud.
Klik add_box Create firewall rule.
Untuk Name, masukkan
test-node-port
.Dari menu drop-down Targets, pilih Semua instance di jaringan.
Untuk Source IPv4 ranges, masukkan
0.0.0.0/0
.Di bagian Protocols and ports, pilih Specified protocols and ports.
Pilih kotak centang tcp, lalu masukkan nilai port node yang Anda catat.
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
Buka halaman Workloads di Konsol Google Cloud.
Klik add_box Deploy.
Di bagian Tentukan container, pilih Image container yang tersedia.
Untuk Jalur image, masukkan
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
.Klik add Add Environment Variable.
Untuk Kunci, masukkan
PORT
, dan untuk Nilai, masukkan50001
.Klik Selesai, lalu klik Lanjutkan.
Di bagian Konfigurasi, untuk Nama Aplikasi, masukkan
my-deployment-50001
.Di bagian Label, buat label berikut:
- Kunci:
app
dan Nilai:products
- Kunci:
department
dan Nilai:sales
- Kunci:
Di Cluster, pilih cluster tempat Anda ingin membuat Deployment.
Klik Deploy.
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
- Di halaman Deployment details, klik list Actions > Expose.
Pada dialog Explore, di bagian Port mapping, tetapkan nilai berikut:
- Port:
60000
- Target port:
50001
- Protocol:
TCP
- Port:
Dari menu drop-down Service type, pilih Load balancer.
Klik Expose.
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
Buka halaman Services di Konsol Google Cloud.
Pilih Service yang Anda buat dalam latihan ini, lalu klik delete Delete.
Saat diminta untuk mengonfirmasi, klik Hapus.
Menghapus Deployment Anda
Buka halaman Workloads di Konsol Google Cloud.
Pilih Deployment yang Anda buat dalam latihan ini, lalu klik delete Delete.
Jika diminta untuk mengonfirmasi, pilih kotak centang Hapus Autoscaler Pod Horizontal yang tertaut dengan Deployment yang dipilih, lalu klik Hapus.
Menghapus aturan firewall
Buka halaman Kebijakan firewall di Konsol Google Cloud.
Centang kotak test-node-port, lalu klik delete Delete.
Saat diminta untuk mengonfirmasi, klik Hapus.