Portal/Notes πŸ“
Cka

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           25h

Kemudian 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    1m2s

Seperti 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" deleted

Karena 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   8s

Sekarang 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   59s

Jalankan 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 exposed

Perintah 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 yaml
apiVersion: 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


Edit on GitHub

Last updated on

Service: kubectl expose | Faisal Affan