Skip to content

Main Kubernetes Component

dibazalfa edited this page May 16, 2024 · 1 revision

Kubernetes memiliki beberapa fitur dan komponen yang harus diketahui terlebih dahulu sebelum kita memulai menggunakannnya.

a. NODE vs POD vs CONTAINER

Fitur Node Pod Container
Definisi Sebuah mesin fisik atau virtual yang menjalankan Kubernetes, dapat berupa server atau instance cloud. Sebuah unit terkecil yang dapat dijadwalkan dalam Kubernetes, yang berisi satu atau beberapa container. Unit terkecil dalam sebuah pod, yang berisi aplikasi atau layanan yang dijalankan dalam sebuah pod.
Tugas Utama Menyediakan lingkungan untuk menjalankan pod. Menjalankan satu atau beberapa container dan menyediakan lingkungan untuk berbagi sumber daya. Menjalankan aplikasi atau layanan yang spesifik, dan berbagi sumber daya dengan container lain dalam pod yang sama.
Isolasi Setiap node berjalan dalam lingkungan terisolasi dan memiliki sumber daya komputasi, memori, dan jaringan yang terpisah. Setiap pod berjalan dalam lingkungan terisolasi tetapi dapat berbagi sumber daya seperti jaringan dan volume. Setiap container berjalan dalam lingkungan terisolasi dan dapat memiliki sumber daya yang terbatas, seperti CPU dan memori.
Manajemen Dikelola oleh Kubernetes, dapat ditambahkan atau dihapus dari cluster Kubernetes. Dikelola oleh Kubernetes, dapat dibuat, dihapus, atau diperbarui. Dikelola oleh Docker atau runtime container lainnya, dapat dibuat, dihapus, atau dijalankan secara independen.
Jaringan Node memiliki alamat IP dan dapat berkomunikasi dengan node dan pod lain di dalam cluster. Pod memiliki alamat IP yang unik dalam cluster, dan setiap pod memiliki kemampuan untuk berkomunikasi dengan pod lain dan node. Container dapat berkomunikasi dengan container lain dalam pod menggunakan localhost, serta dengan pod dan node lain di dalam cluster menggunakan alamat IP pod dan node.
Ketersediaan Node dapat ditambahkan atau dihapus dari cluster untuk meningkatkan ketersediaan atau kapasitas. Pod dapat dideploy ulang ke node yang berbeda jika node asalnya gagal, untuk menjaga ketersediaan aplikasi. Container dapat dimulai ulang atau dihapus dalam pod tanpa mempengaruhi pod lain di dalamnya, untuk menjaga ketersediaan layanan.

b. Service & Ingress

Hal ini merujuk pada mekanisme yang berbeda untuk mengatur bagaimana aplikasi dan layanan dalam kluster Kubernetes dapat diakses, baik dari dalam maupun luar kluster.

External Service

  • External Service memungkinkan layanan Kubernetes untuk diakses dari luar kluster. Ini biasanya dicapai dengan menggunakan jenis layanan LoadBalancer atau NodePort.

LoadBalancer akan Secara otomatis menyediakan alamat IP eksternal yang dapat diakses dari luar kluster melalui load balancer dari penyedia cloud (misalnya, AWS ELB, Google Cloud Load Balancer).

Contoh Konfigurasi LoadBalancer :

apiVersion: v1
kind: Service
metadata:
  name: my-external-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

NodePort akan membuka port tertentu pada semua node dalam kluster dan mem-forward traffic ke Service tersebut.

Contoh Konfigurasi NodePort :

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30000

Note : NodePorts are in the 30000-32767 range by default

Internal Service

  • Internal Service memungkinkan layanan Kubernetes diakses hanya dari dalam kluster. Ini biasanya menggunakan jenis layanan ClusterIP, yang merupakan default.

Contoh Konfigurasi ClusterIP :

apiVersion: v1
kind: Service
metadata:
  name: my-internal-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Service ini hanya dapat diakses dari dalam kluster dan tidak menyediakan akses dari luar.

Note : ClusterIP merupakan type default dari service, tetapi tetap bisa didefinisikan dengan type: ClusterIP

Ingress

  • Ingress adalah objek Kubernetes yang mengelola akses eksternal ke layanan dalam kluster, biasanya HTTP dan HTTPS. Ingress menyediakan aturan routing yang fleksibel, mendukung SSL, dan lain-lain.

Contoh Konfigurasi Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: my-app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-internal-service
                port:
                  number: 80

Untuk melihat type service yang dijalankan, kita dapat menggunakan command kubectl get service atau kubectl get svc

c. ConfigMap

ConfigMap adalah objek Kubernetes yang digunakan untuk menyimpan data konfigurasi dalam bentuk pasangan key: value. ConfigMap memungkinkan untuk memisahkan konfigurasi aplikasi dari kode aplikasi, sehingga mempermudah manajemen konfigurasi dan memperbaiki praktik deployment.

Contoh Konfigurasi ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-configmap
data:
  # Pasangan key: value
  database_url: "jdbc:mysql://db.example.com:3306/mydatabase"
  database_user: "user123"
  database_password: "password123"

Secret

Secret adalah salah satu fitur kubernetes yang sangat penting. Fungsinya adalah untuk menyimpan data-data/variable yang dibutuhkan oleh semua pods namun bersifat rahasia.

Misalkan kita ingin agar pods kita dapat mengakses pods database. Agar pods dapat mengakses database tentu saja perlu kredensial bukan? dengan menggunakan fitur secret ini, kredensial dapat di enkripsi sehingga tidak dapat dengan mudah diketahui oleh yang tidak berkepentingan.

Contoh konfigurasinya adalah sebagai berikut:

apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
data:
  mongo-user: bW9uZ291c2Vy
  mongo-password: bW9uZ29wYXNzd2Q=

Disini, kita setup aplikasi kita untuk bisa mengakses database dengan menggunakan kredensial berikut. Kredesial harus ditulis dengan di encode ke base64 sehingga fitur dapat bekerja.

Load Balancer

Untuk mensetup load balancer khusus untuk sistem kubernetes kita dapat menggunakan konfigurasi berikut:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Dalam contoh ini, aplikasi yang digunakan adalah nginx. Jika kalian menggunakan aplikasi lain (misalnya apache2) kalian bisa membaca dokumentasi aplikasi tersebut untuk mendeploy Load Balancer menggunakan aplikasi tersebut.

Deployment

Terakhir, berikut adalah contoh konfigurasi untuk mendeploy aplikasi nginx:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080

Note: Setiap aplikasi bisa jadi memiliki konfigurasi yang berbeda, selalu cek konfigurasi aplikasi tersebut untuk menggunakannya dengan kubernetes.

Untuk konfigurasi di atas, kita akan mendeploy aplikasi 3 aplikasi nginx sekaligus (dari variable replicas) dan di setiap pods nya, nginx dapat di akses di port 80.

Agar kita dapat mengakses nginx, kita akan mengakses via port 30080 yang nantinya akan di forward oleh kubernetes ke port 80 aplikasi nginx.

Aplikasikan konfigurasi ke kubernetes

Lalu, kita akan menjalankan command berikut untuk mengaplikasikan konfigurasi-konfigurasi yang kita buat ke kubernetes:

kubectl apply -f config.yaml

Sebagai contoh, misal kita punya aplikasi yang memerlukan mongodb sebagai database (disimpan dalam file mongo.yaml), nginx sebagai web server(webapp.yaml), mongo-secret.yaml untuk menyimopan kredensial, dan mongo-config.yaml untuk menyimpan configurasi. Maka untuk mendeploynya kita perlu command-command berikut:

kubectl apply -f webapp.yaml
kubectl apply -f mongo.yaml
kubectl apply -f mongo-config.yaml
kubectl apply -f mongo-secret.yaml

Matikan mesin

Untuk mematikan sistem minikube, dapat menggunakan command:

minikube stop

Untuk mematikan deployment, service, dan pods tertentu, dapat menggunakan:

kubectl delete deployment [[nama deployment]]
kubectl delete service [[nama service]]
kubectl delete pods [[nama pods]]

Untuk mematikan semua service/deployment/pods dapat menggunakan command berikut:

kubectl delete deployment --all
kubectl delete service --all
kubectl delete pods --all

Clone this wiki locally