Kubernetes Kurulumu

Kurulum esnasında dört adet ubuntu kullanacağım. Bir sunucum control plane master rolüne sahip olacak, 3 sunucumda worker modda, clusterimizin üyeleri olacaklar.

Öncelikle Swap alanını disable ederek işlemlerimize başlayalım, fstab düzenlenerek swap satırı silinip ya da kullanılamaz hale getirelim.

swapoff -a

fstab alanını açıp swap dizinini # ile kapatıp kullanılamaz hale getirip ya da o satırı tamamen silelim.

vi /etc/fstab

Containerd için gereli olan paketlerin kurulumunu yapalım ve bu paketlerin boot esnasında aktif olması için işlemleri gerçekleştirelim.

https://kubernetes.io/docs/setup/production-environment/container-runtimes/
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

Kurulum için gerekli sysctl parametreleri, bunlar yeniden başlatmalar boyunca devam eder.

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

Yeniden başlatmadan sysctl parametrelerini uygulayalım,

sudo sysctl --system

Containerd kurulumunu gerçekleştirelim,

sudo apt-get update 
sudo apt-get install -y containerd

Containerd için konfigurasyon dosyasını oluşturalım,

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

containerd için grup sürücüsünü kubelet için gerekli olan systemd olarak ayarlayın.

Bu yapılandırma dosyası hakkında daha fazla bilgi için bkz.

# https://github.com/containerd/cri/blob/master/docs/config.md and also
# https://github.com/containerd/containerd/blob/master/docs/ops.md
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]

alanının altına aşağıdaki satırı ekleyelim bunun için sed komutunu kullanabiliriz.

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            SystemdCgroup = true
sudo sed -i 's/            SystemdCgroup = false/            SystemdCgroup = true/' /etc/containerd/config.toml

Değişikliğin olduğunu kontrol edelim,

sudo vi /etc/containerd/config.toml

Containerd uygulamasını yeni konfigurasyon ile restart edelim,

sudo systemctl restart containerd

Kubernetes paketlerini kuralım. kubeadm, kubelet ve kubectl

Google apt reposundan gpg keyini ekleyelim,

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

Kubernetes apt reposunu ekleyelim,

sudo bash -c 'cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF'

Paket listesini güncelleyelim ve repo da bulunan sürümleri incelemek için apt-cache politikasını kullanalım,

sudo apt-get update
apt-cache policy kubelet | head -n 20 

Gerekli paketleri kuralım, gerekirse belirli bir sürümü yukarıdaki çıktıdan belirtip kurabiliriz. Bir kaç alt sürümü yükleyeceğim çünkü bir sonraki bölümlerde bunun update işlemini de ele alabiliriz.

VERSION=1.22.4-00
sudo apt-get install -y kubelet=$VERSION kubeadm=$VERSION kubectl=$VERSION
sudo apt-mark hold kubelet kubeadm kubectl containerd

Kubelet ve containerd servisinin durumunu sorgulayalım ve bir sonraki rebootta servisin direk enable olarak gelmesi için aksiyon alalım, kubelet.service çalışmıyorsa zorlmaya gerek yok, control plane nodu kurulduktan sonra kendisine gelecektir 🙂

sudo systemctl status kubelet.service 
sudo systemctl status containerd.service 

Bir sonraki rebootta servislerin otomatik şekilde açılması için,

sudo systemctl enable kubelet.service
sudo systemctl enable containerd.service

Control plane Node kurulumu,

Containerd kullanıyorsanız, docker’ın kurulu olmadığından emin olun. kubeadm init, container servisini kendisi algılamaya çalışacak. Eğer hem containerd hemde docker kurulu ise varsayılan olarak dockeri seçecektir.

Kubernetes clusterımızı oluşturalım, calico.yaml’dekiyle eşleşen bir pod ağ aralığı belirlememiz gerekmekte ve bu ağ aralığı local networkümüzle karışmamasına dikkat edelim.. Calico yaml dosyasını sadece Control plane nodu üzerinde çalıştıralım.

wget https://docs.projectcalico.org/manifests/calico.yaml

calico.yaml içine bakın ve Pod Ağı IP adres aralığı CALICO_IPV4POOL_CIDR satırını bulun, POD network aralığının local networkünüz ile aynı olmadığına dikkat edelim aynı ise değiştirelim.

vi calico.yaml

Konfigurasyonların uygulanması için kubeadm init komutunu çalıştırarak işlemlerimizi başlatabiliriz.

kubeadm 1.22 versiyonu ile birlikte –config=ClusterConfiguration.yaml ve –cri-socket /run/containerd/containerd.sock parametrelerini kullanmamıza gerek kalmadı. 1.22 ile bu parametreler kaldırılmıştır.

sudo kubeadm init

Ayrıcalıklı olmayan bir hesaptan API sunucusuna yönetici erişimine sahip olmak için Control Plane Node hesabımızı yapılandıralım.

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

Pod Network oluşturma, Yaml dosyamızı kullanarak ilgili pod networkünü oluşturalım,

kubectl apply -f calico.yaml

Sistem ve calico podlarının running olarak çalışır hale geldiğini gözlemleyelim, DNS podu, Pod Network running olmadan çalışır duruma gelmez, pendingde beklemeye devam eder.

kubectl get pods --all-namespaces

Ekranı her seferinde yenilemek yerine zaman değişiklikleri ekrana yansıtmak için aşağıdaki komutu kullanabiliriz,

kubectl get pods --all-namespaces --watch

Tüm podların Running duruma geldiğinden emin olalım,

kubectl get pods --all-namespaces

Tüm nodların durumunu listelemek için aşağıdaki komutu kullanalım, Bizde sadec Control Plane Node/Master node çıkacaktır. Sadece onun kurulumu gerçekleştirilmiştir.

kubectl get nodes 

Kubelet servisinin durumunu sorgulayalım, şuan aktif olarak gözükmesi gerekmektedir.

sudo systemctl status kubelet.service 

Control Plane Node üzerinde statik pod manifestlerini kontrol edelim,

ls /etc/kubernetes/manifests

API sunucusuna ve etcd’nin manifestosuna daha detaylı kontrol etmek için,

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

Control plane podlarının her biri için kubeconfig dosyalarının bulunduğu dizine göz atip incelemek için ise,

ls /etc/kubernetes

Node Kurulumu

Tüm nodlar üzerinde swapoff diyerek yanı sıra da fstab üzerinden swap satırını devre dışı bırakalım,

swapoff -a
vi /etc/fstab

Contaienrd runtime için gerekli olan modulleri kuralım ve boot esnasında devreye girmesi için gerekli işlemleri gerçekleştirelim,

sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
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

Yeniden başlatma olmadan sysctl servislerini yenileyelim,

sudo sysctl --system

Containerd kurulumunu gerçekleştirelim,

sudo apt-get update 
sudo apt-get install -y containerd

Containerd konfigurasyonunu gerçekleştirelim,

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

Containerd, config.toml konfigurasyonu içerisine SystemdCgroup değerini tanımlayalım,

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

Aşağıdaki değeri ilgili config içerisine tanımlayacak, [plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options] satırı altına,

          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            SystemdCgroup = true

Değişikliği kontrol edelim,

sudo vi /etc/containerd/config.toml

Uygulanan değişiklik ile containerd serivsini yeniden başlatalım,

sudo systemctl restart containerd

Kubernetes paketlerinin kurulumu için gerekli olan Google reposunun gpg keyini tanımlayalım,

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

Kubneretes apt sini repomuza ekleyelim,

sudo bash -c 'cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF'

Paket listemizi güncelleyelim,

sudo apt-get update
apt-cache policy kubelet | head -n 20 

Control Plane üzerine kurulumu yapılmış olan versiyon ile birlikte kubelet, kubeadm ve kubectl sürümlerini yükleyelim,

VERSION=1.22.4-00
sudo apt-get install -y kubelet=$VERSION kubeadm=$VERSION kubectl=$VERSION
sudo apt-mark hold kubelet kubeadm kubectl containerd

Kurulumu yapılmış olan servislerimizin durumunu görüntüleyip, reboot sonrası direk aktif olması için konfigurasyonumuzu güncelleyelim,

sudo systemctl status kubelet.service 
sudo systemctl status containerd.service 
sudo systemctl enable kubelet.service
sudo systemctl enable containerd.service

Control Plane üzerine SSH ile tekrardan bağlanıp aktif olan tokenimiz var mı yok mu diye listeleyelim,

Eğer aşağıdaki komutu çalıştırdığımızda bir çıktı almaz isek yeni bir token oluşturmamız gerekmektedir. Oluşan her token 24 saatliğine oluşmaktadır. 24 saat sonra expire duruma düşmektedir.

kubeadm token list

Yeni bir token oluşturmanız gerekiyorsa, belki de eskisi zaman aşımına uğradı/süresi doldu ise,

kubeadm token create

Control plane nodu üzerinde, CA sertifikamızın hash değerini bulalım,

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

Yanı sıra token oluşturduktan sonra nodu cluster içerisine alabilecek formatta çıktıyı alabilmek için aşağıdaki komutu kullanabiliriz,

kubeadm token create --print-join-command

Aşağıdaki çıktıyı node üzerinde çalıştırarak clustera dahil olmasına yardımcı olabiliriz. Sudo komutunu kullanmaktan çekinmeyin,

sudo kubeadm join 172.22.17.200:6443 \
--token 80r7lr.hdi3a7astf20v1yx \
--discovery-token-ca-cert-hash sha256:1530d90ab782c4db7614240b6a80dc91ede0cdbc5d19ac8d86853d30d64e7553

İşlemi yaptıktan sonra node üzerinden exit diyerek çıkış yapıp, control plane üzerine login olalım. Control plane node, üzerinde kubectl get nodes diyerek nodların durumunu sorgulayabiliriz. Yeni node üzerinden networking pod oluşana kadar not ready olarak gözükecektir.

kubectl get nodes 

Control Plane Nod üzerinde, calico pod ve kube-proxyinin yeni eklenen nodlarda Running durumuna geldiğini görebilmek için anlık değişiklikleri aşağıdaki komut ile gözlemleyelim,

kubectl get pods --all-namespaces --watch

Nodelarımızın tamamının durumunu tekrardan kontrol edebilmek için,

kubectl get nodes

Cluster ortamımıza ekleyeceğimiz diğer nodlarda da ilgili işlemleri yapmayı unutmayalım.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir