Kubeadm İle Kubernetes Cluster Kurulumu
Kubeadm, Kubernetes clusterını kolayca oluşturmak ve yönetmek için kullanılan bir araçtır. Ayrıca Kubeadm, sunucunun Kubernetes'i çalıştırmak için gerekli tüm bileşenlere ve yapılandırmalara sahip olduğundan emin olmak için bir dizi ön kontrol gerçekleştirerek tüm kurulum sürecini kolaylaştırır.
Bu makalede, Kubeadm kullanarak Kubernetes kurulumunu adım adım anlatacağız ve daha sonra yeni bir Kubernetes cluster oluşturmak için Kubeadm'in diğer özelliklerini keşfedeceğiz.
1. Kubeadm Nasıl Çalışır?
Kubeadm kullanarak bir Kubernetes cluster initialize ettiğinizde kubeadm aşağıdakileri adımları sırasıyla gerçekleştirir.
- İlk olarak sistem durumunu doğrulamak için ön kontrolleri çalıştırır ve gerekli tüm cluster continer imagelerini
register.k8s.io
adresinden indirir. - Daha sonra gerekli TLS sertifikalarını oluşturur ve bunları
/etc/kubernetes/pki
dizininde saklar. - Ardından,
/etc/kubernetes
dizininde cluster bileşenleri için tüm kubeconfig dosyalarını oluşturur. kubelet
servisini başlatır ve tüm cluster bileşenleri için statik pod manifestlerini oluşturur ve bunu/etc/kubernetes/manifests
dizinine kaydeder.- Static pod manifestlerinden tüm control-plane bileşenlerini başlatır.
- Ardından, core DNS ve Kubeproxy bileşenlerini kurar
- Son olarak, node bootstrap token'ini oluşturur.
- Çalışan düğümler, control-plane'e katılmak için bu token'ı kullanır.
Kubeadm kurulumunun sorunsuz bir şekilde tamamlanabilmesi ve ardından Kubernetes cluster işlemlerine geçebilmeniz için kubeadm kurulum öncesi bazı gereksinimleri tamamlamanız oldukça önemlidir. Aşağıdaki başlıkta yer alan adımları başarılı bir şekilde tamamladıktan sonra Kubeadm kurulumuna geçebilirsiniz.
sudo
komutunu tüm komutların başına eklemeniz gerekir.2. Kubeadm Kurulumu
Kubeadm ile Kubernetes cluster kurulumu için ilerleyen başlıklardaki işlemleri sırasıyla ve başarılı bir şekilde tamamlamalısınız.
3. Gereksinimler
Kubeadm kurulumuna geçmeden önce, aşağıdaki başlıklarda yer alan işlemleri sırası ile ve başarılı sonuç alacak şekilde tamamlamanız gerekmektedir. Aksi halde kubeadm kurulumu başarısız sonuçlanabilir veya Kubernetes doğru bir şekilde çalışmayabilir.
3.1 Flavor ve OS
- Debian ve Red Hat tabanlı Linux dağıtımlarını tercih etmelisiniz. Biz bu yazıda Rocky Linux 8 kullanacağız.
- Makine başına 2 GB veya daha fazla RAM
- 2 CPU veya daha fazlası
- Clusterdaki tüm makineler arasında sorunsuz ve kesintisiz ağ bağlantısı
3.2 Benzersiz Node Tanımları
Kubernetes cluster içinde yer alacak her node için benzersiz hostname, MAC adresi ve product_uuid tanımlanmalıdır.
hostname
komutu ile makine adını kontrol edebilirsiniz.
ip link
komutu ile MAC adresini kontrol edebilirsiniz.
cat /sys/class/dmi/id/product_uuid
komutu ile de uuid değerini kontrol edebilirsiniz.
3.3 Port ve Protokoller
Kubernetes'in çalışabilmesi için makinelerinizde belirli portlar haberleşebilmek için açık olmalıdır.
- Control Plane, manager, makinelerde açık olması gereken port ve protokoller şunlardır:
Protocol | Direction | Port Range | Purpose | Used By |
---|---|---|---|---|
TCP | Inbound | 6443 | Kubernetes API server | All |
TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP | Inbound | 10250 | Kubelet API | Self, Control plane |
TCP | Inbound | 10259 | kube-scheduler | Self |
TCP | Inbound | 10257 | kube-controller-manager | Self |
Bu portları açmak için aşağıdaki komutları kullanabilirsiniz:
Red Hat tabanlı dağıtımlarda:
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10259/tcp
firewall-cmd --permanent --add-port=10257/tcp
Debian tabanlı dağıtımlarda:
ufw allow 6443/tcp
ufw allow 2379:2380/tcp
ufw allow 10250/tcp
ufw allow 10259/tcp
ufw allow 10257/tcp
- Worker nodelarda açık olması gereken port ve protokoller şunlardır:
Protocol | Direction | Port Range | Purpose | Used By |
---|---|---|---|---|
TCP | Inbound | 10250 | Kubelet API | Self, Control plane |
TCP | Inbound | 30000-32767 | NodePort Services | All |
Bu portları açmak için aşağıdaki komutları kullanabilirsiniz:
Red Hat tabanlı dağıtımlarda:
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
Debian tabanlı dağıtımlarda:
ufw allow 10250/tcp
ufw allow 30000:32767/tcp
Kurulum tamamlandıktan sonra ilgili portları nc
komutu ile test edebilirsiniz:
nc 127.0.0.1 6443
3.4 Memory SWAP
Memory SWAP devre dışı bırakılmalıdır. Aksi halde Kubelet performanslı çalışamayacağı için sorunlar meydana gelebilir.
- Öncelikle
swapoff -a
komutunu çalıştırınız.
Bu komut swap özelliğini geçici olarak devre dışı bırakır. Bu değişikliğin yeniden başlatmalarda kalıcı olması için, sisteminizde nasıl yapılandırıldığına bağlı olarak /etc/fstab
, systemd.swap
gibi yapılandırma dosyalarında swap satırının devre dışı bırakıldığından emin olun.
Örneğin Red Hat tabanlı dağıtımlarda /etc/fstab
dosyasını açınız ve swapfile..
ile başlayan satırın başına #
işareti koyarak o satırı yoruma alabilir ve swap'ı devre dışı bırabilirsiniz.
3.5 Kernel Modüllerinin Aktif Edilmesi
Kubeadm kurulumunun sorunsuz başlayabilmesi için overlay ve br_netfilter modüllerinin aktif edilmesi gerekmektedir. Bu iki modülü aktif etmek için şu komutları kullanınız:
modprobe overlay
modprobe br_netfilter
Son olarak ilgili sistem ayarlarını değiştirmek için /etc/sysctl.d
dizini altında k8s.conf
isimli bir dosya oluşturarak aşağıdaki değerleri içine ekleyiniz:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
Ardından sudo sysctl -p /etc/sysctl.d/k8s.conf
komutunu çalıştırarak yukarıdaki ayarları aktif ediniz.
Son olarak [WARNING FileExisting-tc]: tc not found in system path
hatası almamak için aşağıdaki komutu çalıştırarak iproute-tc
paketini kurunuz.
yum install iproute-tc
3.6 Container Runtime Kurulumu
Kubernetes, Pod içinde container çalıştırabilmek için Container Runtime teknolojisi kullanır.
Varsayılan olarak Kubernetes, seçtiğiniz container runtime ile interface oluşturmak için Container Runtime Interface (CRI) kullanır.
Eğer bir container runtime belirtmezseniz, kubeadm, bilinen endpointlerin listesini tarayarak kurulu bir container runtime'ın kurulu olup olmadığını otomatik olarak algılamaya çalışır.
Birden çok container runtime algılanırsa veya hiçbiri bulunamazsa, kubeadm bir hata atar ve hangisini kullanmak istediğinizi belirtmenizi ister.
Aşağıdaki tablo, desteklenen işletim sistemleri için bilinen endpointleri içerir:
Runtime | Linux socket | Windows pipe |
---|---|---|
containerd | unix:///var/run/containerd/containerd.sock | npipe:////./pipe/containerd-containerd |
CRI-O | unix:///var/run/crio/crio.sock | - |
Docker Engine (using cri-dockerd) | unix:///var/run/cri-dockerd.sock | npipe:////./pipe/cri-dockerd |
Biz bu 3 seçenek arasından containerd'i kuracağız. Bunun için aşağıdaki linkte yer alan containerd kurulum yöntemlerinden herhangi birini kullanabilirsiniz veya aşağıdaki komutları sırayla çalıştırabilirsiniz.
Red Hat tabanlı bir dağıtımda containerd kurmak için yukarıda linkte yer alan ve aslında 2.methoda karşılık gelen aşağıdaki komutları kullanabilirsiniz:
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install containerd.io
systemctl daemon-reload
systemctl enable --now containerd
containerd'i kurduktan sonra SystemdCgroup
ayarını aktif etmemiz gerekiyor. Bunun için default containerd yapılandırmasını config dosyasına yazıp üzerinde düzenleme yapmalıyız. Aşağıdaki komutlar bu işlemler için yeterli olacaktır.
containerd config default | tee /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
Artık kubeadm kurabilmek için gerekli olan tüm gereksinimleri tamamlamış bulunuyoruz. Şimdi kubeadm kurulumuna geçebiliriz.
4. Kubeadm Kurulumu
Gereksinimleri başarılı bir şekilde tamamladıktan sonra artık kubeadm kurulumuna geçebiliriz.
Kubeadm kurulumu için şu paketleri tüm nodelara kurmamız gerekiyor:
- kubeadm: Kubernetes clusterların başlatılmasını sağlamak için kullanılan bir araçtır.
- kubelet: Cluster üzerindeki tüm nodelarda çalışan ve pod ile container'ları başlatmak gibi işler yapan bileşendir.
- kubectl: Cluster ile haberleşmek için kullanılan CLI aracıdır.
kubeadm
sizin yerinize kubelet
veya kubectl
'i kurmaz veya yönetmez. Bu nedenle bu üç aracın versiyonlarının eşleştiğinden emin olmalısınız. Aksi halde kararsız ve doğru olmayan bir çalışma ile karşılaşabilirsiniz. Versiyonlar ve örnek senaryolar için şu linki ziyaret edebilirsiniz.
4.1 Red Hat Tabanlı Dağıtımlarda Kurulum
Bu yazıda Rocky Linux kullanıyoruz ve bu sebeple aşağıdaki komutlarla kubeadm kurulumunu yapabilirsiniz.
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# Set SELinux in permissive mode (effectively disabling it)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
setenforce 0
vesed ...
komutları çalıştırılarak SELinux'u devre dışı bırakılır. Bu, containerların host makinenin dosya sistemine erişmesine izin vermek için gereklidir. Kubelet'te SELinux desteği gelişene kadar bunu yapmanız gerekiyor.- Red Hat tabanlı dağıtımınız basearch'ı yorumlayamayıp
baseurl
başarısız olursa,$basesearch
'ü bilgisayarınızın mimarisiyle değiştirin. Bu değeri görmek içinuname -m
yazın. Örneğin,x86_64
için baseurl URL'si şu olabilir:https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
.
4.2 Debian Tabanlı Dağıtımlarda Kurulum
Siz Ubuntu gibi bir Debian tabanlı dağıtım kullanmak isterseniz aşağıdaki komutlarla kubeadm i kurabilirsiniz.
apt-get update
apt-get install -y apt-transport-https ca-certificates curl
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
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
Artık kubeadm
, kubelet
ve kubectl
kurulumlarını da başarıyla tamamladık. Şimdi Kubeadm initialize işlemine geçebiliriz.
systemctl status kubelet
komutunu çalıştırdığınızda kubelet servisinin başlayamayarak hata verdiğini göreceksiniz. Bu durum normaldir ve kubeadm
, kubelet
'in ne yapması gerektiğini söyleyene kadar birkaç saniyede bir yeniden başlayarak hata vermeye devam edecektir.4.3 Kubeadm'i Başlatmak
Control-plane yani manager node, etcd (cluster veritabanı) ve API Server (kubectl cli aracının iletişim kurduğu) dahil olmak üzere control-plane bileşenlerinin çalıştığı makinedir.
Kubeadm'i başlatabilmek için kubeadm init
komutunu gerekli parametrelerle birlikte çalıştırmalıyız. Kullanabileceğimiz parametreler ve açıklamaları şu şekildedir:
--control-plane-endpoint
: Kubernetes cluster'ındaki control-plane node'lara erişmek için kullanılır. Kuracağınız tek control-plane node'lu kubeadm cluster'ını high availabilty için birden fazla control-plane'li node'a yükseltme planınız varsa, (production ortamı için önerilir), bu parametreyi ayarlamanız gerekir. IP adresi veya domain kullanabilirsiniz.--apiserver-advertise-address
: API server'ın dış dünyadan erişilebileceği IP adresini belirtir. Bu parametre, Kubernetes cluster'ın API server'a nasıl erişileceğini belirlemek için kullanılır. Eğer bu parametre belirtilmezse, API server, Kubernetes cluster'ın bulunduğu node'lar arasındaki ağ trafiğine bağlı olarak otomatik olarak belirlenir. Ancak, bazen bu otomatik belirleme yöntemi doğru şekilde çalışmayabilir veya API server'ın dış dünyadan erişilebilmesi gerektiği durumlarda bu parametrenin kullanımı gerekebilir.--pod-network-cidr
: Cluster'da podlar arasındaki ağ iletişimini yönetmek için kullanılan IP adresi aralığını belirtir. Belirtilmediğinde, Kubernetes varsayılan olarak10.244.0.0/16
IP adresi aralığını kullanır.--cri-socket
: cluster'da container runtime (örneğin, CRI-O veya containerd) ile iletişim kurmak için kullanılan Unix soketinin yolunu belirtir. Belirtilmediğinde, kubeadm, bilinen endpointlerin bir listesini kullanarak container runtime'ı otomatik algılamaya çalışır.
Kullanabileceğiniz diğer parametreler için şu sayfayı inceleyebilirsiniz.
Artık kubeadm init komutunu gerekli parametrelerle çalıştırarak cluster'ı init edebiliriz:
kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=<node_ip> --control-plane-endpoint=<node_ip>
192.168.0.0/16
olarak ayarladık. Çünkü Calico manifest dosyasında network aralığı bu şekilde ayarlanmıştır. Siz farklı bir aralık kullanacaksanız manifest dosyasında da ilgili aralığı düzenlemelisiniz.Kurulum başarılı bir şekilde tamamlandığında aşağıdaki gibi örnek bir çıktı görmeniz gerekiyor:
Eğer kubectl
'i root olmayan bir kullanıcıyla kullanacaksanız şu komutları çalıştırınız:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Fakat root kullanıcıyla kullanacaksanız şu komutu çalıştırmak yeterlidir:
export KUBECONFIG=/etc/kubernetes/admin.conf
export
komutu geçici bir environment variable ekleyeceği için terminal kapandığında bu tanımda silinecektir. Bu nedenle ~/.bash_profile dosyasının içine export komutunu ekleyerek komutu kalıcı hale getirebilirsiniz. Aksi halde couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
hatası alırsınız. Ortam değişkenleri hakkında daha fazla detay için aşağıdaki yazımızı inceleyebilirsiniz.Cluster'a high availability için yeni bir control-plane node ekleyecekseniz, ilgili node'da çıktıda söylenen şu benzeri komutu çalıştırınız:
kubeadm join 140.82.53.197:6443 --token [token] \
--discovery-token-ca-cert-hash sha256:[hash] \
--control-plane
Cluster'a bir worker node ekleyecekseniz, ilgili node'da çıktıda söylenen şu benzeri komutu çalıştırınız:
kubeadm join 140.82.53.197:6443 --token [token] \
--discovery-token-ca-cert-hash sha256:[hash]
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
Şu anda kubeadm kurulumunu tamamladık. Fakat systemctl status kubelet çıktısına bakarsanız bu sefer kubelet servisinin başladığını, fakat NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
hatası verdiğini görürsününüz. Bunu çözmek için sıradaki başlıkla işlemlere devam ediyoruz.
4.4 Kubeadm Pod Network Eklentisi Kurmak
Pod'ların birbiriyle iletişim kurabilmesi için Container Runtime Interface (CNI) tabanlı bir Pod network eklentisi kurmalısınız. Cluster DNS (CoreDNS), bir network kurulmadan başlamaz.
Kurabileceğiniz tüm eklenti seçenekleri şu adreste listelenmiştir. Biz bu yazıda Calico kurarak devam edeceğiz.
Calico kurulumu için aşağıdaki şu komutları çalıştırınız:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O
kubectl create -f custom-resources.yaml
5. Kubeadm Kurulumunun Doğrulanması
Yukarıdaki tüm aşamaları başarılı bir şekilde tamamladıktan sonra kubectl get nodes
komutu ile nodeların durumunu Ready olarak görmeniz gerekmektedir.
NotReady görmeniz durumunda kubectl describe nodes
ile eventleri ve sistem mesajlarını kontrol edebilirsiniz.
6. Kubernetes Metrics Server Kurulumu
Kubeadm, kurulum sırasında metrics server bileşenini yüklemez. Bu sebeple ayrı olarak yüklememiz gerekiyor.
Bunu doğrulamak için top
komutunu çalıştırırsanız, Metrics API not available
hatasını görürsünüz.
root@manager1:~# kubectl top nodes
error: Metrics API not available
Metrics server yüklemek için aşağıdaki komutu çalıştırınız:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Bu manifest dosyası, resmi metrics server github sayfasından alınmıştır. Fakat kubelet-insecure-tls parametresi ek olarak eklenmiştir. Aksi halde because it doesn't contain any IP SANs" node=""
hatası verir.
Metrics server nesneleri konuşlandırıldıktan sonra top komutunu kullanarak node ve pod metriklerini görmeniz bir dakika sürer.
kubectl top nodes
Node metriklerini aşağıda gösterildiği gibi görüntüleyebilmeniz gerekir.
root@manager1:~# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
manager1 111m 5% 1695Mi 44%
Aşağıdaki komutu kullanarak belirli bir pod için CPU ve bellek ölçümlerini de görüntüleyebilirsiniz.
kubectl top pod -n kube-system
7. Kubernetes Cluster Önemli Config Dosyaları
Aşağıda, bilmeniz gereken önemli cluster yapılandırmalarının dosya yolları bulunmaktadır.
Konfigürasyon | Dosya Yolu |
---|---|
Static Pods Location (etcd, api-server, controller manager and scheduler) | /etc/kubernetes/manifests |
TLS Certificates location (kubernetes-ca, etcd-ca and kubernetes-front-proxy-ca) | /etc/kubernetes/pki |
Admin Kubeconfig File | /etc/kubernetes/admin.conf |
Kubelet configuration | /var/lib/kubelet/config.yaml |
Sıradaki yazı ile eğitim serisine devam edebilirsiniz.