Skip to main content
  1. Posts/

Setup Kubernetes Cluster dengan Kubeadm dan cri-dockerd

·6 mins·
kubernetes docker kubernetes
Table of Contents

Panduan ini akan membahas cara membangun kubernetes cluster dengan kubeadm.

Kubeadm merupakan alat untuk membantu menyiapkan kluster kubernetes yang dapat berfungsi dalam waktu yang lebih singkat.

Kubeadm Setup Prerequisites
#

Simulasi ini memerlukan setidaknya 2 VM, 1 sebagai master dan 1 lagi sebagai worker dengan ketentuan seperti berikut.

  • Master node minimal memilki 2 vCPU dan RAM 2GB
  • Worker node minimal 1vCPU dan 2 GB RAM

Enable iptables Bridged Traffic
#

Eksekusi perintah berikut pada semua node.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

Selanjutnya install package.

yum -y install vim bash-completion wget curl yum-utils lvm2 device-mapper-persistent-data iproute-tc

Install Docker Engine Runtime
#

Kluster kubernetes membutuhkan setidaknya satu dari container runtime seperti berikut.

  • CRI-O
  • Containerd
  • Docker Engine (using cri-dockerd)

Pada simulasi ini akan menggunakan Docker Engine.

Eksekusi perintah berikut pada semua node

Install docker.

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

Lalu install cri-dockerd.

yum -y install https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el8.x86_64.rpm

Setting driver cgroup dengan membuat file /etc/docker/daemon.json lalu salin konfigurasi berikut.

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "insecure-registries": [
     "k8s.gcr.io",
     "docker.io",
     "quay.io",
     "registry.access.redhat.com"
  ]
}

Start dan enable service docker cri-docker

systemctl enable --now docker cri-docker

Install Kubeadm & Kubelet & Kubectl
#

Eksekusi setiap langkah dibawah ini pada semua node

Buat file repo /etc/yum.repos.d/kubernetes.repo lalu edit seperti berikut.

[kubernetes]
name=Kubernetes
baseurl=http://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl

Konfig exclude membuat package tidak dapat diupdate secara langsung sehingga versi kubeadm dengan container runtime tetap sama.

Selanjutnya install kubelet, kubeadm, kubectl

yum -y --disableexcludes=kubernetes install kubelet kubeadm kubectl cri-tools-1.26.0-0

Enable kubelet service

systemctl enable kubelet

Initialize Kubeadm Master Node
#

Setting environment berikut dan ganti bagian IPADDR dengan IP Master node

IPADDR="192.168.100.11"
NODENAME=$(hostname -s)
POD_CIDR="10.10.0.0/16"

Setup master node sebagai control plane

kubeadm init --apiserver-advertise-address=$IPADDR \
--apiserver-cert-extra-sans=$IPADDR \
--pod-network-cidr=$POD_CIDR --node-name $NODENAME \
--control-plane-endpoint control-plane.srv1.host \
--cri-socket /run/cri-dockerd.sock

Pastikan control-plane.srv1.host sudah disetting A record ke IP master node. Jika tidak memiliki DNS local maka opsi –control-plane-endpoint tidak perlu dipakai. {: .prompt-tip }

Setelah proses init selesai, Anda akan mendapatkan output berserta lokasi file kubeconfig dan perintah join untuk dieksekusi pada Worker node.

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.100.11:6443 --token owlp40.q6v9qu0yik7zucks \
        --discovery-token-ca-cert-hash sha256:59b3839365a47f92c81d038c6c5cede20cb575828819b7a45edd8934c9936cab

Simpan output tersebut untuk digunakan ketika menghubungkan control plane ke worker.

Selanjutnya jalankan perintah berikut agar kubectl dapat berinteraksi dengan cluster API

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

Atau bisa juga dengan cara alternatif seperti

export KUBECONFIG=/etc/kubernetes/admin.conf

Verifikasi kubeconfig dengan menjalankan perintah kubectl pada namespace kube-system

kubectl get pods -n kube-system
NAME                          READY   STATUS    RESTARTS   AGE
coredns-5d78c9869d-gjpfr      1/1     Running   0          20m
coredns-5d78c9869d-xwt74      1/1     Running   0          20m
etcd-man                      1/1     Running   1          20m
kube-apiserver-man            1/1     Running   1          20m
kube-controller-manager-man   1/1     Running   1          20m
kube-proxy-92w5l              1/1     Running   0          20m
kube-scheduler-man            1/1     Running   1          20m

Untuk cek status health cluster

kubectl get --raw='/readyz?verbose'

Cek info cluster

kubectl cluster-info

Cek pods di semua namespace

kubectl get pods -A

Cek logs pods

kubectl logs -n kube-system kube-controller-manager-man

Cek events pods

kubectl get events -n kube-system

Masuk ke mode terminal container

kubectl exec -it -n kube-system pod/etcd-man -- bash

Install flannel Network Plugin
#

Setelah membuat cluster dengan kubeadm. Selanjutnya Anda dapat men-deploy network pod ke cluster.

Untuk referensi plugin network dan plugin lain dapat Anda cek melalui Addon Kubernetes

Unduh manifest flannel

wget https://github.com/flannel-io/flannel/releases/download/v0.22.0/kube-flannel.yml

Edit network 10.244.0.0/16 menyesuaikan POD_CIDR.

  net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

Deploy flannel network plugin ke cluster

kubectl apply -f kube-flannel.yml

Tunggu beberapa saat lalu cek pods pada namespace kube-system untuk memastikan flannel sudah berhasil di-deploy.

# kubectl get pods -n kube-flannel
NAME                    READY   STATUS    RESTARTS     AGE
kube-flannel-ds-9r9f5   1/1     Running   1 (9h ago)   9h

Join Worker Nodes To Kubernetes Master Node
#

Untuk menambahkan worker ke master node, gunakan perintah join yang Anda dapat setelah membuat cluster dengan kubeadm.

kubeadm join 192.168.100.11:6443 --token owlp40.q6v9qu0yik7zucks \
--discovery-token-ca-cert-hash sha256:59b3839365a47f92c81d038c6c5cede20cb575828819b7a45edd8934c9936cab

Jika Anda kehilangan token atau lupa menyalinnya. Anda dapat membuat token dengan perintah

kubeadm token create --print-join-command
kubeadm join 192.168.100.11:6443 --token ryrezn.kj86cqm9p39wlmb0 \
--discovery-token-ca-cert-hash sha256:1edc1ac23b1cf0ff3b00742de1f7d894f19286a19acf6a1a692a74f057e48732

Cek node pada cluster kubernetes

kubectl get nodes
NAME        STATUS   ROLES           AGE     VERSION
man         Ready    control-plane   173m    v1.27.3
worker1     Ready    <none>          2m23s   v1.27.3

Roles <none> sama dengan role worker. Anda juga dapat menabambahkan label untuk menandai jika node tersebut merupakan worker dengan perintah

kubectl label node worker1 node-role.kubernetes.io/worker=worker
NAME        STATUS   ROLES           AGE     VERSION
man         Ready    control-plane   3h      v1.27.3
worker1     Ready    worker          9m10s   v1.27.3

Setup Kubernetes Metrics Server
#

Kubernetes Metrics Server berfungsi untuk mengetahui pemakaian resource pada setiap nodes dan pods.

Untuk install metric server

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yaml

Selanjutnya edit pod metric server dengan menambahkan konfig hostNetwork dan --kubelet-insecure-tls

KUBE_EDITOR="nano" kubectl edit \
-n kube-system \
-f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yaml
- apiVersion: apps/v1
  kind: Deployment
  metadata:
...
      spec:
        hostNetwork: true
        containers:
        - args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
          - --kubelet-use-node-status-port
          - --metric-resolution=15s
          - --kubelet-insecure-tls=true
...

Edit pod metric apabila Anda mendapatkan error because it doesn’t contain any IP SANs" node="" yang menyebabkan pod tidak ready. {: .prompt-tip }

Tunggu pod metric server ready. Lalu coba test dengan perintah

kubectl top node
kubectl top pods -A

Deploy A Sample Nginx Application
#

Setelah semua komponen untuk membuat klaster kubernetes sudah di-deploy dan berfungsi. Selanjutnya buat sampel aplikasi dengan menggunakan Nginx untuk pengetesan.

Buat file deployment.yaml. Edit seperti berikut

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

Lalu buat file service.yaml dan edit untuk mengekspos Nginx deployment ke external IP.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  allocateLoadBalancerNodePorts: true
  externalIPs:
  - 172.12.70.129
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31460
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer: {}

External IP yang akan digunakan harus terpasang pada interface salah satu node didalam cluster {: .prompt-tip }

Deploy ke dalam cluster

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Contoh full script dapat Anda temukan pada sample-app.yaml

Setelah pods running di node worker. Test akses nginx melalui http://172.12.70.129

Reset Cluster
#

Untuk reset atau menghapus cluster agar dapat dimulai dari awal (‘kubeadm init’ or ‘kubeadm join’)

kubeadm reset -f

Related

Setup Kubernetes Cluster dengan Kubeadm dan cri-o
·6 mins
kubernetes kubernetes crio
Deploy Pod ke Node Tertentu
·2 mins
kubernetes kubernetes
Kubectl Cheat Sheet
·14 mins
kubernetes kubernetes
Kubernetes Internal Errors: Failed Calling Webhook
·1 min
kubernetes kubernetes
Setup Nginx Ingress Controller On Kubernetes
·2 mins
kubernetes kubernetes
Kombinasikan Beberapa Middleware dengan Middleware Chain
·1 min
traefik traefik docker