Kubernetes'i öğrenmeye başlayan herkesin bir noktada sorduğu soru: Kubernetes sunucusu nasıl kurulur? Bu yazıda farklı kurulum yöntemlerini karşılaştırıp ardından en yaygın yöntem olan kubeadm ile Ubuntu üzerinde adım adım bir Kubernetes cluster'ı kuruyoruz. Kubernetes'in ne olduğunu henüz bilmiyorsanız önce Kubernetes nedir yazımıza göz atmanızı öneririz.
Kubernetes Kurulum Yöntemleri
Kubernetes'i kurmanın tek bir yolu yok. İhtiyacınıza ve tecrübenize göre farklı araçlar var:
| Yöntem | Zorluk | Özelliği | Kimler için? |
|---|---|---|---|
| kubeadm | Orta | Resmi araç, "saf" Kubernetes kurar | Kubernetes'i derinlemesine öğrenmek isteyenler, üretim ortamları |
| k3s | Kolay | Hafif dağıtım, tek komutla kurulur | Küçük sunucular, test, edge |
| RKE2 | Orta | Güvenlik odaklı, Rancher ile uyumlu | Kurumsal ortamlar, Rancher kullananlar |
| MicroK8s | Kolay | Snap paketiyle kurulur, eklentilerle genişler | Geliştirme ortamları |
| Yönetilen Kubernetes | Kolay | Control plane'i sağlayıcı yönetir | Büyük ve kritik iş yükleri, bütçesi olanlar |
| Hazır Kubernetes Server | Çok kolay | Kubernetes kurulu teslim edilir | Hemen başlamak isteyenler |
Bu yazıda kubeadm'i anlatıyoruz çünkü hem resmi yöntem, hem de kurarken Kubernetes'in parçalarını gerçekten öğreniyorsunuz.
Donanım Gereksinimleri
| Rol | Minimum | Önerilen |
|---|---|---|
| Control plane | 2 CPU, 2 GB RAM | 4 CPU, 8 GB RAM, NVMe disk |
| Worker | 1–2 CPU, 2 GB RAM | İş yükünüze göre; genelde 4+ CPU, 8+ GB RAM |
| Tek node (hepsi bir arada) | 2 CPU, 4 GB RAM | 4 CPU, 8–16 GB RAM |
Tüm sunucuların birbirine ağ üzerinden erişebilmesi, her birinin farklı bir hostname'e sahip olması ve swap'ın kapalı olması gerekiyor.
Tek Node mu, Çok Node mu?
| Tek node | Çok node | Yüksek erişilebilirlik (HA) | |
|---|---|---|---|
| Sunucu sayısı | 1 | 1 control plane + 2+ worker | 3 control plane + 2+ worker |
| Bir sunucu çökerse | Herşey durur | Worker çökerse pod'lar taşınır; control plane çökerse yönetim durur | Cluster çalışmaya devam eder |
| Kimler için? | Öğrenme, test, staging | Küçük–orta üretim | Kritik üretim ortamları |
Açılması Gereken Portlar
| Port | Nerede? | Ne için? |
|---|---|---|
| 6443 | Control plane | Kubernetes API sunucusu (kubectl buraya bağlanır) |
| 2379–2380 | Control plane | etcd veritabanı |
| 10250 | Tüm node'lar | kubelet API |
| 10257 / 10259 | Control plane | controller-manager / scheduler |
| 30000–32767 | Tüm node'lar | NodePort servisleri |
Kullandığınız ağ eklentisi de kendi portlarını kullanır (örneğin Flannel için UDP 8472). Güvenlik duvarında node'lar arasındaki trafiğe izin verdiğinizden emin olun.
kubeadm ile Kubernetes Kurulumu (Ubuntu 24.04)
Aşağıdaki 1–4. adımları tüm sunucularda (control plane ve worker'lar), 5–7. adımları sadece control plane'de çalıştırın.
1. Hazırlık: hostname ve swap
Kubelet varsayılan olarak swap açıkken çalışmıyor, o yüzden kapatıyoruz:
sudo hostnamectl set-hostname k8s-cp-1 # her sunucuya farklı bir ad verin
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab # yeniden başlatmada da kapalı kalsın
2. Kernel modülleri ve ağ ayarları
Pod'lar arası trafiğin düzgün yönlendirilmesi için gerekli modülleri ve ayarları açıyoruz:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
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
3. Container runtime: containerd
Kubernetes container'ları çalıştırmak için bir runtime'a ihtiyaç duyuyor. containerd'yi kurup cgroup sürücüsünü systemd olarak ayarlıyoruz; bu ayar atlanırsa kubelet sürekli yeniden başlar:
sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
4. kubeadm, kubelet ve kubectl
Paketleri resmi Kubernetes deposundan kuruyoruz. Sürüm numarası depo adresinin içinde geçiyor; kurulumdan önce kubernetes.io'dan güncel kararlı sürümü kontrol edip K8S_VERSION değerini ona göre güncelleyin:
K8S_VERSION=v1.34 # güncel sürümü kubernetes.io'dan kontrol edin
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/${K8S_VERSION}/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:/${K8S_VERSION}/deb/ /" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # paketler kendiliğinden güncellenmesin
5. Cluster'ı başlatın (sadece control plane)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Komut bitince ekrana bir kubeadm join ... komutu basılır. Worker eklerken lazım olacak, bir kenara not edin.
6. Ağ eklentisini (CNI) kurun
Pod'ların birbiriyle konuşabilmesi için bir ağ eklentisi şart. Basit ve hafif olduğu için Flannel kullanıyoruz (Calico veya Cilium da çok yaygın seçenekler):
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
kubectl get nodes # birkaç dakika içinde STATUS: Ready olmalı
7. Tek node kullanacaksanız: control plane'de pod çalıştırmaya izin verin
Varsayılan olarak control plane'e uygulama pod'u yerleştirilmez. Tek sunuculu bir kurulumda bu engeli kaldırmanız gerekiyor:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
8. Worker node'ları ekleyin
# worker sunucuda, kubeadm init çıktısındaki komutu çalıştırın:
sudo kubeadm join 10.0.0.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:<hash>
# komutu kaybettiyseniz control plane'de yeniden üretin:
kubeadm token create --print-join-command
9. Test edin
Her şey yolundaysa basit bir nginx uygulaması deploy edip dışarıdan erişelim:
kubectl create deployment web --image=nginx
kubectl expose deployment web --port=80 --type=NodePort
kubectl get svc web # PORT(S) sütunundaki 30000-32767 arası portu not edin
Tarayıcıdan http://SUNUCU_IP:NODEPORT adresine girdiğinizde nginx karşılama sayfasını görüyorsanız cluster'ınız hazır. Komutların detayları için kubectl komutları yazımıza bakabilirsiniz.
Kurulumdan Sonra Yapılması Gerekenler
- Ingress controller: Alan adına göre trafiği servislere yönlendirmek için (ör. ingress-nginx) ve sertifikalar için cert-manager.
- Kalıcı depolama: Veritabanı gibi uygulamalar için bir StorageClass (tek node için local-path-provisioner basit bir başlangıç).
- metrics-server:
kubectl topve otomatik ölçeklendirme için. - Yedekleme: etcd'nin düzenli yedeğini alın; uygulama verileri için Velero gibi araçlar kullanabilirsiniz.
- Güncellemeler: kubeadm ile sürüm yükseltmelerini düzenli takip edin, birden fazla minor sürüm atlamayın.
Daha Hızlı Bir Yol: k3s
Tüm bu adımlar fazla geldiyse, hafif bir Kubernetes dağıtımı olan k3s tek komutla kuruluyor ve küçük sunucular için gayet iyi bir seçenek:
curl -sfL https://get.k3s.io | sh -
sudo k3s kubectl get nodes
Sık Karşılaşılan Sorunlar
| Belirti | Olası sebep | Çözüm |
|---|---|---|
Node NotReady durumunda | Ağ eklentisi (CNI) kurulmamış | 6. adımı uygulayın, pod'ların çalıştığını kontrol edin |
| kubelet sürekli yeniden başlıyor | Swap açık veya cgroup sürücüsü uyumsuz | 1. ve 3. adımları kontrol edin (SystemdCgroup = true) |
kubeadm join hata veriyor | Token süresi dolmuş (varsayılan 24 saat) | kubeadm token create --print-join-command |
Pod'lar Pending kalıyor | Tek node'da taint kaldırılmamış ya da kaynak yetersiz | 7. adım; kubectl describe pod ile sebebe bakın |
| Worker control plane'e bağlanamıyor | 6443 portu kapalı | Güvenlik duvarı kurallarını kontrol edin |
Hiç Uğraşmadan Kubernetes İsterseniz
Amacınız Kubernetes kurmak değil de Kubernetes üzerinde uygulama çalıştırmaksa, bu adımların hepsini atlayabilirsiniz. VECDC Kubernetes Server paketleri Kubernetes kurulu olarak teslim ediliyor; aylık $6'dan başlıyor ve otomatik kurulum sayesinde yaklaşık 5 dakikada kubeconfig dosyanız hazır oluyor. Kendi kurulumunuzu yapmak isterseniz de NVMe diskli sanal sunucularımız bu rehber için birebir.
Çok node'lu, yüksek erişilebilir ve üretime hazır bir cluster lazımsa Kubernetes danışmanlık ekibimiz tasarımdan kuruluma kadar destek veriyor; birden fazla cluster'ı tek panelden yönetmek için Rancher danışmanlığı da sunuyoruz.
Sık Sorulan Sorular
Kubernetes kurmak için kaç sunucu gerekir?
Öğrenme ve test için tek bir sunucu yeterlidir; control plane ve worker aynı makinede çalışır. Üretim için genelde 1 control plane ve en az 2 worker, yüksek erişilebilirlik için ise 3 control plane önerilir.
kubeadm mi, k3s mi kullanmalıyım?
Kubernetes'i derinlemesine öğrenmek ve standart bir kurulum yapmak istiyorsanız kubeadm; küçük sunucularda hızlı ve hafif bir kurulum istiyorsanız k3s daha uygundur. İkisi de standart Kubernetes API'sini sunar.
Kubernetes kurulumu ne kadar sürer?
Hazırlıklı bir şekilde kubeadm ile tek node bir kurulum genelde 20–40 dakika sürer. k3s ile birkaç dakikada, hazır bir Kubernetes Server ile ise yaklaşık 5 dakikada kullanıma hazır bir cluster elde edebilirsiniz.
Kubernetes için swap neden kapatılmalı?
kubelet, kaynak yönetimini öngörülebilir tutmak için varsayılan olarak swap açıkken çalışmayı reddeder. Yeni sürümlerde swap desteği eklense de standart kurulumlarda swap'ın kapatılması önerilir.
Kısacası
Kubernetes kurmak ilk bakışta karışık görünse de adımlar belli: sunucuları hazırla, containerd'yi kur, kubeadm ile cluster'ı başlat, ağ eklentisini ekle ve worker'ları bağla. Bir kere kendiniz kurduğunuzda Kubernetes'in nasıl çalıştığını çok daha iyi anlıyorsunuz. Kurulumda takıldığınız birşey olursa bize yazın, yardımcı olalım.