Ana içeriğe geç

Kubernetes Cluster Kurulum Rehberi - Proxmox Ubuntu#

Sistem Gereksinimleri ve Ön Hazırlık#

Makine Konfigürasyonları#

  • Master: 2+ CPU, 4+ GB RAM, 20+ GB Disk
  • Worker1: 2+ CPU, 2+ GB RAM, 20+ GB Disk
  • Worker2: 2+ CPU, 2+ GB RAM, 20+ GB Disk

IP Adresleri (Örnek - kendi ağınıza göre ayarlayın)#

  • Master: 192.168.1.10
  • Worker1: 192.168.1.11
  • Worker2: 192.168.1.12

ADIM 1: Mevcut Docker ve Kubernetes Temizliği#

Tüm makinelerde çalıştırın:#

# Kubernetes servislerini durdur
sudo systemctl stop kubelet kubeadm kubectl

# Docker'ı durdur
sudo systemctl stop docker

# Kubernetes paketlerini kaldır
sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni kube*

# Docker paketlerini kaldır
sudo apt-get purge -y docker.io docker-ce docker-ce-cli containerd.io

# Konfigürasyon dosyalarını temizle
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/kubelet/
sudo rm -rf /var/lib/etcd/
sudo rm -rf /etc/docker/
sudo rm -rf /var/lib/docker/
sudo rm -rf /var/lib/containerd/
sudo rm -rf ~/.kube/

# Sistem paketlerini güncelle
sudo apt-get autoremove -y
sudo apt-get autoclean
sudo apt-get update

ADIM 2: Sistem Ayarları ve Hazırlık#

Tüm makinelerde çalıştırın:#

# Hostname ayarla (her makine için farklı)
# Master için:
sudo hostnamectl set-hostname k8s-master

# Worker1 için:
sudo hostnamectl set-hostname k8s-worker1

# Worker2 için:
sudo hostnamectl set-hostname k8s-worker2

# Hosts dosyasını düzenle
sudo nano /etc/hosts

# Aşağıdaki satırları ekleyin (IP adreslerinizi düzenleyin):
192.168.1.10    k8s-master
192.168.1.11    k8s-worker1
192.168.1.12    k8s-worker2

# Swap'ı devre dışı bırak
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# Kernel modüllerini yükle
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Sysctl parametrelerini ayarla
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

# Sistem güncellemesi
sudo apt-get update && sudo apt-get upgrade -y

ADIM 3: Docker Kurulumu#

Tüm makinelerde çalıştırın:#

# Gerekli paketleri yükle
sudo apt-get update
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    apt-transport-https

# Docker GPG anahtarını ekle
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Docker repository'sini ekle
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker'ı yükle
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Docker'ı başlat ve enable et
sudo systemctl start docker
sudo systemctl enable docker

# Kullanıcıyı docker grubuna ekle
sudo usermod -aG docker $USER

# Containerd'yi yapılandır
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# SystemdCgroup'u etkinleştir
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# Containerd'yi restart et
sudo systemctl restart containerd
sudo systemctl enable containerd

ADIM 4: Kubernetes Kurulumu#

Tüm makinelerde çalıştırın:#

# Kubernetes GPG anahtarını ekle
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Kubernetes repository'sini ekle
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# Paket listesini güncelle
sudo apt-get update

# Kubernetes paketlerini yükle
sudo apt-get install -y kubelet kubeadm kubectl

# Paketleri hold et (otomatik güncellemeyi engelle)
sudo apt-mark hold kubelet kubeadm kubectl

# Kubelet'i başlat ve enable et
sudo systemctl enable kubelet

ADIM 5: Master Node Kurulumu#

Sadece Master makinede çalıştırın:#

# Cluster'ı başlat
sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.1.10 \
  --control-plane-endpoint=k8s-master

# Çıktıdaki join komutunu kaydedin! Örnek:
# kubeadm join k8s-master:6443 --token abcd12.1234567890123456 \
#     --discovery-token-ca-cert-hash sha256:1234567890abcdef...

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

# Root kullanıcısı için de ayarla
sudo mkdir -p /root/.kube
sudo cp -i /etc/kubernetes/admin.conf /root/.kube/config

# Cluster durumunu kontrol et
kubectl get nodes
kubectl get pods -A

ADIM 6: Pod Network (Flannel) Kurulumu#

Sadece Master makinede çalıştırın:#

# Flannel network plugin'ini yükle
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# Kurulumu kontrol et
kubectl get pods -n kube-flannel
kubectl get nodes

# Tüm podların Running olmasını bekleyin
watch kubectl get pods -A

ADIM 7: Worker Node'ları Cluster'a Katma#

Worker1 ve Worker2 makinelerinde çalıştırın:#

# Master'dan aldığınız join komutunu çalıştırın
# Örnek (kendi token'ınızı kullanın):
sudo kubeadm join k8s-master:6443 --token abcd12.1234567890123456 \
    --discovery-token-ca-cert-hash sha256:1234567890abcdef...

# Eğer token'ı unuttuysanız, Master'da yeni token oluşturun:
# kubeadm token create --print-join-command

Master'da kontrol edin:#

# Node'ları kontrol et
kubectl get nodes

# Detaylı bilgi
kubectl get nodes -o wide

# Tüm node'ların Ready olmasını bekleyin
watch kubectl get nodes

ADIM 8: Cluster Test ve Doğrulama#

Master makinede test uygulaması çalıştırın:#

# Test deployment oluştur
kubectl create deployment nginx-test --image=nginx

# Service oluştur
kubectl expose deployment nginx-test --port=80 --type=NodePort

# Deployment'ı scale et
kubectl scale deployment nginx-test --replicas=3

# Durumu kontrol et
kubectl get deployments
kubectl get pods -o wide
kubectl get services

# Pod'ların farklı node'larda çalıştığını kontrol edin
kubectl get pods -o wide

# Service'i test et
kubectl get svc nginx-test

ADIM 9: Dashboard Kurulumu (Opsiyonel)#

Master makinede çalıştırın:#

# Dashboard'u yükle
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

# Admin kullanıcısı oluştur
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

# Token oluştur
kubectl -n kubernetes-dashboard create token admin-user

# Dashboard'a erişim için proxy başlat
kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'

# Dashboard URL:
# http://192.168.1.10:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

ADIM 10: Monitoring ve Logging (Opsiyonel)#

Metrics Server kurulumu:#

# Metrics server'ı yükle
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# Metrics server'ı düzenle (self-signed sertifikalar için)
kubectl patch deployment metrics-server -n kube-system --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]'

# Resource kullanımını kontrol et
kubectl top nodes
kubectl top pods -A

Yararlı Komutlar ve Troubleshooting#

Cluster Yönetimi:#

# Tüm node'ları listele
kubectl get nodes -o wide

# Cluster bilgisi
kubectl cluster-info

# Namespace'leri listele
kubectl get namespaces

# Tüm pod'ları listele
kubectl get pods -A

# Node detayları
kubectl describe node k8s-master

# Events'i görüntüle
kubectl get events --sort-by=.metadata.creationTimestamp

Troubleshooting:#

# Kubelet logları
sudo journalctl -u kubelet -f

# Container runtime logları
sudo journalctl -u containerd -f

# Cluster durumu
kubectl get componentstatuses

# Pod logları
kubectl logs <pod-name> -n <namespace>

# Node'u drain et (bakım için)
kubectl drain <node-name> --ignore-daemonsets

# Node'u tekrar aktif et
kubectl uncordon <node-name>

Worker node kaldırma:#

# Master'da:
kubectl drain <node-name> --delete-emptydir-data --force --ignore-daemonsets
kubectl delete node <node-name>

# Worker node'da:
sudo kubeadm reset
sudo rm -rf /etc/kubernetes/
sudo rm -rf ~/.kube/

Güvenlik ve Optimizasyon#

Güvenlik ayarları:#

# Network policies enable et
# (Flannel default olarak desteklemez, Calico kullanabilirsiniz)

# RBAC kontrol et
kubectl get clusterrolebindings

# Pod security policies
kubectl get psp

Performance optimizasyonu:#

# Node resources
kubectl describe nodes

# Resource quotas
kubectl get resourcequotas -A

# CPU ve Memory limits
kubectl get pods -A -o custom-columns=NAME:.metadata.name,CPU:.spec.containers[*].resources.requests.cpu,MEMORY:.spec.containers[*].resources.requests.memory

Backup ve Restore#

ETCD Backup:#

# ETCD snapshot al
sudo ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# Snapshot'ı doğrula
sudo ETCDCTL_API=3 etcdctl snapshot status /tmp/etcd-backup.db

Sonuç#

Bu rehberi takip ederek: - ✅ Temiz bir Kubernetes cluster kurulumu yaptınız - ✅ 3 node'lu (1 master, 2 worker) cluster oluşturdunuz - ✅ Network plugin (Flannel) kurdunuz - ✅ Test uygulaması çalıştırdınız - ✅ Dashboard kurdunuz (opsiyonel) - ✅ Monitoring araçları kurdunuz (opsiyonel)

Cluster'ınız artık production-ready durumda. Uygulama deploy etmeye başlayabilirsiniz!

İletişim Test:#

# Tüm node'ların birbirleriyle iletişim kurduğunu test edin
kubectl get nodes
kubectl get pods -A -o wide

Alınabilecek Hatalar Rehberi#

CD-ROM Repository Hatası#

# Mevcut dosyayı yedekle
sudo mv /etc/apt/sources.list /etc/apt/sources.list.old

# Yeni sources.list oluştur
sudo tee /etc/apt/sources.list > /dev/null <<EOF
# Ubuntu 22.04 LTS (Jammy) Repository List

deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted

deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted

deb http://archive.ubuntu.com/ubuntu/ jammy universe
deb-src http://archive.ubuntu.com/ubuntu/ jammy universe
deb http://archive.ubuntu.com/ubuntu/ jammy-updates universe
deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates universe

deb http://archive.ubuntu.com/ubuntu/ jammy multiverse
deb-src http://archive.ubuntu.com/ubuntu/ jammy multiverse
deb http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse
deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse

deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted
deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted
deb http://security.ubuntu.com/ubuntu/ jammy-security universe
deb-src http://security.ubuntu.com/ubuntu/ jammy-security universe
deb http://security.ubuntu.com/ubuntu/ jammy-security multiverse
deb-src http://security.ubuntu.com/ubuntu/ jammy-security multiverse
EOF

## Veya

deb http://mirror.kku.ac.th/ubuntu jammy main restricted universe multiverse
deb http://mirror.kku.ac.th/ubuntu jammy-updates main restricted universe multiverse
deb http://mirror.kku.ac.th/ubuntu jammy-backports main restricted universe multiverse
deb http://mirror.kku.ac.th/ubuntu jammy-security main restricted universe multiverse

Eski Sistemden Kalma Port Çakışması#

# Tüm Kubernetes servislerini durdur
sudo systemctl stop kubelet
sudo systemctl stop docker
sudo systemctl stop containerd

# Kubernetes cluster'ını reset et
sudo kubeadm reset --force

# Tüm container'ları durdur ve sil
docker ps -a -q | xargs -r docker stop
docker ps -a -q | xargs -r docker rm

# Tüm image'leri sil
docker images -q | xargs -r docker rmi -f

# Kubernetes portlarını kullanan process'leri bul
sudo netstat -tulnp | grep -E ":(6443|10250|10259|10257|2379|2380)"
sudo lsof -i :10259
sudo lsof -i :10257  
sudo lsof -i :10250
sudo lsof -i :6443

# Eğer process varsa kill et
sudo pkill -f kube-apiserver
sudo pkill -f kube-controller-manager
sudo pkill -f kube-scheduler
sudo pkill -f kubelet
sudo pkill -f etcd

# Kubernetes dosyalarını tamamen sil
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/kubelet/
sudo rm -rf /var/lib/etcd/
sudo rm -rf /var/lib/dockershim/
sudo rm -rf /var/run/kubernetes/
sudo rm -rf /var/lib/cni/
sudo rm -rf /etc/cni/
sudo rm -rf ~/.kube/
sudo rm -rf /root/.kube/

# Container runtime dosyalarını temizle
sudo rm -rf /var/lib/containerd/
sudo rm -rf /var/lib/docker/
sudo rm -rf /run/containerd/
sudo rm -rf /run/docker/

# Network interface'leri temizle
sudo ip link delete cni0 2>/dev/null || true
sudo ip link delete flannel.1 2>/dev/null || true
sudo ip link delete docker0 2>/dev/null || true

# iptables kurallarını temizle
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X

# Containerd'yi yeniden yapılandır
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# Servisleri restart et
sudo systemctl restart containerd
sudo systemctl restart docker
sudo systemctl daemon-reload

# Servis durumlarını kontrol et
sudo systemctl status containerd
sudo systemctl status docker

# Portların boş olduğunu kontrol et
sudo netstat -tulnp | grep -E ":(6443|10250|10259|10257|2379|2380)"

# Eğer hala process varsa sistem restart gerekebilir
# sudo reboot

# Sistem hazır mı kontrol et
sudo kubeadm init phase preflight

# Kubeadm init'i çalıştır
sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=<K8S_MASTER_IP> \
  --control-plane-endpoint=master \
  --v=5

# Sistem restart yap
sudo reboot

# Restart sonrası tekrar dene
sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=<K8S_MASTER_IP> \
  --control-plane-endpoint=master

HTTPS Hatası ve Tokeni Kalıcı Hale Getirme#

```bash

Master'da token'ı al#

kubectl -n kubernetes-dashboard create token admin-user

Dashboard'u NodePort olarak expose et#

kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'

Port numarasını öğren#

kubectl get svc kubernetes-dashboard -n kubernetes-dashboard

HTTPS URL'ini kullan#

https://:#

Long-lived token oluştur#

cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: admin-user-secret namespace: kubernetes-dashboard annotations: kubernetes.io/service-account.name: admin-user type: kubernetes.io/service-account-token EOF

Token'ı al#

kubectl get secret admin-user-secret -n kubernetes-dashboard -o jsonpath='{.data.token}' | base64 -d ```