Kubeadm kullanarak Ubuntu üzerinde Kubernetes Kümesi Kurulumu


Bu kılavuzda, Ubuntu Linux üzerinde çalışan 3 düğümlü bir Kubernetes Kümesi kurup yapılandırma adımlarını size göstereceğim. Kubernetes, konteynerleştirilmiş uygulamaların dağıtımını, yönetimini ve ölçeklendirilmesini otomatikleştirmek için kullanılan açık kaynaklı bir konteyner orkestrasyon sistemidir.

Bu makalede sürecin detaylarını paylaşıyoruz:

  • Kubernetes düğümlerini hazırlama
  • Depoları ayarlama
  • Kapsayıcı çalışma zamanı motorunu yükleme
  • Kubernetes bileşenlerini kurma
  • Kümenizi başlatmak
  • Kubernetes için ağ eklentisi kurulumu
  • Yeni işçi düğümlerini kümeye eklemek

Hadi başlayalım!

Nihai Ubuntu Masaüstü Kılavuzu

Ubuntu'yu bir profesyonel gibi keşfedin - güzel masaüstü özelleştirmelerinden güçlü terminal otomasyonuna kadar. Geliştiriciler, sistem yöneticileri ve çalışma alanlarının tam kontrolünü isteyen ileri düzey kullanıcılar için mükemmel.

Adım 1: Sistemler Diyagramı

Bu kurulum aşağıdaki diyagrama dayanmaktadır:

Bir sonraki adımlara geçmeden önce sistem ana bilgisayar adlarını yapılandıralım:

Ana Düğümde:

Hostname'i aşağıdaki gibi ayarlayın:

sudo hostnamectl set-hostname k8s-master.example.com

İşçi Düğüm 01 Üzerinde:

hostnamectl komut satırı aracını kullanarak ana bilgisayar adını ayarlayın.

sudo hostnamectl set-hostname k8s-node-01.example.com

İşçi Düğüm 02 Üzerinde:

Ayrıca Kubernetes işçi düğümü 02 için hostname ayarlayın.

sudo hostnamectl set-hostname k8s-node-02.example.com

Her bir sunucuda doğru ana bilgisayar adı yapılandırıldıktan sonra, her düğüme yapılandırılmış değerleri girin.

$ sudo vim /etc/hosts
192.168.2.2 k8s-master.example.com    k8s-master
192.168.2.3 k8s-node-01.example.com  k8s-node-01
192.168.2.4 k8s-node-02.example.com  k8s-node-02

Yeni yapılandırılan ana bilgisayar adını kullanmak için çıkış yapın ve tekrar giriş yapın.

exit||logout

Adım 2: Yönetici kullanıcı oluştur

Herhangi bir Kubernetes'e özel yapılandırma yapmadan önce, tüm bağımlılıkların karşılandığından emin olalım. Burada sistem güncellemesi yapacak ve Kubernetes kullanıcısı oluşturacağız.

Tüm düğümlerde sistem paketlerini en son sürüme güncelleyin:

sudo apt update && sudo apt upgrade -y
[ -e /var/run/reboot-required ] && sudo reboot

Kubernetes kümesini yönetmesi için kullanıcı ekle:

sudo useradd -s /bin/bash -m k8s-admin
sudo passwd k8s-admin
sudo usermod -aG sudo k8s-admin
echo "k8s-admin ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/k8s-admin

Eğer k8s-admin kullanıcısı olarak sudo komutlarını çalıştırırken sudo şifresini girmeyi tercih ediyorsanız, son satırı yok sayabilirsiniz. Şifre isteminin çıkmadığını test edebilirsiniz:

$ su - k8s-admin
k8s-admin@k8s-master:~$ sudo su -
root@k8s-master:~# exit

Her şey yolunda görünüyor, Docker motorunu kurmaya devam edelim.

Adım 3: Containerd'i Yükleyin

Kubernetes, konteynerleri çalıştırmak için bir konteyner çalışma zamanı motoruna ihtiyaç duyar. Bu makalede konteyner motoru olarak Containerd kullanacağız.

Docker'ın yüklü olmadığından emin olun. Eğer yüklüyse kaldırın.

sudo apt remove docker docker-engine docker.io

Bağımlılıkları yükleyin:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common

Docker depo GPG anahtarını içe aktar:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Docker motorunu kur.

sudo apt update && sudo apt install containerd.io

Hizmet otomatik olarak başlatılır.

$ systemctl status containerd.service
● containerd.service - containerd container runtime
   Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
   Active: active (running) since  Sun 2024-07-14 21:22:30 UTC; 34min ago
     Docs: https://containerd.io
  Process: 4265 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
 Main PID: 4270 (containerd)
    Tasks: 8
   CGroup: /system.slice/containerd.service
           └─4270 /usr/bin/containerd

Ayrıca yüklü sürümü de kontrol edebilirsiniz:

containerd --version

Adım 4: Kubernetes Bileşenlerini Yükleyin

Bağımlı araçları yükleyin.

sudo apt install apt-transport-https ca-certificates curl gpg -y

Yüklemek istediğiniz Kubernetes sürümünü ayarlayın.

k8s_ver=1.30

Kubernetes paket depoları için genel imzalama anahtarını indir

curl -fsSL https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/Release.key | \
 sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/k8s.gpg

Resmi Kubernetes APT deposunu ekleyin.

echo "deb https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

apt paket indeksini güncelle:

sudo apt update

Kubernetes Bileşenlerini Yükle

Kubernetes ana bileşenlerini yükleyin: kubectl, kubelet, kubernetes-cni ve kubeadm

sudo apt install kubectl kubelet kubeadm kubernetes-cni

Tüm paket ikili dosyalarının dosya sisteminde bulunduğunu doğrulayın.

$ which kubelet
/usr/bin/kubelet

$ which kubeadm
/usr/bin/kubeadm

Eğer takas açıksa, kapatın.

sudo swapoff -a
sudo sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab

Gerekli modülleri yükleyin.

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

Çalışma zamanında yüklemek için şunu çalıştırın:

sudo modprobe overlay
sudo modprobe br_netfilter

Ayrıca sysctl yapılandırmalarını da ayarlayın.

sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

Yapılandırmaları yükle.

sudo sysctl --system

containerd'i yapılandırın ve servisi yeniden başlatın

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

kubelet servisini etkinleştir

sudo systemctl enable kubelet

Adım 5: k8s Kontrol Düzlemini Başlat

Bu bölümde çalıştırılacak tüm komutlar, master düğümde çalıştırılmak üzere tasarlanmıştır. Komutlardan hiçbirini Kubernetes worker düğümlerinde çalıştırmayın. Kubernetes Master bileşenleri, kümenin kontrol düzlemini sağlar – API Sunucusu, Zamanlayıcı, Kontrol Yöneticisi. Küme ile ilgili küresel kararlar verirler, örneğin zamanlama yapmak ve küme olaylarını tespit edip yanıtlamak gibi.

Kubernetes temel imajlarını çekerek containerd'nin çalıştığını doğrulayın.

$ sudo kubeadm config images pull
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.30.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.30.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.30.2
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.11.1
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.12-0

Birden fazla CRI soketiniz varsa, lütfen birini seçmek için --cri-socket kullanın:

# Containerd
sudo kubeadm config images pull --cri-socket unix:///run/containerd/containerd.sock

# For CRI-O
sudo kubeadm config images pull --cri-socket unix:///var/run/crio/crio.sock

Bootstrap (tek kontrol düzlemi düğümü) – paylaşılan uç nokta yok

DNS uç noktası kullanmadan bir küme başlatmak için şu komutu çalıştırın:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --cri-socket unix:///run/containerd/containerd.sock

Paylaşılan uç nokta ile başlatma (kontrol düzlemi API'si için DNS adı)

Bu, birden fazla kontrol düzlemi düğümü için idealdir.

Küme uç nokta DNS adını ayarlayın veya /etc/hosts dosyasına kayıt ekleyin.

$ sudo vim /etc/hosts
172.29.20.5 k8s-cluster.computingforgeeks.com

Küme oluştur:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

Nerede :

  • k8s-cluster.computingforgeeks.com, k8s kontrol düzlemi düğümleriniz için bir LB IP adresine işaret eder.

Her şey yolunda giderse, bir sonraki adımda ne yapmanız gerektiğini belirten bir başarı mesajı almalısınız:

---
Your Kubernetes master 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

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/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.2.2:6443 --token 9y4vc8.h7jdjle1xdovrd0z --discovery-token-ca-cert-hash sha256:cff9d1444a56b24b4a8839ff3330ab7177065c90753ef3e4e614566695db273c

Master sunucuda k8s-admin kullanıcısı için erişimi yapılandırın

k8s-admin kullanıcıya geçin ve küme bilgilerini içeren Kubernetes yapılandırma dosyasını kopyalayın.

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

Dağıtımı doğrulamak için küme bilgilerini kontrol edin.

$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.2.2:6443
CoreDNS is running at https://192.168.2.2:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Adım 6: CNI Eklentisini Kur

Bu kılavuzda Calico kullanacağız. Başka herhangi bir desteklenen ağ eklentisini de seçebilirsiniz.

Operatör ve özel kaynak dosyalarını indirin. En son sürüm için sürümler sayfasına bakın.

En son sürümü edinin:

VERSION=$(curl --silent "https://api.github.com/repos/projectcalico/calico/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

Kurulum kaynaklarını indir.

curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/custom-resources.yaml 

Öncelikle, operatörü kümenize kurun.

k8s-admin@k8s-master:~$ kubectl create -f tigera-operator.yaml
namespace/tigera-operator created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/apiservers.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/imagesets.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/installations.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/tigerastatuses.operator.tigera.io created
serviceaccount/tigera-operator created
clusterrole.rbac.authorization.k8s.io/tigera-operator created
clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created
deployment.apps/tigera-operator created

Hadi Calico IP Havuzunu da güncelleyelim.

sed -ie 's/192.168.0.0/172.24.0.0/g' custom-resources.yaml

Sonra manifest yapılandırmalarını uygulayın.

k8s-admin@k8s-master:~$  kubectl create -f custom-resources.yaml
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created

Calico Pod'un çalışır durumda olmasını bekleyin.

k8s-admin@k8s-master:~$ kubectl get pods --all-namespaces
NAMESPACE          NAME                                             READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-5476c484c4-rmmts                1/1     Running   0          37s
calico-apiserver   calico-apiserver-5476c484c4-z9phf                1/1     Running   0          37s
calico-system      calico-kube-controllers-6945f87bd4-2xwx4         1/1     Running   0          80s
calico-system      calico-node-tkwtv                                1/1     Running   0          80s
calico-system      calico-typha-65f575c9fc-xx8m8                    1/1     Running   0          81s
calico-system      csi-node-driver-kngdn                            2/2     Running   0          80s
kube-system        coredns-5dd5756b68-77x77                         1/1     Running   0          11m
kube-system        coredns-5dd5756b68-plpd6                         1/1     Running   0          11m
kube-system        etcd-k8s-master.example.com                      1/1     Running   0          11m
kube-system        kube-apiserver-k8s-master.example.com            1/1     Running   0          11m
kube-system        kube-controller-manager-k8s-master.example.com   1/1     Running   0          11m
kube-system        kube-proxy-bxq4x                                 1/1     Running   0          11m
kube-system        kube-scheduler-k8s-master.example.com            1/1     Running   0          11m
tigera-operator    tigera-operator-94d7f7696-xls25                  1/1     Running   0          3m20s

Düğüm artık Hazır olmalıdır.

k8s-admin@k8s-master:~$ kubectl get nodes
NAME                     STATUS   ROLES           AGE   VERSION
k8s-master.example.com   Ready    control-plane   20m   v1.30.2

Adım 7: Worker Düğümlerini Kur

Kubernetes kümesi başlatıldığında ve master node çevrimiçi olduğunda, Worker Node yapılandırmasına başlanır. Bir node, Kubernetes'te bir işçi makinesidir; sanal makine (VM) veya fiziksel bir makine olabilir. Her node master tarafından yönetilir ve pod'ları çalıştırmak için gerekli hizmetlere sahiptir – docker, kubelet, kube-proxy

1) Containerd çalışma zamanı yüklü olduğundan emin olun (ele alındı)

Containerd'yi kurmak için bu makalede verilen adımları kullanın

2) Kubernetes deposunu ekleyin (kapsandı)

Kubernetes paketleri için depo sisteminize eklenmiş olduğundan emin olun.

3) Kubernetes bileşenlerini yükleyin (Adım 4)

Kubernetes deposunu ekledikten sonra, bileşenleri şu şekilde kurun:

sudo apt install kubelet kubeadm kubectl kubernetes-cni

4) Düğümü Kümesine Katın:

Kubernetes kümesini başlattıktan sonra verilen join komutunu kullanın. Komutları şu şekilde yazdırabilirsiniz:

kubeadm token create --print-join-command

Tamamlandığında, ana düğümde düğümlerin durumunu kontrol edin:

k8s-admin@k8s-master:~$ kubectl get nodes
NAME          STATUS    ROLES     AGE       VERSION
k8s-master    Ready     master    35m       v1.30.2
k8s-node-01   Ready     <none>    2m        v1.30.2
k8s-node-02   Ready     <none>    1m        v1.30.2

Adım 8: Kubernetes Kurulumunu Doğrula

Bir test ad alanı oluşturun:

$ kubectl create namespace test
namespace/test created

Test uygulamasını dağıt

kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080

Mevcut dağıtımları görüntüle:

$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           1m

Çalışan podları gör

$ kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m

Kaynakları temizlemek için şunu çalıştırın:

kubectl delete deployment hello-node

Adım 9: kubectl tamamlamasını yapılandırın

kubectl komutları için kabuk otomatik tamamlama özelliğini etkinleştirin. kubectl, yazmayı oldukça azaltabilecek otomatik tamamlama desteği içerir! Mevcut oturumunuzda kabuk otomatik tamamlamayı etkinleştirmek için şunu çalıştırın:

source <(kubectl completion bash)

kubectl otomatik tamamlama özelliğini profilinize eklemek için, böylece gelecekteki shell'lerde otomatik olarak yüklenmesi için şu komutu çalıştırın:

echo "source <(kubectl completion bash)" >> ~/.bashrc

Eğer zsh kullanıyorsanız, ~/.zshrc dosyasını düzenleyin ve kubectl otomatik tamamlama özelliğini etkinleştirmek için aşağıdaki kodu ekleyin:

if [ $commands[kubectl] ]; then
source <(kubectl completion zsh)
fi

Veya Oh-My-Zsh kullanıyorsanız, ~/.zshrc dosyasını düzenleyin ve plugins= satırını kubectl eklentisini içerecek şekilde güncelleyin.

source <(kubectl completion zsh)

Ayrıca konteyner ölçümleri için Top komutu da ilgilidir

Kubernetes ustalık eğitim materyalleri:

  • En İyi Kubernetes Çalışma Kitapları

Sonuç

Ubuntu LTS sunucular üzerinde başarılı bir şekilde 3 düğümlü bir Kubernetes kümesi kurduk. Bir sonraki rehberlerimiz Kubernetes Yüksek Erişilebilirlik (HA), Kubernetes İzleme, Harici depolama nasıl yapılandırılır ve daha birçok harika şeyleri kapsayacak. Takipte kalın!