Tutorial & Configuration
  • Home
  • Desktop
  • Server
  • Mikrotik
  • Tools
  • Home
  • Desktop
  • Server
  • VirtualBox
  • Cisco
  • Mikrotik
  • Tools
  • About
  • Contact
Tampilkan postingan dengan label DevOps. Tampilkan semua postingan
Tampilkan postingan dengan label DevOps. Tampilkan semua postingan

Rabu, 22 Mei 2024

Install kubernetes di server ubuntu 22.04 (3 node)

 maouam     Mei 22, 2024     Cloud, DevOps, Server     No comments   

1. Install 3 Ubuntu Server 22.04 (fresh install) - 1 master node, 2 node worker

2. Update paket => sudo apt update && sudo apt upgrade -y (semua server)

3. Disable swap (semua server)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

4. Add Kernel Parameters (semua server)
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

5. Config kernel untuk kubernetes (semua server)
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

6. Reload config
sudo sysctl --system

7. Install Containerd Runtime (semua server)
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y containerd.io
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd

8. Tambah repo kubernetes dan install (semua server)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubeadm=1.28.1-1.1 kubelet=1.28.1-1.1 kubectl=1.28.1-1.1

9. Inisialisai kubenetes cluster (master node)
sudo kubeadm init

10. Setelah selesai inisialisasi simpan "kubeadm join..." untuk digunakan node worker nanti

11. Config kubectl (master node)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

12. Cek cluster dan node status
kubectl get nodes

13. Tambahkan node worker untuk join ke cluster (node worker)
kubeadm join ... (note di step 10)

14. Install Kubernetes Network Plugin (master node)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

15. Verifikasi cluster (master node)
kubectl get pods -n kube-system
kubectl get nodes

16. Deploy test aplikasi di cluster (master node)
kubectl run nginx --image=nginx
kubectl get pods

DONE.

Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Minggu, 21 Agustus 2022

Git Dasar

 maouam     Agustus 21, 2022     DevOps     No comments   

 Git Dasar


#Pengenalan Version Control

## Local Version Control (Hanya berjalan di local komputer)

## Centralized Version Control (Menyimpan data di server, bisa di akses multi person, team, contohnya Subversion)

## Distributed Version Control (Alternatif centralized version control, seluruh riwayat di simpan di tiap server/komputer. contohnya adalah Git)


#Pengenalan Git (dibuat pada tahun 2005 oleh pembuat kernel linux yaitu linus torvalds)


#Configuration

## git config --global user.name "Irham Taufik"  (config username)

## git config --global user.email "irhamtaufik3@gmail.com"  (config email)

## git config --global core.editor "code --wait" (default editor visual studio code)

## git config --global diff.tool "default-difftool" (config difftool)

## git config --global difftool.default-difftool.cmd "code --wait --diff \$LOCAL \$REMOTE" 

## git config --list --show-origin (Melihat seluruh configuration)


#Repository (Sebutan project di Git)

## git init (Membuat repository di folder yang sudah kita tentukan)

## git status (cek status)


#Workflow

##The Three States

  - Modified => Mengubah file  (menambah, mengedit, menghapus) namun belum disimpan secara permanen ke repository

  - Staged => menandai modifikasi yg kita lakukan terhadap file akan disimpan secara permanen ke repository

  - Committed => data sudah aman disimpan di reposiroty

##Three Section

  - Working directory => saat melakukan modifikasi file

  - Staging Area => section dimana file sudah disiapkan untuk disimpan secara permanen, di staging area semua informasi perubahan file akan disimpan

  - Repository => tempat dimana semua file dan database riwayat versi file disimpan 


#Hash (Digunakan untuk pengecekan perubahan pada file, checksum)

## Snapshot (berisikan semua perubahan yang terjadi di semua file yang kita commit, snapshot menghasilkan hash)

## HEAD (merupakan pointer menuju hash yang paling akhir)


#Menambah File

## git add namafile (untuk menambahkan ke staging index)

## git commit -m "Menambah file1.txt" (commit ke repository)


#Edit File

## git diff (Melihat perubahan file)

## git add file1 file2 (Menambah ke staging index lebih dari satu file)

## git add . (Menambah ke stating index semua file)


#Menghapus File

## hapus file terkait kemudian sama saja seperti menambah atau edit file step by stepnya. 


#Membatalkan Penambahan file (Working directory)

## git clean -f (Menghapus/membatalkan semua file yg baru dibuat)


#Membatalkan Perubahan file (Working directory)

## git restore namafile (Membatalkan perubahan file)


#Membatalkan Penghapusan file (Working directory)

## git restore namafile (Membatalkan penghapusan file)


#Membatalkan dari staging index

## git restore --staged namafile (Mengembalikan terlebih dahulu dari staging ke working directory)

   git restore namafile (Membatalkan perubahan/penghapusan file)


#Commit Log

## git log (Melihat semua history/log)

## git log --oneline (Melihat log dalam satu baris)

## git log --oneline --graph (Melihat commit log dengan hubungannya dengan commit log sebelumnya)

## git show hash (Melihat detail coomit)


#Compare Commit

## git diff hash1 hash2 (Membandingkan antara commit dengan commit lainnya)

## git difftool hash1 hash2 (Membandingkan antara commit dengan commit lainnya menggunakan visual studio code)


##Rename file

##rename file kemudian lakukan add staging nama file lama dan nama file baru


#Reset Commit (merupakan mekanisme dimana kita menggeser HEAD pointer ke posisi commit yg kita mau)

## git reset <mode> hash

   ~ mode soft => hanya repository saja yg berubah headnya

   ~ mode mixed(Default) => repository dan staging index yang berubah headnya

   ~ mode hard => repository, staging index dan working (semuanya) berubah headnya


#Amend Commit

## git commit --amend (Melakukan commit pada perubahan file yg lupa saat commit sebelumnya)


#Versi Sebelumnya

## git checkout hash -- namafile (melihat versi file pada commit sebelumnya, file tersebut akan berada di staging index)


#Snapshot Sebelumnya

## git checkout hash (menuju ke snapshot tertentu)

## git checkout namabrach (kembali ke head)

## git branch --show-current (melihat branch saat ini)


#Revert commit

## git revert hash (membatalkan commit yg sudah di lakukan dengan cara membuat commit baru yg membatalkan commit sebelumnya)


#Ignore

## Buat file .gitignore kemudian isikan nama file, folder atau ekstensi tertentu yg ingin di ignore.


#Blame

## git blame namafile (Melihat siapa yg melakukan perubahan dan juga utk mengetahui commitnya)


#Alias (Digunakan untuk membuat nama perintah lain utk perintah yg sudah ada di git

## git config --global alias.ko commit (perintah commit di singkat menjadi ko)



Source: Programmer Zaman Now

Note: Hanya sebagai catatan saya

Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Minggu, 24 Juli 2022

Kubernetes

 maouam     Juli 24, 2022     DevOps     No comments   

#Arsitektur Kubernetes
 1. Kubernetes Master => Yang Manage
    ~ Kube-apiserver interaksi dengan kubernetes cluster
    ~ etcd sebagai database utk menyimpan data kubernetes cluster
    ~ Kube-scheduler memperhatikan aplikasi yg berjalan dan meminta node utk menjalakan aplikasi
    ~ Kube-controller-manager bertugas melakukan kontrol terhadap kubernetes cluster
    ~ Cloud-controller-manager bertugas melakukan kontrol terhadap interaksi dgn cloud provider mirip seperti Kube-controller-manager


 2. Kubernetes Nodes/worker (Kubelet, Kube-proxy, Container manager) => Semua aplikasi jalan di worker.
    ~ Kubelet berjalan di setiap node, memastikan aplikasi berjalan di node
    ~ Kube-proxy berjalan di setiap node, sebagai proxy terhadap arus network yg masuk ke aplikasi dan sebagai load balancer juga
    ~ Container-manager berjalan di setiap node, bertugas sebagai container manager (docker, containerd, cri-o, rklet)


#Alur Kerja Menggunakan Kubernetes
 Developer -> Configuration File -> Kubernetes Master -> Kubernetes Nodes/Workers

#Node
## kubectl get nodes (Melihat semua node)
## kubectl describe node namanode (Melihat detail node)

#Pod (Berisi satu atau lebih container, pod adalah aplikasi kita yang running di kubernetes cluster)
====pod.yaml====
apiVersion: v1
kind: Pod
metadata:
  name: pod-name
spec:
  contianers:
        - name: container-name
          image: image-name
          ports:
                - containerPort: 80
===End===
## kubectl get pod (Melihat semua pod)
## kubectl describe pod namapod (Melihat detail pod)
## kubectl create -f filepod.yaml (Membuat pod, mengsubmit yaml file ke kubernetes cluster)
   Example: kubectl create -f nginx.yaml
## kubectl get pod -o wide (Melihat lebih detail pod)
## kubectl port-forward namapod portAkese:portPod (Hanya utk testing saja)
## kubectl delete pod namapod (Menghapus pod)
## kubectl delete pod -l key=vlaue (Menghapus pod dengan selektor label)
## kubectl delete pod --all --namespace namanamespace (Menghapus semua pod di namespace)
## kubectl delete pod --all (Menghapus semua pod)
----------------

#Label (Untuk informasi tambahan seperti tanda, file dll)
===pod-with-label.yaml====
apiVersion: v1
kind: Pod
metadata:
  name: nginx-with-label
  labels:
    team: finance
    version: 1.4.5
    environment: production
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
==End===
##kubectl get pods --show-labels (Melihat label)
##kubectl labelspod namapod
----------------

#Annotation (menambahkan informasi tambahan dalam ukuran besar)
===nginx-with-annotation.yaml===
apiVersion: v1
kind: Pod
metadata:
  name: nginx-with-annotation
  labels:
    team: product
    version: 1.0.1
    environment: development
  annotations:
    description: Ini adalah aplikasi yang di buat oleh tim product
    apapun: apaun itu ....
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
===End===
## kubectl describe pod namapod
## kubectl annotate pod namapod
----------------

#Namespace (memisahkan atau membuat grup jika resource di kubernetes sudah terlalu banyak. Nama resource bisa sama jika beberapa
#di namespace yg berbeda)
===finance-namespace.yaml===
apiVersion: v1
kind: Namespace
metadata:
  name: finance
==End===
## kubectl get namespace (Melihat namespace)
## kubectl get pod --namespace namanamespace (Melihat pod di namespace)
## kubectl create -f namafilenamespace.yaml (Membuat namespace)
## kubectl create -f namafile.yaml --namespace namanamespace (Membuat pod di Namespace)
## kubectl delete namespace namanamespace (Menghapus namespace)
---------------

#Probe (Pengecekan)
 1. Liveness probe => health check jika pod bermasalah pod akan di restart
 2. Readiness probe => health check jika pod bermasalah traffic pod akan di stop. Jika pod sehat, pod diperbolehkan
    mengirim traffic kembali
 3. Startup probe => health check saat awal saja, memastikan aplikasi pod health
 4. Mekanisme pengecekan menggunakan HTTP get, TCP socket, Command exec
===nginx-with-probe.yaml===
apiVersion: v1
kind: Pod
metadata:
  name: nginx-with-probe
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
      livenessProbe:
        httpGet:
          path: /404
          port: 80
        initialDelaySeconds: 5
        periodSeconds: 5
        timeoutSeconds: 1
        successThreshold: 1
        failureThreshold: 3
==End===
## kubectl describe pod namapod (Melihat detail liveness dll)
----------------

#Replication Controller (Bertugas memastikan pod selalu berjalan)
===nginx-rc.yaml===
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-rc
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
===End===
## kubectl get replicationcontroller (Melihat replication controller)
## kubectl get rc (Melihat replication controller)
## kubectl delete rc namarc (Menghapus rc beserta pod nya)
## kubectl delete rm namarc --cascade=false atau --cascade=orphan (Hanya menghapus rc saja)
----------------

#Replica Set (Sama seperti relication controller, sekarang yg di gunakan adalah replica set, replication controller tidak
#direkomedasikan. Replica set label selectornya lebih expressive)
===nginx-rs.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
===End===
## kubectl get rs (Melihat replica set)
## kubectl delete rs namarc (Menghapus rc beserta pod nya)
## kubectl delete rm namarc --cascade=false atau --cascade=orphan (Hanya menghapus rs saja)
----------------

#Match Expression
 1. In => value label harus ada di value in
 2. NotIn => value label tidak boleh ada di value in
 3. Exists => label harus ada
 4. NotExist => label tidak boleh ada
===nginx-rs-match-expression.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
          - nginx
      - key: env
        operator: In
        values:
          - prod
          - qa
          - dev
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
        env: prod
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
===End===
----------------
#Daemon Set (Digunakan untuk menentukan di node mana pod berjalan, by default menjalankan pod di setiap node yang
#ada di kubernetes cluster)
===daemon-nginx.yaml===
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemon-nginx
  labels:
    name: daemon-nginx
spec:
  selector:
    matchLabels:
      name: daemon-nginx
  template:
    metadata:
      name: daemon-nginx
      labels:
        name: daemon-nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 0
            periodSeconds: 10
            failureThreshold: 3
            successThreshold: 1
            timeoutSeconds: 1
===End===
## kubectl get daemonsets (Melihat semua daemon set)
## kubectl delete daemonset namadaemonset (Menghapus daemon set)
----------------

#Job (Digunakan untuk menjalankan Pod yang hanya butuh berjalan sekali, lalu berhenti, contoh penggunaan seperti backup atau
#restore database, export atau import data, dll)
===job-nodejs.yaml===
apiVersion: batch/v1
kind: Job
metadata:
  name: nodejs-job
spec:
  completions: 4
  parallelism: 2
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: nodejs-job
          image: khannedy/nodejs-job
===End===
## kubectl get jobs (Melihat semua job)
## kubectl delete job namajob (Menghapus job)
## kubectl describe job namajob (Melihat detail job)
----------------

#Cron Job (Digunakan untuk menjalankan Pod yang berjalan sesuai dengan waktu yang di tentukan secara berulang-ulang, contoh
#penggunaan membackup data secara berkala)
===cronjob-nodejs.yaml===
apiVersion: batch/v1
kind: CronJob
metadata:
  name: nodejs-cronjob
  labels:
    name: nodejs-cronjob
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          name: nodejs-cronjob
          labels:
            name: nodejs-cronjob
        spec:
          restartPolicy: Never
          containers:
            - name: nodejs-cronjob
              image: khannedy/nodejs-job
===End===
## kubectl get cronjobs (Melihat semua cron job)
## kubectl delete cronjobs namacronjob (Menghapus cron job)
## kubectl describe cronjob namacronjob (Melihat detail cron jon)
----------------

#Node Selector (Memilih pod mau berjalan di node mana. contoh penggunaan kebutuhan khusus sepert GPU)
===nginx-node-selector.yaml===
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeSelector:
    ssd: "true"
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
===End===
## kubectl label node namanode key=value (Menambahkan label di node)
----------------

#ALL
## kubectl get all (Melihat semua resource di namespace default)
## kubectl get all --namespace namanamespace (Melihat semua resource di namespace tertentu)
## kubectl delete all --all (Menghapus semua resource di default namespace)
## kubectl delete all --all --namespace namanamespace (Menghapus semua resource di namespace tertentu)

#Service (Digunakan untuk membuat satu gerbang untuk mengakses satu pod atau lebih, service memiliki ip address dan
#port yg tidak pernah berubah selama service itu ada)
===service-nginx.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      name: nginx
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    name: nginx
  ports:
    - port: 8080
      targetPort: 80

---

apiVersion: v1
kind: Pod
metadata:
  name: curl
  labels:
    name: curl
spec:
  containers:
    - name: curl
      image: khannedy/nginx-curl
===End===
## kubectl get services (Melihat service)
## kubectl delete service namaservice (Menghapus service)
## kubectl exec nama-pod -it --/bin/bash (Mengakses service dari dalam cluster)
   curl http://cluster-ip:port/ (Contoh untuk web)
## kubectl exec nama-pod -- env (Melihat Environment Variable)
## nama-service.nama-namespace.svc.cluster.local (Mengakses service menggunakan DNS)
## kubectl get endpoints (Melihat semua endpoint)
## kubectl get endpoints nama-service (Melihat satu service endpoint)
## kubectl describe service nama-service (Melihat detail service)
-----------------

#External Service (Digunakan sebagai gateway untuk internal pod, bisa juga digunakan sebagai gateway untuk aplikasi eksternal yg
#berada di luar kubernetes cluster)
===service-example.yaml===
apiVersion: v1
kind: Service
metadata:
  name: example-service
  labels:
    name: example-service
spec:
  type: ExternalName
  externalName: example.com
  ports:
    - port: 80

---

apiVersion: v1
kind: Pod
metadata:
  name: curl
  labels:
    name: curl
spec:
  containers:
    - name: curl
      image: khannedy/nginx-curl
===End===
----------------

#Mengekspos Service (Digunakan untuk mengakses aplikasi dari luar cluster/public)
## Tipe service
   1. ClusterIP => Mengekspos service di dalam internal kubernetes cluster
   2. ExternalName => Memetakan service ke externalName (misal: example.com)
   3. NodePort => Mengekspos service pada setiap IP node dan port yang sama. Kita dapat mengakses service dengan tipe ini dari
      luar cluster melalui NodeIP:NodePort
   4. LoadBalancer => Mengekspos service secara eksternal dengan menggunakan LoadBalancer yg disediakan oleh penyedia layanan cloud
   5. Ingress => Mengekspos service menggunakan domain, ingress hanya mendukung protocol HTTP
===service-nginx-nodeport.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      name: nginx
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    name: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30001
==End===

===service-nginx-loadbalancer.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      name: nginx
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    name: nginx
  ports:
    - port: 80
      targetPort: 80
===End===

===cat service-nginx-ingress.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      name: nginx
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    name: nginx
  ports:
    - port: 80
      targetPort: 80

---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  labels:
    name: nginx-ingress
spec:
  rules:
    - host: nginx.khannedy.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service
                port:
                  number: 80
===End===
## minikube service nama-service (Melihat NodePort di minikube)
## kubectl get ingresses (Melihat ingress)
## kubectl delete ingress namaingress (Mengapus ingress)
## minikube ip (Untuk melihat IP minikube)
----------------

#Multi Container Pod
===multi-container-pod.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      name: nginx
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
        - name: nodejs-web
          image: khannedy/nodejs-web
          ports:
            - containerPort: 3000

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    name: nginx
  ports:
    - port: 8080
      targetPort: 80
      name: nginx
    - port: 3000
      targetPort: 3000
      name: nodejs-web

---

apiVersion: v1
kind: Pod
metadata:
  name: curl
  labels:
    name: curl
spec:
  containers:
    - name: curl
      image: khannedy/nginx-curl
===End===
----------------

#Volume
## Jenis Volume
   1. emptyDir => Direktori sederhana yang kosong (note: pod mati folder kosong kembali, utk test)
   2. hostPath => Digunakan untuk men-sharing direktori di node ke pod
   3. gitRepo => Direktori yang dibuat pertama kali dengan meng-clone git repository
   4. nfs => Sharing network file system
   5. dll
===volume.yaml===
apiVersion: v1
kind: Pod
metadata:
  name: nodejs-writer
  labels:
    name: nodejs-writer
spec:
  volumes:
    - name: html
      emptyDir: {}
  containers:
    - name: nodejs-writer
      image: khannedy/nodejs-writer
      volumeMounts:
        - mountPath: /app/html
          name: html
===End===
----------------

#Sharing Volume
===sharing-volume.yaml===
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      name: nginx
      labels:
        name: nginx
    spec:
      volumes:
        - name: html
          emptyDir: {}
      containers:
        - name: nodejs-writer
          image: khannedy/nodejs-writer
          volumeMounts:
            - mountPath: /app/html
              name: html
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
          volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: html

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    name: nginx
  ports:
    - port: 8080
      targetPort: 80
      nodePort: 30001
===End===
----------------

#Environment Variable (Digunakan untuk konfigurasi aplikasi seperti konfig database dll)
===environment-variable.yaml===
apiVersion: v1
kind: Pod
metadata:
  name: nodejs-writer
  labels:
    name: nodejs-writer
spec:
  volumes:
    - name: html
      emptyDir: {}
  containers:
    - name: nodejs-writer
      image: khannedy/nodejs-writer
      volumeMounts:
        - mountPath: /app/folder-from-env
          name: html
      env:
        - name: HTML_LOCATION
          value: /app/folder-from-env
===End===
----------------

#Config Map (Digunakan untuk memisahkan konfigurasi contohnya environment di dev, prod, dll)
===configmap.yaml===
apiVersion: v1
kind: ConfigMap
metadata:
  name: nodejs-env-config
data:
  APPLICATION: My Cool Application
  VERSION: 1.0.0

---

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nodejs-env
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-env
  template:
    metadata:
      name: nodejs-env
      labels:
        name: nodejs-env
    spec:
      containers:
        - name: nodejs-env
          image: khannedy/nodejs-env
          ports:
            - containerPort: 3000
          envFrom:
            - configMapRef:
                name: nodejs-env-config

---

apiVersion: v1
kind: Service
metadata:
  name: nodejs-env-service
spec:
  type: NodePort
  selector:
    name: nodejs-env
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001
==End===
## kubectl get configmaps (Melihat configmap)
## kubectl describe configmap namaconfigmap (Melihat detail configmap)
## kubectl delete configmap namaconfigmap (Mengapus configmap)
----------------

#Secret (Digunakan untuk konfigurasi yang bersifat sensitif seperti username, password dll)
===secret.yaml===
apiVersion: v1
kind: ConfigMap
metadata:
  name: nodejs-env-config
data:
  APPLICATION: My Cool Application

---

apiVersion: v1
kind: Secret
metadata:
  name: nodejs-env-secret
stringData:
  VERSION: 1.0.0

---

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nodejs-env
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-env
  template:
    metadata:
      name: nodejs-env
      labels:
        name: nodejs-env
    spec:
      containers:
        - name: nodejs-env
          image: khannedy/nodejs-env
          ports:
            - containerPort: 3000
          envFrom:
            - configMapRef:
                name: nodejs-env-config
            - secretRef:
                name: nodejs-env-secret

---

apiVersion: v1
kind: Service
metadata:
  name: nodejs-env-service
spec:
  type: NodePort
  selector:
    name: nodejs-env
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001
===End===
## kubectl get secrets (Melihat secret)
## kubectl describe secrets namasecret (Melhat detail secret)
## kubectl delete secret namasecret (Menghapus secret)

#Downward API (Digunakan untuk  mengambil informasi seputar pod dan node melalui environment variable)
## metadata
   1. requests.cpu => Jumlah CPU yang di request
   2. requests.memory => Jumlah memory yang di request
   3. limits.cpu => Jumlah limit maksimal CPU
   4. limits.memory => Jumlah limit maksimal memory
   5. metadata.name => Nama pod
   6. metadata.namespace => Namespace pod
   7. metadata.uid => Id pod
   8. metadata.labels['<KEY>'] => Label pod
   9. metadata.annotation['<KEY>'] => Annotationpod
   10. status.podIP => IP address pod
   11. spec.serviceAccountName => Nama service account pod
   12. spec.nodeName => Nama node
   13. status.hostIP => IP address node
===downward-api.yaml===
apiVersion: v1
kind: ConfigMap
metadata:
  name: nodejs-env-config
data:
  APPLICATION: My Cool Application
  VERSION: 1.0.0

---

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nodejs-env
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-env
  template:
    metadata:
      name: nodejs-env
      labels:
        name: nodejs-env
    spec:
      containers:
        - name: nodejs-env
          image: khannedy/nodejs-env
          ports:
            - containerPort: 3000
          envFrom:
            - configMapRef:
                name: nodejs-env-config
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: POD_NODE
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: POD_NODE_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
---

apiVersion: v1
kind: Service
metadata:
  name: nodejs-env-service
spec:
  type: NodePort
  selector:
    name: nodejs-env
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001
===End===
----------------

#Manage Kubernetes Object
## Imperative Management
   1. kubectl create -f namafile.yaml => Membuat kubernetes object
   2. kubectl replace -f namafile.yaml => Mengupdate kubernetes obejct
   3. kubectl get -f namafile.yaml -o yaml/json => Melihat kubernetes obejct
   4. kubectl delete -f namafile.yaml => Menghapus kubernetes obejct
## Declarative Management
   1. kubectl apply -f namafile.yaml => Membuat atau mengupdate kubernetes object
   
#Deployment (yaitu resource utk melakukan deployment aplikasi dan update aplikasi secara declarative menggunakan file konfigurasi)
===deployment.yaml===
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-web
  labels:
    name: nodejs-web
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-web
  template:
    metadata:
      name: nodejs-web
      labels:
        name: nodejs-web
    spec:
      containers:
        - name: nodejs-web
          image: khannedy/nodejs-web:1
          ports:
            - containerPort: 3000

---

apiVersion: v1
kind: Service
metadata:
  name: nodejs-web-service
spec:
  type: NodePort
  selector:
    name: nodejs-web
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001
===End===
## kubectl apply -f deployent.yaml (Membuat/update deployment)
## kubectl get deployments (Melihat semua deployment)
## kubectl describe deployment namadeployment (Melihat detail deployment)
----------------

#Deployment update
===deployment-update.yaml===
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-web
  labels:
    name: nodejs-web
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-web
  template:
    metadata:
      name: nodejs-web
      labels:
        name: nodejs-web
    spec:
      containers:
        - name: nodejs-web
          image: khannedy/nodejs-web:2
          ports:
            - containerPort: 3000
===End===
----------------

#RollBack Deployment
## Kubernetes RollOut
   1. kubectl rollout history object name(deployment, dll) => Melihat history rollout
   2. kubectl rollout pause object name(deployment, dll) => Menandai sebagai pause
   3. kubectl rollout resume object name(deployment, dll) => Resume pause
   4. kubectl rollout restart object name(deployment, dll) => Merestart rollout
   5. kubectl rollout status object name(deployment, dll) => Melihat status rollout
   6. kubectl rollout undo object name(deployment, dll) => Undo ke rollout sebelumnya
## kubectl rollout undo deployment deployment.yaml (rollback aplikasi ke versi sebelumnya)  
===deployment-update-again.yaml===
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-web
  labels:
    name: nodejs-web
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-web
  template:
    metadata:
      name: nodejs-web
      labels:
        name: nodejs-web
    spec:
      containers:
        - name: nodejs-web
          image: khannedy/nodejs-web:3
          ports:
            - containerPort: 3000
===End===
----------------

#Persistent Volume (flow: Create persistent volume -> claim -> use to pod)
## kubectl get pv (Melihat persistent volume)
## kubectl describe pv namapv (Melihat detail persistent volume)
## kubectl delete pv namapv (Menghapus persistent volume)
## kubectl get pvc (Melihat persistent volume claim)
## kubectl describe pvc namapvc (Melhat detail peristent volume claim)
## kubectl delete pvc namapvc (Menghapus persistent volume claim)
===persistent-volume.yaml===
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nodejs-writer-volume
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  hostPath:
    path: /data/location

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nodejs-writer-volume-claim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi

---

apiVersion: v1
kind: Pod
metadata:
  name: nodejs-writer
  labels:
    name: nodejs-writer
spec:
  volumes:
    - name: html
      persistentVolumeClaim:
        claimName: nodejs-writer-volume-claim
  containers:
    - name: nodejs-writer
      image: khannedy/nodejs-writer
      volumeMounts:
        - mountPath: /app/html
          name: html
===End===
----------------

#Statefulset (adalah object di kubernetes untuk memanage aplikasi jenis stateful)
## kubectl get statefulsets (Melihat statefulset)
## kubectl describe statfulset namastatefulset (Melihat detail statefulset)
## kubectl delete statefulset namastatefulset (Menghapus statefulset)
===statefulset.yaml===
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nodejs-stateful-volume
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  hostPath:
    path: /data/location

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nodejs-stateful
  labels:
    name: nodejs-stateful
spec:
  # https://github.com/kubernetes/kubernetes/issues/69608
  serviceName: nodejs-stateful-service
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-stateful
  volumeClaimTemplates:
    - metadata:
        name: nodejs-stateful-volume-claim
      spec:
        accessModes:
          - ReadWriteOnce
        volumeMode: Filesystem
        resources:
          requests:
            storage: 1Gi
  template:
    metadata:
      name: nodejs-stateful
      labels:
        name: nodejs-stateful
    spec:
      containers:
        - name: nodejs-stateful
          image: khannedy/nodejs-stateful
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          volumeMounts:
            - mountPath: /app/data
              name: nodejs-stateful-volume-claim
==End===
----------------

#Kubernetes Dashboard
## minikube addons enable dashboard (Enable dashboard)
## minikube dashboard (Membuka dashboard)
----------------

#Computational Resources (Limit cpu dan memory)
===resources.yaml===
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-web
  labels:
    name: nodejs-web
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nodejs-web
  template:
    metadata:
      name: nodejs-web
      labels:
        name: nodejs-web
    spec:
      containers:
        - name: nodejs-web
          image: khannedy/nodejs-web
          ports:
            - containerPort: 3000
          resources:
            requests:
              cpu: 1000m
              memory: 1000Mi
            limits:
              cpu: 1000m
              memory: 1000Mi

---

apiVersion: v1
kind: Service
metadata:
  name: nodejs-web-service
spec:
  type: NodePort
  selector:
    name: nodejs-web
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001
==End===
----------------

#Horizontal Pod Autoscaler (Scaling otomatis secara horizontal dengan cara menambah pod baru dan menurunkan secara otomatis jika
#di perlukan)
## minikube addons enable metrics-server (Enable metrics server)
## kubectl get hpa (Melihat hpa)
## kubectl describe hpa namahpa (Melihat detail hpa)
## kubectl delete hpa namahpa (Menghapus hpa)
===horizontal-pod-autoscaler.yaml===
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-web
  labels:
    name: nodejs-web
spec:
  selector:
    matchLabels:
      name: nodejs-web
  template:
    metadata:
      name: nodejs-web
      labels:
        name: nodejs-web
    spec:
      containers:
        - name: nodejs-web
          image: khannedy/nodejs-web:1
          ports:
            - containerPort: 3000

---

apiVersion: v1
kind: Service
metadata:
  name: nodejs-web-service
spec:
  type: NodePort
  selector:
    name: nodejs-web
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001

---

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-name
spec:
  minReplicas: 3
  maxReplicas: 5
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nodejs-web
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 70
===End===

Source: PZN
Note: Hanya sebagai catatan saya
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg
Postingan Lama Beranda

Popular Posts

  • Install zenchain node di Ubuntu-Linux (self-host node)
      Install zenchain node di Ubuntu-Linux (self-host node)   #Buat wallet baru di metamask dan import ke OKX juga (EVM) #WL di web (supa...
  • Install 0GDA Node & Client di Ubuntu-Linux
    Install 0GDA Node & Client di Ubuntu-Linux Spec vps CPU 8 core RAM 16 GB Contabo spec VPS-3 #Buat Wallet EVM (buat di OKX simpan p...
  • Install PWR node di Linux-Ubuntu
    Install PWR Node DC PWR: https://discord.com/invite/Mu3ktCk4 #Update paket sudo su apt update #Install java apt install openjdk-19-jre-headl...
  • INSTALL CHASM NODE DI LINUX/UBUNTU
      INSTALL CHASM DI LINUX/UBUNTU   #Buka web https://console.groq.com/keys   | daftar #Jika sudah daftar, buat api di https://console.g...

LABELS

  • AWS
  • Cisco
  • Cloud
  • Desktop
  • DevOps
  • Mikrotik
  • Network
  • Nginx
  • node2an
  • Proxmox
  • Server
  • Tools
  • VirtualBox
  • Zimbra

Sosial Media

Facebook 35.4Fans
Twitter 519Followers
Instagram 1060Followers
google+ 16Followers
Youtube 24Subscriber

Widget

  • Home
  • About Us
  • Contact Us

Copyright © Tutorial & Configuration