Kubernetes'i denemek isteyen çoğu kişi ilk adımda cesaretini kaybeder. Klasik bir kümede etcd, control plane bileşenleri, ayrı bir container runtime, ağ eklentisi ve onlarca yapılandırma dosyası devreye girer; en az üç sunucu, birkaç gigabayt RAM ve saatlerce süren bir kurulum gerekir. Oysa çoğu küçük ekibin ihtiyacı, tek bir VDS üzerinde birkaç konteyneri düzenli biçimde çalıştırmak, sürüm geçişlerini kesintisiz yapmak ve bir uygulamayı domain'e bağlamaktan ibarettir. Tam teşekküllü bir Kubernetes bu iş için fazlasıyla ağırdır.
İşte k3s tam bu boşluğu doldurur. Rancher (bugün SUSE çatısı altında) tarafından geliştirilen k3s, sertifikalı ve uyumlu bir Kubernetes dağıtımıdır; ama tek bir binary dosyası halinde paketlenmiş, gereksiz bileşenleri çıkarılmış ve 512 MB RAM'e sahip bir makinede bile çalışacak kadar hafifletilmiştir. Bu rehberde k3s'in neden bu kadar hafif olduğunu, tek komutla nasıl kurulacağını, kubectl ile kümeyi nasıl kontrol edeceğinizi, ilk uygulamanızı Deployment ve Service olarak nasıl yayına alacağınızı ve Traefik ingress ile bunu bir domain üzerinden nasıl erişilebilir yapacağınızı adım adım göreceğiz. Sonunda k3s'in ne zaman mantıklı olduğunu ve tam Kubernetes'ten farkını net biçimde ortaya koyacağız.
k3s Neden Bu Kadar Hafif?#
k3s'in "hafif" olmasının tek bir sihirli nedeni yok; birbirini tamamlayan birkaç mühendislik kararı var. En önemlisi, tüm Kubernetes bileşenlerinin (API server, scheduler, controller manager, kubelet, kube-proxy) tek bir çalıştırılabilir dosyada birleştirilmiş olması. Klasik bir kümede bunlar ayrı süreçler olarak yönetilirken k3s hepsini yaklaşık 70 MB'lık bir binary içinde toplar. Bu, hem disk alanı hem de bellek ayak izini ciddi biçimde düşürür.
İkinci büyük fark veritabanı katmanında. Standart Kubernetes, küme durumunu tutmak için etcd adında ayrı bir dağıtık veritabanı ister; etcd hem kaynak açlığıdır hem de bakımı zahmetlidir. k3s varsayılan olarak bunun yerine SQLite kullanır. Tek düğümlü bir kurulumda SQLite fazlasıyla yeterlidir ve ekstra bir servis çalıştırmanıza gerek kalmaz. İhtiyaç halinde daha sonra harici bir MySQL/PostgreSQL veya gömülü etcd'ye geçebilirsiniz.
Üçüncüsü, k3s "batteries included" felsefesiyle gelir. Kutudan çıktığında bir ingress controller (Traefik), bir yük dengeleyici (ServiceLB), yerel disk için bir storage sağlayıcı (local-path-provisioner) ve CoreDNS zaten kuruludur. Klasik Kubernetes'te bunların her birini ayrı ayrı kurmanız gerekir. Son olarak, bulut sağlayıcılarına özel gereksiz sürücüler, alfa sürümü özellikler ve eski API'ler ayıklanmıştır. Konteyner çalıştırmak için containerd gömülüdür, yani ayrıca Docker kurmanıza bile gerek yoktur. Konteyner mantığına henüz aşina değilseniz Docker nedir rehberimiz iyi bir başlangıç noktasıdır.
Kuruluma Başlamadan Önce Gereksinimler#
k3s'i tek düğümlü bir sunucuda çalıştırmak için abartılı donanıma ihtiyacınız yok, ama gerçekçi olalım. Sadece k3s'in kendisini denemek için 1 vCPU ve 512 MB RAM yeterlidir; ancak üzerine gerçek uygulamalar dağıtacaksanız en az 2 vCPU ve 2 GB RAM'lik bir VDS sunucu rahat bir başlangıç sağlar. İşletim sistemi olarak güncel bir Ubuntu 22.04/24.04 veya Debian 12 önerilir.
Kuruluma geçmeden sunucunuzu hazırlayalım. Aşağıdaki komutlar sistemi günceller ve curl gibi temel araçların yerinde olduğunu doğrular:
# Sistemi güncelle
sudo apt update && sudo apt upgrade -y
# Temel araçlar
sudo apt install -y curl
# Sunucu adını ve IP'yi teyit et (ingress ayarlarında lazım olacak)
hostname -I
Bir de güvenlik duvarı notu: k3s API server 6443, Traefik ise 80 ve 443 portlarını kullanır. Eğer sunucunuzda ufw gibi bir firewall açıksa bu portlara izin verin. Kubernetes'in pod'lar arası ağı için bazı dahili aralıkların da açık olması gerekir:
sudo ufw allow 6443/tcp # Kubernetes API
sudo ufw allow 80/tcp # HTTP (Traefik)
sudo ufw allow 443/tcp # HTTPS (Traefik)
sudo ufw allow from 10.42.0.0/16 to any # pod ağı
sudo ufw allow from 10.43.0.0/16 to any # servis ağı
sudo ufw reload
Tek Komutla k3s Kurulumu#
Şimdi bölümün beklenen kısmına geldik. k3s'i kurmak gerçekten tek bir komuttur; resmi kurulum betiği binary'i indirir, bir systemd servisi oluşturur ve kümeyi hemen başlatır:
curl -sfL https://get.k3s.io | sh -
Komut bittiğinde k3s zaten çalışıyor demektir. Kurulum betiği, k3s'i k3s.service adıyla bir systemd birimi olarak kaydeder. Bu sayede sunucu yeniden başladığında k3s otomatik olarak ayağa kalkar. Servisi denetlemek için standart systemd komutlarını kullanabilirsiniz; systemd tarafındaki mantığa hakim değilseniz systemd servis yönetimi rehberimiz işinizi kolaylaştırır:
# Durumu gör
sudo systemctl status k3s
# Yeniden başlat / durdur
sudo systemctl restart k3s
sudo systemctl stop k3s
# Canlı logları izle
sudo journalctl -u k3s -f
Kurulumu bazı bayraklarla özelleştirmek mümkün. Örneğin varsayılan gelen Traefik yerine kendi ingress controller'ınızı kullanacaksanız Traefik'i devre dışı bırakabilir ya da yerleşik yük dengeleyiciyi kapatabilirsiniz. Bunlar INSTALL_K3S_EXEC ortam değişkeniyle geçirilir:
# Traefik olmadan kur (kendi ingress'inizi getirecekseniz)
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik" sh -
# Belirli bir sürümü sabitle (üretimde önerilir)
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.30.2+k3s1" sh -
Üretim ortamında sürümü sabitlemek iyi bir alışkanlıktır; böylece betiği tekrar çalıştırdığınızda beklenmedik bir yükseltme yaşamazsınız.
kubectl ile Kümeyi Kontrol Etmek#
k3s, kubectl'in bir kopyasını kendi içinde barındırır, dolayısıyla ayrıca kurmanıza gerek yok. Ancak k3s'in yapılandırma dosyası varsayılan olarak /etc/rancher/k3s/k3s.yaml konumunda ve yalnızca root tarafından okunabilir. Root olmayan kullanıcı olarak çalışmak için bu dosyayı kendi kubeconfig'inize kopyalamak en temiz yoldur:
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
export KUBECONFIG=~/.kube/config
Bu satırı ~/.bashrc dosyanıza da ekleyerek kalıcı hale getirebilirsiniz. Artık kümeyle konuşabilirsiniz. İlk test edeceğiniz şey düğümün hazır olup olmadığıdır:
# Düğümleri listele — STATUS "Ready" olmalı
kubectl get nodes
# Örnek çıktı:
# NAME STATUS ROLES AGE VERSION
# cloutr-vds Ready control-plane,master 2m v1.30.2+k3s1
Kümede halihazırda çalışan sistem bileşenlerini görmek için tüm ad alanlarındaki pod'lara bakabilirsiniz. Traefik, CoreDNS, metrics-server ve local-path gibi k3s'in getirdiği servisleri burada göreceksiniz:
kubectl get pods -A
Günlük kullanımda en çok işinize yarayacak kubectl komutları şunlardır:
kubectl get deployments # dağıtımları listele
kubectl get svc # servisleri listele
kubectl describe pod <ad> # bir pod'un detaylı durumu
kubectl logs <pod-adi> # konteyner loglarını gör
kubectl logs -f <pod-adi> # canlı log takibi
kubectl exec -it <pod> -- sh # konteynerin içine gir
kubectl delete pod <ad> # pod'u sil (yeniden oluşur)
Bir ipucu: kubectl çok yazılan bir komut olduğu için alias k=kubectl tanımlamak parmaklarınızı yorulmaktan kurtarır.
İlk Uygulamanızı Dağıtmak — Deployment ve Service#
Şimdi kümeye gerçek bir uygulama koyalım. Kubernetes'te bir uygulamayı çalıştırmanın standart yolu iki nesnedir: Deployment konteynerin kaç kopyasının (replica) çalışacağını ve hangi imajı kullanacağını tanımlar; Service ise bu kopyalara istikrarlı bir ağ adresi verir. Basit bir nginx örneğiyle başlayalım.
Aşağıdaki YAML dosyasını web-app.yaml adıyla oluşturun:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:1.27-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "32Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: web-app
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 80
Buradaki resources bloğu küçük sunucularda önemlidir: her konteynerin isteyeceği ve aşmayacağı bellek/CPU sınırını belirtir, böylece tek bir uygulama tüm sunucuyu tüketemez. Dosyayı kümeye uygulayalım:
kubectl apply -f web-app.yaml
# Dağıtımın ilerleyişini izle
kubectl rollout status deployment/web-app
# İki pod da Running olmalı
kubectl get pods -l app=web-app
Uygulamanın çalışıp çalışmadığını dışarıya port açmadan hızlıca test etmek için port-forward kullanabilirsiniz. Bu, servisi geçici olarak yerel bir porta bağlar:
kubectl port-forward svc/web-app 8080:80
# başka bir terminalde:
curl http://localhost:8080
Bir sürüm geçişini denemek isterseniz Deployment mantığının gücünü burada görürsünüz. İmajı güncellediğinizde Kubernetes eski pod'ları teker teker kapatıp yenilerini açar, yani kesintisiz geçiş (rolling update) yapar:
kubectl set image deployment/web-app web=nginx:1.27
kubectl rollout status deployment/web-app
# Bir sorun olursa geri al:
kubectl rollout undo deployment/web-app
Traefik Ingress ile Uygulamayı Yayına Almak#
port-forward yalnızca test içindir. Uygulamayı gerçek bir alan adı üzerinden dünyaya açmak için ingress kullanırız. k3s, Traefik'i zaten kurulu getirdiği için ek bir bileşene ihtiyacınız yok. Yapmanız gereken tek şey, hangi domain'in hangi servise yönleneceğini anlatan bir Ingress nesnesi tanımlamak.
Önce elinizde bir alan adı olmalı ve onun A kaydını sunucunuzun IP adresine yönlendirmelisiniz. Henüz bir alan adınız yoksa domain kayıt sayfamızdan alabilirsiniz. DNS tarafı şöyle görünür:
; app.ornekdomain.com -> sunucu IP'niz
app.ornekdomain.com. 300 IN A 203.0.113.42
Şimdi web-app-ingress.yaml dosyasını oluşturalım. Bu ingress, app.ornekdomain.com adresine gelen istekleri az önce oluşturduğumuz web-app servisine yönlendirir:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-app-ingress
annotations:
spec.ingressClassName: traefik
spec:
ingressClassName: traefik
rules:
- host: app.ornekdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app
port:
number: 80
Uygulayın ve test edin:
kubectl apply -f web-app-ingress.yaml
kubectl get ingress
# DNS yayıldıysa artık dışarıdan erişilebilir:
curl http://app.ornekdomain.com
Elbette bugün HTTP yeterli değil; ziyaretçileriniz kilit simgesini görmek ister. Traefik, Let's Encrypt ile otomatik sertifika üretebilir ya da elinizdeki bir sertifikayı bir TLS secret olarak tanımlayabilirsiniz. Konu SSL'e geliyorsa, HTTPS'in neden zorunlu olduğunu ve sertifika seçeneklerini SSL sertifikası sayfamızdan inceleyebilirsiniz. Hazır bir sertifikayı kümeye eklemek için:
kubectl create secret tls web-app-tls \
--cert=fullchain.pem \
--key=privkey.pem
Ardından ingress'in spec.tls bölümüne bu secret'ı ekleyerek trafiği HTTPS'e taşırsınız. Böylece tek bir Traefik örneği üzerinden birden fazla domain'i, her biri kendi sertifikasıyla yayınlayabilirsiniz.
VDS'te k3s Ne Zaman Mantıklı — Tam Kubernetes'ten Farkı#
En kritik soru bu: k3s'i ne zaman seçmeli, ne zaman kaçınmalı? k3s, tam Kubernetes'in bir "oyuncak versiyonu" değildir; sertifikalı ve API uyumlu gerçek bir Kubernetes'tir. Aradaki fark yetenekte değil, ölçek ve karmaşıklık hedefindedir. Aşağıdaki tablo kararınıza yardımcı olur:
| Özellik | k3s | Klasik Kubernetes (kubeadm) |
|---|---|---|
| Binary boyutu | ~70 MB tek dosya | Çok bileşenli, yüzlerce MB |
| Minimum RAM | ~512 MB | 2 GB+ (yalnızca control plane) |
| Varsayılan veritabanı | SQLite (gömülü) | etcd (ayrı küme) |
| Kurulum süresi | ~30 saniye, tek komut | Saatler, çok adımlı |
| Ingress / LB | Kutuda (Traefik, ServiceLB) | Ayrıca kurulur |
| Container runtime | Gömülü containerd | Ayrıca yapılandırılır |
| İdeal ölçek | 1–birkaç düğüm, edge, dev | Onlarca+ düğüm, büyük prod |
| Yönetim yükü | Düşük | Yüksek |
Pratik olarak k3s şu durumlarda parlıyor: tek bir VDS veya sanal sunucu üzerinde birkaç mikroservis çalıştırmak, geliştirme ve test ortamları kurmak, CI/CD boru hatlarında geçici kümeler açmak, edge cihazlarda ya da IoT ağ geçitlerinde konteyner yönetmek, ve Kubernetes'i düşük maliyetle gerçekten öğrenmek. Yani "Kubernetes'in düzen ve otomasyonunu istiyorum ama beş sunucu ve tam zamanlı bir platform ekibi istemiyorum" diyorsanız k3s tam size göredir.
Buna karşılık, yüzlerce düğümlü bir üretim ortamı, katı yüksek erişilebilirlik gereksinimleri (birden çok bölgeye yayılmış control plane), bulut sağlayıcının yönetilen yük dengeleyicileriyle derin entegrasyon ya da regülasyona tabi büyük ekipler söz konusuysa, yönetilen bir Kubernetes hizmeti veya kubeadm ile kurulmuş tam bir küme daha uygun olur. Bir başka gerçekçi seçenek de şudur: eğer amacınız yalnızca bir WordPress veya küçük bir web sitesi yayınlamaksa, Kubernetes'e hiç girmeden paylaşımlı hosting ya da WordPress hosting çok daha az uğraşla aynı sonucu verir. Konteyner orkestrasyonu bir amaç değil, birden fazla servisi bir arada yönetme ihtiyacına verilen bir cevaptır.
Sunucu tarafını bizim yönetmemizi isterseniz, sunucu yönetimi hizmetimiz k3s kurulumundan güncellemelere kadar operasyonel yükü üstlenir; siz yalnızca uygulamalarınıza odaklanırsınız.
Güncelleme, Yedekleme ve Kaldırma#
k3s'i güncel tutmak son derece basittir. Kurulum betiğini yeni bir sürümle tekrar çalıştırdığınızda binary yerinde güncellenir ve servis yeniden başlar. Sürümü sabitleyerek kontrollü ilerlemek en sağlıklısıdır:
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.31.0+k3s1" sh -
sudo systemctl restart k3s
kubectl get nodes # yeni VERSION'ı doğrula
Yedekleme tarafında iyi haber şu: tek düğümlü SQLite kurulumunda tüm küme durumu birkaç dosyadadır. Düzenli olarak /var/lib/rancher/k3s/server/db klasörünü ve /etc/rancher/k3s/k3s.yaml yapılandırmasını yedeklemeniz kümeyi geri yükleyebilmeniz için yeterlidir:
# Basit bir küme yedeği
sudo tar czf k3s-yedek-$(date +%F).tar.gz \
/var/lib/rancher/k3s/server/db \
/var/lib/rancher/k3s/server/token \
/etc/rancher/k3s/k3s.yaml
Bu yedeği sunucu dışında güvenli bir yerde tutmanızı öneririm; disk arızası ya da yanlış bir komut her şeyi silebilir. Otomatik ve dış konumda yedek için yedekleme hizmetimiz devreye girebilir. Ayrıca uygulamalarınızın YAML dosyalarını bir Git deposunda tutmak (GitOps yaklaşımı) hem yedek hem de değişiklik geçmişi sağlar; küme silinse bile kubectl apply ile her şeyi dakikalar içinde geri kurarsınız.
k3s'i tamamen kaldırmak isterseniz kurulum betiği bunun için de bir yardımcı script bırakır. Aşağıdaki komut kümeyi durdurur, containerd'yi temizler ve ilgili dosyaları siler:
/usr/local/bin/k3s-uninstall.sh
Konteynerli uygulamalara yeni başlıyor ama hazır imajlarla hızlı sonuç almak istiyorsanız, App Center üzerindeki tek tıkla kurulan uygulamalar ve araçlar sayfamızdaki yardımcılar iyi bir köprü olur.
Sıkça Sorulan Sorular#
k3s gerçek Kubernetes mi, yoksa taklidi mi?#
k3s tam anlamıyla gerçek ve sertifikalı bir Kubernetes dağıtımıdır. CNCF'in uyumluluk testlerini geçer, aynı API'leri ve kubectl komutlarını kullanır; yazdığınız YAML dosyaları klasik bir kümede de aynen çalışır. Tek fark, gereksiz bileşenlerin çıkarılıp etcd yerine varsayılan olarak SQLite'ın kullanılması gibi hafifletme kararlarıdır. Yani öğrendiğiniz her şey, ileride büyük bir kümeye geçtiğinizde geçerliliğini korur.
k3s'i tek çekirdekli, 1 GB RAM'li bir sunucuda çalıştırabilir miyim?#
Evet, çalıştırabilirsiniz. k3s'in kendisi yaklaşık 512 MB RAM ile ayakta durur, dolayısıyla 1 GB'lık bir makinede küme rahatça açılır. Ancak unutmayın ki bu belleğin bir kısmını k3s'in kendisi tüketir; üzerine dağıtacağınız uygulamalar için pek yer kalmaz. Gerçek uygulamalar çalıştıracaksanız en az 2 GB RAM'li bir VDS ile başlamanızı, kaynak sınırlarını (resources requests/limits) dikkatle ayarlamanızı öneririm.
Docker kurmam gerekiyor mu?#
Hayır, k3s kendi container runtime'ını (containerd) gömülü olarak getirir, bu yüzden ayrıca Docker kurmanıza gerek yoktur. Zaten Kubernetes bir süredir Docker'ı doğrudan runtime olarak kullanmayı bırakmıştır. Docker imajlarınız yine de sorunsuz çalışır çünkü containerd standart OCI imaj formatını destekler; siz nginx ya da kendi yazdığınız imajı belirtir, gerisini k3s halleder. Konteyner ve imaj kavramlarını tazelemek isterseniz Docker başlangıç rehberimize göz atabilirsiniz.
Traefik yerine başka bir ingress controller kullanabilir miyim?#
Kesinlikle kullanabilirsiniz. k3s'i kurarken --disable traefik bayrağını geçerek yerleşik Traefik'i devre dışı bırakır, ardından ingress-nginx gibi tercih ettiğiniz controller'ı kendiniz kurabilirsiniz. Çoğu kullanıcı için varsayılan Traefik fazlasıyla yeterlidir ve ekstra kurulum derdi olmadan HTTP/HTTPS yönlendirmesi sağlar; ancak ekibinizin başka bir controller ile deneyimi varsa geçiş yapmakta serbestsiniz.
Tek düğümlü k3s üretim için yeterince güvenilir mi?#
Küçük ve orta ölçekli projeler için gayet yeterlidir, fakat tek düğümlü bir kurulumun doğası gereği tek arıza noktası olduğunu unutmamak gerekir. Sunucu çökerse uygulamanız da çöker; Kubernetes bu tek makinede pod'ları yeniden başlatabilir ama makinenin kendisi için bir yedek sağlamaz. Kritik üretim yükleri için düzenli yedek almanız, izleme kurmanız ve büyüdükçe birden fazla düğümlü bir kümeye geçmeyi planlamanız akıllıca olur.
YAML dosyalarımı nerede saklamalıyım?#
Tüm Deployment, Service ve Ingress tanımlarınızı bir Git deposunda tutmanızı şiddetle öneririm. Böylece hem değişikliklerin geçmişine sahip olur hem de küme silindiğinde kubectl apply -f ile her şeyi hızlıca geri kurabilirsiniz. Bu yaklaşıma GitOps denir ve manuel komutlarla küme durumunu takip etmeye çalışmaktan çok daha güvenlidir. Depoyu ayrıca ekip arkadaşlarınızla ortak çalışmanın da temeli haline getirebilirsiniz.
Kapanış#
k3s, Kubernetes'in düzenini ve otomasyonunu, klasik bir kümenin karmaşıklığı ve donanım maliyeti olmadan tek bir sunucuya taşımanın en pratik yoludur. Tek komutla kurdunuz, kubectl ile kümeyi denetlediniz, ilk uygulamanızı Deployment ve Service olarak yayına aldınız, Traefik ingress ile bir domain'e bağladınız ve güncelleme–yedekleme rutinini gördünüz. Buradan sonrası tekrar ve pratik meselesi: kendi uygulamalarınızı imajlayıp aynı desenle dağıttıkça Kubernetes refleksleriniz hızla gelişecek.
Bu kurulumu sağlam bir zemine oturtmak için önce iyi bir sunucuya ihtiyacınız var. Kaynaklarını tam denetleyebileceğiniz, root erişimli bir ortam için VDS sunucu paketlerimizi inceleyebilir, tüm sunucu seçeneklerini sunucu sayfamızdan karşılaştırabilirsiniz. Kurulum, güncelleme ve izleme yükünü bize devretmek isterseniz sunucu yönetimi hizmetimiz yanınızda; sunucularınızı 7/24 dış tehditlere karşı korumak için de DDoS koruma ve WAF çözümlerimize göz atabilirsiniz. Siz uygulamanıza odaklanın, altyapıyı Clou.TR üstlensin.