Kubeadm ile Kubernetes Cluster kurulumu…

NAME                STATUS   ROLES                  AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
kubernetes-master   Ready    control-plane,master   122m   v1.26.1   10.10.10.113  <none>        Ubuntu 22.04 LTS     5.4.0-97-generic   containerd://1.6.9
kubernetes-node01   Ready    <none>                 115m   v1.26.1   10.10.10.114  <none>        Ubuntu 22.04 LTS     5.4.0-97-generic   containerd://1.6.9
kubernetes-node02   Ready    <none>                 115m   v1.26.1   10.10.10.115  <none>        Ubuntu 22.04 LTS     5.4.0-97-generic   containerd://1.6.9

1- Tüm Node‘ler de çalıştırılmalıdır.

sudo vim /etc/hosts

10.10.10.113 kubernetes-master
10.10.10.114 kubernetes-node01
10.10.10.115 kubernetes-node02

Tüm hostlarda çalıştırılır, $USER aktif kullanıcı ile değiştirilir.

sudo echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/$USER

Özellikle Master/s makinelerinde ssh key dağıtılmalıdır ama tüm makineler arası çalıştırılmasında fayda var.

ssh-keygen

ssh-copy-id $USER@10.10.10.113
ssh-copy-id $USER@10.10.10.114
ssh-copy-id $USER@10.10.10.115

Gerekli paketleri kuralım.

sudo apt update && sudo apt -y install curl apt-transport-https vim git wget gnupg2 software-properties-common ca-certificates chrony

Ntp server değiştirilir.

sudo vi /etc/chrony/chrony.conf
#pool ntp.ubuntu.com        iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
server $NTP_SERVER_IP iburst
sudo systemctl restart chrony.service

Akabinde swap alanını kapatalım ama her makine reboot olduğunda bu işlem gerekli, en geçerli yöntem swap‘sız makine kurulumudur.

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

Şimdi container runtime kurulumu yapacağız. Alternatifler containerd, docker ve cri-o‘dur fakat kubernetes dockershim deprecation yaptığı için biz containerd yapacağız, zaten default olarak containerd geliyor.

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

Containerd‘yi güncel olması için(aksi takdirde daha kubernetes image‘leri pull ederken versiyon uyumsuzluğundan hata alacaksınızhttps://containerd.io/releases) docker reposunu kullanarak kuracağız, yanlış anlaşılmasın docker kurulumu yapmayacağız, isterseniz manual olarak da containerd ve runc‘yi kurabilirsiniz. https://github.com/containerd/containerd/blob/main/docs/getting-started.md linkinden faydalanabilirsiniz.

sudo sysctl --system

sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update && sudo apt install -y containerd.io

sudo mkdir -p /etc/containerd

sudo containerd config default | sudo tee /etc/containerd/config.toml

sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

sudo systemctl restart containerd.service

Bu arada container runtime Unix domain socket yolları aşağıdaki gibidir.

Docker      > /var/run/docker.sock
Containerd  > /run/containerd/containerd.sock
Cri-o       > /var/run/crio/crio.sock

Şimdi ise kubernetes paketlerini kuralım.

sudo mkdir -p /etc/apt/keyrings

sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update
sudo apt -y install kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

kubectl version --client && kubeadm version

Kubectl autocompletion enable yapalım.

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null

2- Sadece Master Node‘sinde çalıştırılmalıdır.

Optional olarak aşağıdaki komutla cluster için gereken imajları download edebilirsiniz fakat yapmazsanızda kurulum esnasında uygulama yapacaktır.

sudo kubeadm config images pull

Bu aşamada POD Network‘ünü de oluşturacağız. Alternatifler Calico, Canal, Flannel, Romana ve Weave‘dir. Biz Calico kurulumu yapacağız. Kubeadm init ile Cluster‘ı oluştururken bunu(–pod-network-cidr) dikkate alacağız.

#calico.yaml dosyasındaki ip bilgisine uygun olarak, bir pod network range'i belirleyerek kubernetes cluster'ımızı oluşturabiliriz,
#subneti "vi calico.yaml" ile değiştirmek istersek, aşağıdaki komutta da ilgili subneti belirtmeliyiz.

curl https://docs.projectcalico.org/manifests/calico.yaml -O

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

Çıktı aşağıdaki gibi olmalıdır. Hem aşağıdaki adımları takip edeceğiz hem de kubeadm join ile cluster‘a yeni node‘ler ekleyeceğiz.

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 10.10.10.113:6443 --token 6sdzxn.pvgby7g42xq59mfb \
	--discovery-token-ca-cert-hash sha256:c4de5f8322be732828565761ed82274d31f282591017b64ef70891f00bc838a8

Hemen yapalım.

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

#export KUBECONFIG=/etc/kubernetes/admin.conf olarak direk çalıştırmıyorum çünkü permission hatası alırım,
export KUBECONFIG=.kube/config
sudo systemctl status kubelet.service

Hemen calico‘yu da deploy edelim. Dosyayı yukarda indirmiştik ve cluster‘ı ona göre init etmiştik.

kubectl apply -f calico.yaml

Kubeconfig dosyasinin bulundugu dizin, manifestleri, api-server ve etcd‘nin manifestlerini incelemek isterseniz,

ls /etc/kubernetes
ls /etc/kubernetes/manifests
sudo more /etc/kubernetes/manifests/etcd.yaml
sudo more /etc/kubernetes/manifests/kube-apiserver.yaml

Cluster‘ı gözlemleyebilirsiniz.

kubectl cluster-info

kubectl get pods -A [--watch]

kubectl get nodes -o wide

#Master'da init sürecinde token bilgisi verilmisti eğer not almadıysanız aşağıdaki komut ile master node üerinden token'ınızı listeleyebilirsiniz,
kubeadm token list

#Var olan token'ı kaydetmediyseniz, elde etmek için,
kubeadm token create --print-join-command

#Master uzerinden ca cert hash'i elde etmek için,
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

3- Sadece Worker None‘sinde çalıştırılmalıdır.

Yukarıda master node‘yi oluştururken elde ettiğimiz ya da not almadıysak var olan token‘ı tekrar elde ettiğimiz komut vasıtasıyla worker node‘leri cluster‘a dahil edelim.

#sudo kubeadm join <ip>:6443 --token <token> --discovery-token-ca-cert-hash <ca_cert_hash>

sudo kubeadm join 10.10.10.113:6443 --token 6sdzxn.pvgby7g42xq59mfb \
	--discovery-token-ca-cert-hash sha256:c4de5f8322be732828565761ed82274d31f282591017b64ef70891f00bc838a8

Tekrar cluster‘ın durumunu gözlemleyebilirisiniz.

Son olarak bashrc‘yi edit‘leyerek aşağıdaki satırları ilgili node‘lere ekleyelim.

sudo vi .bashrc

Tüm Node

swapoff -a

Sadece MASTER/S Node

swapoff -a
export KUBECONFIG=.kube/config

NoT : Ek bilgi

kubeadm init parametreleri:
–control-plane-endpoint : set the shared endpoint for all control-plane nodes. Can be DNS/IP
–pod-network-cidr : Used to set a Pod network add-on CIDR
–cri-socket : Use if have more than one container runtime to set runtime socket path
–apiserver-advertise-address : Set advertise address for this particular control-plane node’s API server

Örnek olarak 3 ya da daha fazla Master Node‘yi Haproxy ve Keepalived aracılığı ile eklemek isterseniz kubeadm init‘i aşağıdaki gibi çalıştırmalısınız.

Yani –control-plane-endpoint adresi belirlediğiniz vrrp olacak, –apiserver-advertise-address ip‘si de ilk master node‘nizin ip‘sini yazabilirsiniz.

sudo kubeadm init --control-plane-endpoint="10.10.10.200:6443" --apiserver-advertise-address=10.10.10.113 --pod-network-cidr=192.168.0.0/16 --upload-certs

ya da

sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --pod-network-cidr=192.168.0.0/16 --upload-certs

Init sürecinde herhangi bir hata almanız halinde aşağıdaki komutu yürüterek init‘i tekrar başlatabilirsiniz.

sudo kubeadm reset

Bu vesileyle ortama Haproxy ve Keepalived dahil ederseniz, haproxy için yapabileceğiniz yapılandırmayı da eklemiş olalım.

frontend kubelets
        bind k8s-fatlan.com:10250
        mode tcp
        default_backend kubelet

frontend kubeproxys
        bind k8s-fatlan.com:10256
        mode tcp
        default_backend kubeproxy

frontend kubeapis
        bind k8s-fatlan.com:6443
        mode tcp
        default_backend kubeapi

backend kubelet
        mode tcp
        option tcplog
        option tcp-check
        balance roundrobin
        server kube-cluster-kubelet-01 10.1.10.52:10250 check port 10250 inter 3000 rise 2 fall 3
        server kube-cluster-kubelet-02 10.1.10.53:10250 check port 10250 inter 3000 rise 2 fall 3
        server kube-cluster-kubelet-03 10.1.10.54:10250 check port 10250 inter 3000 rise 2 fall 3

backend kubeproxy
        mode tcp
        option tcplog
        option tcp-check
        balance roundrobin
        server kube-cluster-kubeproxy-01 10.1.10.52:10256 check port 10256 inter 3000 rise 2 fall 3
        server kube-cluster-kubeproxy-02 10.1.10.53:10256 check port 10256 inter 3000 rise 2 fall 3
        server kube-cluster-kubeproxy-03 10.1.10.54:10256 check port 10256 inter 3000 rise 2 fall 3

backend kubeapi
        mode tcp
        option tcplog
        option tcp-check
        balance roundrobin
        server kube-cluster-kubeapi-01 10.1.10.52:6443 check port 6443 inter 3000 rise 2 fall 3
        server kube-cluster-kubeapi-02 10.1.10.53:6443 check port 6443 inter 3000 rise 2 fall 3
        server kube-cluster-kubeapi-03 10.1.10.54:6443 check port 6443 inter 3000 rise 2 fall 3