Bu doküman, Ubuntu işletim sistemine sahip bir sunucuya Kubernetes versiyon 1.29 kurulumunu anlatmaktadır. Ubuntu 2022.04 LTS İşletim sisteminin olması tavsiye edilir.


Kuruluma Başlamadan Önce Yapılması Gereken Kontroller

Çok Önemli

Kurulumlara başlamadan önce mutlaka sunucuların aynı ağda ve aynı Virtual Machine üzerinde olduğunu sistem yöneticilerinden teyit edin.

Çok Önemli

Kurulumlara başlamadan önce mutlaka sunucunun hostname'in localhost.localdomain olmadığından ve her birinin eşsiz olduğundan (hostname komutu ile) emin olun. Eğer bu şekilde ise mutlaka işlemlere başlamadan önce değiştirin.

#(Gerekirse) Hostname değiştirme

hostnamectl set-hostname your-new-hostname
POWERSHELL

/etc/hosts dosyasında 127.0.1.1 şeklinde bir hostname tanımlı olmamalıdır.

/etc/resolv.conf dosyasında "nameserver 127.0.1.1" şeklinde bir girdi olmamalıdır.


Çok Önemli

Eğer internete erişim için Proxy gerekiyorsa aşağıdaki kodlar çalıştırılmalıdır.


#Linux Shell üzerinde aşağıdakileri çalıştırın:

export http_proxy=http://proxyIp:port/ 
export https_proxy=http://proxyIp:port/
export no_proxy=localhost,127.0.0.1,SERVERIP,*.hostname
POWERSHELL


#Aşağıdaki dosyalara altındaki kodları ekleyiniz:


sudo vi /etc/apt/apt.conf

Acquire::http::Proxy "http://username:password@proxyIp:port";
Acquire::https::Proxy "https://username:password@proxyIp:port";
POWERSHELL

sudo vi /etc/systemd/system/docker.service.d/proxy.conf

[Service]
Environment="HTTP_PROXY=http://proxyIp:port"
Environment="HTTPS_PROXY=https://proxyIp:port"
Environment="NO_PROXY="localhost,127.0.0.1,::1,SERVERIP,*.hostname"
POWERSHELL

Kurulum için Önemli

Kurulumun sağlıklı olması için Apinizer Kubernetes sunucularının aşağıdaki adreslere erişmesi gerekmektedir.

Docker Imajlarına erişim için: 

https://hub.docker.com


Kubernetes:

https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

https://packages.cloud.google.com/yum/doc/yum-key.gpg

https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg


Kubernetes Dashboard:

https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml


Aşağıdaki adresler için de firewall üzerinde SSL Inspection kapatılmalıdır.

k8s.gcr.io
registry-1.docker.io
hub.docker.com


Eğer sunucular arasında tüm trafiğe izin verilmeyecekse aşağıdaki portlar için izinler tek tek tanımlanmalıdır:

6443/tcp              # Kubernetes API server
2379-2380/tcp     # etcd server client API
10250/tcp             # Kubelet API
10251/tcp             # kube-scheduler
10252/tcp             # kube-controller-manager
8285/udp             # Flannel
8472/udp             # Flannel

30000-32767       #Applications on Kubernetes

Önemli

Ubuntu paketleri güncellerken Türkiye lokasyonundaki sunucudan çekmeye çalışır. Ancak zaman zaman tr.archive.ubuntu.com adresinde sorun olabilmektedir. Bu durumda aşağıdaki değişikliği yapmak gerekir.

sudo vi /etc/apt/sources.list

#İçinde tr. olan adreslerin hepsini "Replace All" ile değiştirin.

#Örnek: 

Eski: http://tr.archive.ubuntu.com/ubuntu

Yeni: http://archive.ubuntu.com/ubuntu

#1) İşletim Sistemi Konfigürasyonları (Tüm Sunucularda Yapılacaktır)


# Apinizer kullanıcısı oluşturulur ve yetkilendirilir.
sudo adduser apinizer
sudo usermod -aG sudo apinizer

# Kullanıcıya geçilerek işlemlere devam edilir
sudo su - apinizer

# Aşağıdaki araçların tüm sunucular üzerinde kurulu olması tavsiye edilmektedir
sudo apt update
sudo apt install -y curl wget net-tools gnupg2 software-properties-common apt-transport-https ca-certificates

#Güvenlik duvarı kapatılır
sudo systemctl stop ufw
sudo systemctl disable ufw

# Swap kapatılır ve yeniden başlamasının önlenmesi için /etc/fstab dosyası içindeki swap satırı silinir.
sudo swapoff -a
sudo vi /etc/fstab
# Daha sonra vi dosyasını kapatılır (:wq)
POWERSHELL

#2) Kubernetes Kurulumu


#2.1) Konteyner Kurulumu (Tüm Kubernetes Sunucularında Yapılacaktır)


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


#Modüllerin çalışmakta olan sistemde yüklenmeleri için
sudo modprobe overlay
sudo modprobe br_netfilter

sudo lsmod | grep br_netfilter

#sysctl ayarları
sudo vi /etc/sysctl.d/k8s.conf
POWERSHELL
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_max_syn_backlog=40000
net.core.somaxconn=40000
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.ipv4.tcp_sack=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_moderate_rcvbuf=1
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_mem=134217728 134217728 134217728
net.ipv4.tcp_rmem=4096 277750 134217728
net.ipv4.tcp_wmem=4096 277750 134217728
net.core.netdev_max_backlog=300000
YML
# Konfigürasyonların yüklenmesi
sudo sysctl --system

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

# Add Docker repo
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Install containerd
sudo apt update
sudo apt install -y containerd.io

# Configure containerd and start service
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

# Restart containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
systemctl status containerd

POWERSHELL

#2.2) Kubernetes Kurulumu (Master ve Worker sunucularda)


Kubernetes anahtarlarının ve depo adreslerinin sisteme yüklenmesi:

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update


# Kubernetes installation 
sudo apt-get install -y kubelet=1.29.3-1.1 kubeadm=1.29.3-1.1 kubectl=1.29.3-1.1
sudo apt-mark hold kubelet kubeadm kubectl

# Check installation and start
kubectl version --client && kubeadm version

sudo systemctl enable kubelet
POWERSHELL

#2.2.1) Bash Auto-Completion (İsteğe Bağlı, Herhangi Bir Kubernetes Master Sunucusunda)


Bu işlem ile kubernetes komutlarının yazımında hız kazanılabilir:

sudo apt install bash-completion
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bash
source ~/.bashrc
POWERSHELL



#2.2.2) Kubernetes Master Sunucu Oluşturma (Kubernetes Master Sunucularında)


Multi-Master Kubernetes yapmak için aşağıdaki komut çalıştırılır:

# Master sunucunun hostname adresi kullanılır
sudo kubeadm init --pod-network-cidr "10.244.0.0/16" --control-plane-endpoint "<MASTER_SERVER_HOSTNAME>" --upload-certs
POWERSHELL

Önemli

Eğer kubernetes podlarının alacağı ip bloğu (podCIDR değeri) olarak 10.244.0.0/16 kullanmayacaksanız yukarıdaki komutu buna uygun olarak düzenlemeniz gerekmektedir.

Multi-Master yapısını kullanmak için diğer Master olacak node'lar aşağıdaki kod ile bağlanmalıdır

sudo kubeadm join <MASTER_SERVER_HOSTNAME>:6443 --token <XXX> --discovery-token-ca-cert-hash sha256:<YYY> --control-plane --certificate-key <ZZZ>
BASH

Çok Önemli

# Eğer bağlantı komutu yeniden oluşturulmak istenirse aşağıdaki kodlardan ikincisinin çıktısı ilkine eklenmelidir:

kubeadm token create --print-join-command

sudo kubeadm init phase upload-certs --upload-certs


# Sonuç olarak aşağıdaki gibi bir görünümde olmalıdır:

<1. adımdaki join komutunun çıktısı> --control-plane --certificate-key <2. adımın çıktısı olan key değeri>


#Eğer kod manuel olarak oluşturulmak istenirse, aşağıdakiler kullanılır:

XXX için → kubeadm token list

YYY 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/^.* //'

ZZZ için → sudo kubeadm init phase upload-certs --upload-certs


#2.2.3) Kubernetes Master Sunucusunda kubectl Komutunun Kullanıcı Konfigürasyonunu Ayarlama (Kubernetes Master Sunucularında)


kubectl komutlarını çalıştıracak kullanıcı için tanımlar yapılır:

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

#2.2.4) Kubernetes Ağ Eklentisini Kurun (Kubernetes Master Sunucularında)


Bu kılavuzda Flannel ağ eklentisini kullanacağız. Desteklenen diğer ağ eklentilerini seçebilirsiniz. Flannel, Kubernetes için tasarlanmış bir katman 3 ağ yapısını yapılandırmanın basit ve kolay bir yoludur.

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
POWERSHELL

Önemli

Eğer Master'ı initialize ederken podCIDR olarak 10.244.0.0/16 değerini kullanmadıysanız yukarıdaki yaml dosyasını indirip network ayarlarını burada da düzenlemelisiniz.

#2.2.5) Master Sunucu Aynı Zamanda Worker Olarak da Kullanılmak İstenirse  (Opsiyonel)


Canlı ortamlar için tavsiye edilen bir yöntem değildir.

Master'a Worker görevini eklemek için:

# Tüm Master'lara Worker görevi vermek için
kubectl  taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-

# Bazı durumlar için control-plane yerine master yazmak gerekiyor 
kubectl  taint nodes --all node-role.kubernetes.io/master:NoSchedule-

# Sadece bir Master'a Worker görevi vermek için
kubectl taint nodes <NODE_NAME> node-role.kubernetes.io/control-plane:NoSchedule-
POWERSHELL

Master'dan Worker görevini kaldırmak için:

# Tüm Master'lardan Worker'lık görevini kaldırmak için
kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule

# Sadece bir Master'dan Worker görevini kaldırmak için
kubectl taint nodes <NODE_NAME> node-role.kubernetes.io/control-plane:NoSchedule
POWERSHELL

#2.2.6) Kubernetes Worker Sunucularını Master'a Kaydetmek (Kubernetes Worker Sunucularında)


Worker sunucusunu Master'a bağlamak için bir token bilgisine ihtiyaç vardır. Bu kurulum aşamasında master node'da yazılı olarak görülecektir. Ama atlanırsa ya da tekrar görüntülemek isterseniz aşağıdaki komut kullanılabilir.

Master Node üzerinde

sudo kubeadm token create --print-join-command
POWERSHELL

Worker olacak Node(lar) üzerinde

sudo kubeadm join <MASTER_SERVER_HOSTNAME>:6443 --token <XXX> --discovery-token-ca-cert-hash sha256:<YYY>
BASH

#2.2.7) Kurulum Kontrol (Herhangi Bir Kubernetes Master Sunucusunda)


Master'dan aşağıdaki kod çalıştırıldığında Master'a ek olarak oluşturulan Node da görünüyorsa kurulum başarıyla tamamlanmış demektir.

İki dakika sonunda NotReady durumundan Ready durumuna geçmezse "kubectl describe node <NODE_NAME>" komutu ile sorun incelenmelidir.

kubectl get node

NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   5d    v1.24.10
k8s-worker1  Ready    <none>   5d    v1.24.10
BASH

#2.3) DNS Test (İsteğe Bağlı, Herhangi Bir Kubernetes Master Sunucusunda)


https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#inheriting-dns-from-the-node

kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml

kubectl get pods --namespace=kube-system -l k8s-app=kube-dns

kubectl -n kube-system get configmap coredns -oyaml

kubectl exec -i -t dnsutils -- nslookup kubernetes.default

kubectl exec -ti dnsutils -- cat /etc/resolv.conf
POWERSHELL