Service: kubectl expose
Versi Bahasa Indonesia. Baca dalam Bahasa Inggris
Cara lain untuk membuat service adalah dengan menggunakan perintah kubectl expose.
kubectl expose <resource-type> <resource-name> --port=<port> --target-port=<target-port> --type=<type><resource-type>: Jenis resource Kubernetes (pod, deployment, replicaset, dll.).<resource-name>: Nama resource yang akan diekspos.--port: Port eksternal untuk diekspos.--target-port: Port pada container untuk meneruskan traffic.--type: Tipe service (ClusterIP, NodePort, LoadBalancer, atau ExternalName).--name: Nama service yang baru dibuat.
Mengekspos sebagai Service ClusterIP
Pertama, mari kita buat objek deployment sederhana menggunakan image nginx dengan nama my-server.
β kubectl create deployment my-server --image=nginx
deployment.apps/my-server createdβ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
my-server 1/1 1 0 10s
postgres 1/1 1 1 25h
simple-go 3/3 3 3 25hKemudian mari kita buat service dengan tipe ClusterIP menggunakan perintah kubectl expose. Karena ClusterIP adalah tipe default, kita tidak perlu menentukan argumen --type.
β kubectl expose deployment my-server --port=80 --target-port=80
service/my-server exposedβ kubectl get svc my-server
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-server ClusterIP 10.97.240.5 <none> 80/TCP 1m2sSeperti yang kita lihat di atas, perintah tersebut akan membuat service bernama my-server yang mengekspos deployment bernama my-server. Kita juga dapat melihat detailnya dalam format yaml menggunakan perintah kubectl get service my-server -o yaml.
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2025-02-10T06:03:41Z"
labels:
app: my-server
name: my-server
namespace: default
resourceVersion: "129776"
uid: 618624cb-2f7e-466e-992d-ecfaf400fb72
spec:
clusterIP: 10.97.240.5
clusterIPs:
- 10.97.240.5
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: my-server
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}Mengekspos sebagai Service NodePort
Mari kita hapus service sebelumnya dan kemudian ekspos deployment kita lagi sebagai service NodePort. Kita perlu menghapus service sebelumnya karena perintah expose secara default akan memberi nama service yang sama dengan nama deployment.
β kubectl delete svc my-server
service "my-server" deletedKarena NodePort bukan tipe service default, kita perlu secara eksplisit menentukan tipe service menggunakan --type dalam perintah expose.
β kubectl expose deployment my-server --type=NodePort --port=80 --target-port=80
service/my-server exposedβ kubectl get svc my-server
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-server NodePort 10.100.253.32 <none> 80:31775/TCP 8sSekarang sudah diekspos sebagai NodePort dan Anda dapat mencoba mengaksesnya menggunakan IP Minikube dan PORT service. Tetapi jika Anda menggunakan Minikube di Mac dengan driver docker seperti saya, Anda akan memerlukan minikube service untuk mengeksposnya.
Mengekspos sebagai Service LoadBalancer
Sekarang mari kita buat service lain tetapi dengan tipe LoadBalancer. Kali ini kita secara eksplisit menentukan nama service menggunakan argumen --name.
Perintah di bawah ini akan membuat service dengan tipe LoadBalancer dan nama my-server-lb.
β kubectl expose deployment my-server --type=LoadBalancer --name=my-server-lb --port=80 --target-port=80
service/my-server-lb exposedβ kubectl get svc my-server-lb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-server-lb LoadBalancer 10.96.60.45 <pending> 80:30309/TCP 59sJalankan minikube tunnel di terminal lain dan uji menggunakan curl.
β curl http://localhost
<!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>Mengekspos Pod Secara Langsung
Kita juga dapat secara langsung mengekspos pod, tetapi ini tidak disarankan dalam produksi.
Sebagai contoh, mari kita ekspos pod my-server.
β kubectl get pods
NAME READY STATUS RESTARTS AGE
my-server-78b5bb4ccc-7cbxf 1/1 Running 0 31m
postgres-f8f589d5b-59rw8 1/1 Running 0 25h
simple-go-5dc4557ffc-c24fp 1/1 Running 0 25h
simple-go-5dc4557ffc-d6tz6 1/1 Running 0 25h
simple-go-5dc4557ffc-gv4fv 1/1 Running 0 25hβ kubectl expose pod my-server-78b5bb4ccc-7cbxf --port=80 --target-port=80
service/my-server-78b5bb4ccc-7cbxf exposedPerintah di atas akan membuat service ClusterIP yang mengekspos pod my-server-78b5bb4ccc-7cbxf.
Ini tidak disarankan karena seperti yang kita lihat di bawah, service ini terikat ke pod tertentu. Jadi jika pod tersebut diganti atau ditingkatkan, service tidak akan berfungsi.
β kubectl get svc my-server-78b5bb4ccc-7cbxf -o yamlapiVersion: v1
kind: Service
metadata:
creationTimestamp: "2025-02-10T06:34:09Z"
labels:
app: my-server
pod-template-hash: 78b5bb4ccc
name: my-server-78b5bb4ccc-7cbxf
namespace: default
resourceVersion: "131264"
uid: 98ef311b-0054-4023-8d83-ca5b0bc9c025
spec:
clusterIP: 10.99.77.89
clusterIPs:
- 10.99.77.89
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: my-server
pod-template-hash: 78b5bb4ccc
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}Referensi
Last updated on