Services Kubernetes

Service adalah sebuah fitur didalam kubernetes yang mengizinkan sebuah pod atau deployment dapat diakses dari dalam cluster kubernetes sendiri atau diakses dari luar.

The service concept

Ada beberapa tipe services

  • ClusterIP

ClusterIP adalah tipe services yang memberikan ip address yang hanya dapat diakses didalam cluster kubernetes.

Buat sebuah deployment

buntu@master:~$ kubectl run nginx --image nginx
deployment.apps "nginx" created
ubuntu@master:~$ kubectl describe deploy nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Wed, 27 Jun 2018 22:41:15 -0400
Labels:                 run=nginx
Annotations:            deployment.kubernetes.io/revision=1
Selector:               run=nginx
Replicas:               1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   nginx-65899c769f (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  13s   deployment-controller  Scaled up replica set nginx-65899c769f to 1

Buat sebuah services dengan menggunakan selector untuk label run=nginx

apiVersion:  v1
kind:        Service
metadata:
  name:      nginx
spec:
  selector:
    run:     nginx
  ports:
  - port:    80
  type: ClusterIP

Jalankan services tersebut

ubuntu@master:~$ nano clusterip.yaml
ubuntu@master:~$ kubectl create -f clusterip.yaml 
service "nginx" created
ubuntu@master:~$ kubectl describe svc nginx
Name:              nginx
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          run=nginx
Type:              ClusterIP
IP:                10.101.13.6
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.21:80
Session Affinity:  None
Events:            <none>
ubuntu@master:~$ curl http://10.101.13.6
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>
  • NodePort

NodePort adalah cara yang paling mudah agar deployment yang kita deploy dapat diakses dari luar. NodePort akan membuka port spesifik dari sebuah node dan mengattachnya kedalam deployment, hampir mirip dengan konsep port forwarding.

Masih dengan deployment yang sama seperti ClusterIP, buat sebuah service dengan NodePort. NodePort dibawah akan membuka port 30036 dan akan melakukan forwarding kedalam deployment dengan port 80.

apiVersion: v1
kind: Service
metadata:  
  name: my-nodeport-service
spec:
  selector:    
    run: nginx
  type: NodePort
  ports:  
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30036
    protocol: TCP

jalankan service tersebut

ubuntu@master:~$ nano nodeport.yaml
ubuntu@master:~$ kubectl create -f nodeport.yaml 
service "my-nodeport-service" created
ubuntu@master:~$ kubectl get svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes            ClusterIP   10.96.0.1        <none>        443/TCP        5d
my-nodeport-service   NodePort    10.107.138.137   <none>        80:30036/TCP   6s
ubuntu@master:~$ curl http://10.101.101.10:30036
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>
ubuntu@master:~$
  • Load Balancer

Jika kita mendeploy kubernetes dengan kubeadm atau minikube, service load balancer tidak akan bisa digunakan karena service ini akan mengexpose external load balancer seperti lbaas di openstack. platfrom yang mendukung seperti aws, google cloud, atau openstack

Sumber :

  • https://docs.openstack.org/magnum/ocata/dev/kubernetes-load-balancer.html
  • https://kubernetes.io/docs/concepts/services-networking/service/

Comments are closed.