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.