Uygulamaları, hatta gün geçtikçe artık veritabanı, queue gibi servisleri de Kubernetes üzerinde sıkça çalıştırır olduk. Tüm bunları yaparken ise sıkça yeni özellikleri denemek, lab ortamları kurmak, geliştirme yapmak gibi çok sayıda sebeple, hızlıca kurup silebileceğimiz Kubernetes clusterlarına ihtiyaç duyabiliyoruz. Kendi bilgisayarımızda birçok sanal makine açıp bir cluster kurmanın ne kadar zaman ve sistem kaynağı isteyeceğini de göz önünde bulundurunca; bu her gün, hatta bazen gün içerisinde defalarca kez yapabileceğimiz bir aktivite olmaktan çıkıyor. Tüm bunların yanına network ayarları, DNS, load balancing gibi özelliklere ait ayarları eklemeye çalışırsak bir şeyler denemek oldukça zorlaşabiliyor. İşte tüm bunlar ve çok daha fazlası için, ister kendi bilgisayarımızda istersek de bir sanal sunucuda çalıştırabileceğimiz ve bizim için Kubernetes cluster kurulumunu anahtar teslim olarak saniyeler içerisinde yapacak bir araçtan bu yazıda bahsedeceğiz: k3d. Hatta k3d ile birden fazla node’a sahip clusterları ve birden fazla manager node’a sahip, yani yüksek erişilebilir(highly available) clusterları da kurabiliyor; bir bilgisayarda birden fazla clusterı da gerçekleyebiliyoruz.
K3d Nasıl çalışıyor?
K3d birçok sanal makine açarak hem bir sanallaştırma bağımlılığı oluşturmak hem de çok fazla sistem kaynağı harcamak yerine, Docker containerları açarak bunları birer Kubernetes node’u olarak kullanıyor. Bu sayede bir container açacağımız sürede, yani saniyeler içerisinde bir Kubernetes node’u kurabilmiş oluyoruz. Aynı zamanda Docker çalışan herhangi bir ortamda kendimize bu şekilde clusterlar kurma şansımız oluyor.
Burada bir noktayı aklımızda bulundurmamızda fayda var. Aramızda container in container fikrine daha önce denk gelmiş olanlar olabilir. Hatta bazılarımız belki Docker in Docker projesi ile, bir Docker containerı içerisinde tekrar Docker kurulumu yaparak containerlar açmış olabilirler.
K3d de açtığı Docker containerları içerisinde containerd çalıştırıyor. Hatta bunu yaparken de aslında k3s kuruyor. Böylece bir Docker containerı, k3s’in bir node’u haline geliyor.
K3d bu süreci tamamen otomatik bir şekilde ilerletip, kubectl komutunu hiç uğraşmadan çalıştırabilmemiz için kubeconfig dosyasını da kendisi ayarlıyor.
K3d ile Local Kubernetes Clusterı Nasıl Kurulur? Neler Gerekli?
Kendi bilgisayarımızda veya bir sunucu üzerinde Kubernetes clusterını kolayca kurabilmek için aslında karmaşık ihtiyaçlarımız yok. Docker, kubectl ve k3d‘nin yüklü-çalışır durumda olması yeterli. Bu yazıda, bir Ubuntu (16, 18 ya da 20), CentOS (7 ya da 8) veya Rocky Linux gibi GNU/Linux dağıtımlarında bu araçların kurulumları için örnek olması açısından komutları yazacağım. Bir Windows veya Mac OS üzerinde bunları yapacaksanız, üç aracı da kendi web sitelerinden kurabilirsiniz:
- Docker: https://docs.docker.com/get-docker/
- Kubectl: https://kubernetes.io/docs/tasks/tools/
- K3d: https://k3d.io/stable/
Alternatif olarak, kendi bilgisayarınızda Ubuntu 20.04 yüklü yeni bir sanal makine üzerinde de bu komutları çalıştırarak deneyebilirsiniz.
İlk olarak, Docker ve Kubectl kurulumlarını yapalım:
curl -sSL https://get.docker.com | bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl && rm kubectl
K3d kurulumunu yapalım:
curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
Bu şekilde kurulum yapmayı bu yazı kapsamında hızlı olması için tercih etsek de birçok durumda shell scriptleri indirerek kurulum yapmak güvenli görülmemektedir. Bu konuda araçların resmi dokümantasyonlarındaki kurulum yöntemlerini kontrol etmenizi de öneririm.
K3d ile Lokal Kubernetes Clusterı Oluşturmak
K3d kurulumu tamamlandıktan sonra, yerel bir Kubernetes clusterı oluşturmak şu oldukça kısa ve basit komutu kullanabiliriz:
k3d cluster create
Bu komut, varsayılanda tek node’lu bir Kubernetes clusterı (bu boyuta cluster demek çok doğru gelmese de) kurulumunu yaparak hem manager hem worker olarak bu node’u çalıştırır. İlk sefer çalıştırdığınızda Docker imajlarını indireceği için biraz zaman alabilir, bu yüzden sonraki seferlerin daha hızlı olmasını bekleriz. Komut tamamlandıktan sonra cluster durumunu sorabiliriz:
$ kubectl cluster-info
Kubernetes control plane is running at https://0.0.0.0:34493
CoreDNS is running at https://0.0.0.0:34493/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://0.0.0.0:34493/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Docker üzerinde açılmış olan containerlar:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8a8b06b8329 rancher/k3d-proxy:5.2.2 "/bin/sh -c nginx-pr…" 38 seconds ago Up 33 seconds 80/tcp, 0.0.0.0:34493->6443/tcp k3d-k3s-default-serverlb
5f02f4e991e1 rancher/k3s:v1.21.7-k3s1 "/bin/k3s server --t…" 43 seconds ago Up 37 seconds k3d-k3s-default-server-0
Çıktıda ilk sıradaki container, Kubernetes API sunucusu önündeki load balancer olarak iş yapıyor. İkinci sıradaki ise bizim node’umuz. Bunu Kubernetes’e sorarak doğrulayalım:
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3d-k3s-default-server-0 Ready control-plane,master 29s v1.21.7+k3s1 172.18.0.3 <none> Unknown 5.11.0-1027-aws containerd://1.4.12-k3s1
Local Kubernetes clusterını silmek için de yine çok kısa bir komut kullanmamız yeterli:
$ k3d cluster delete
...
Multi Node ve Yüksek Erişilebilir Local Kubernetes Clusterı
Bir master giderse, bir node giderse ne olur? Geri geldiğinde ne olur? Bunlar gibi çok sayıda durumu hızlıca test edebilmek için yerel olarak yüksek erişilebilir(highly available) Kubernetes clusterları kurmayı tercih edebiliriz. Bunu yapmak da k3d ile çok kolay:
$ k3d cluster create -s 3 -a 3
...
Tamamlandığında node’ları kontrol edebiliriz:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k3d-k3s-default-agent-0 Ready <none> 17m v1.21.7+k3s1
k3d-k3s-default-agent-1 Ready <none> 17m v1.21.7+k3s1
k3d-k3s-default-agent-2 Ready <none> 17m v1.21.7+k3s1
k3d-k3s-default-server-0 Ready control-plane,etcd,master 17m v1.21.7+k3s1
k3d-k3s-default-server-1 Ready control-plane,etcd,master 17m v1.21.7+k3s1
k3d-k3s-default-server-2 Ready control-plane,etcd,master 17m v1.21.7+k3s1
İstersek her seferinde parametrelerle uğraşmak yerine bir YAML dosyası hazırlayıp k3d’ye bu dosyayı da verebiliriz. Bu şekilde sadece bunları değil, çok sayıda parametreyi kaydederek her seferinde yazmaktan kurtulabiliriz.
Benzer Projeler
Kendi bilgisayarımıza veya bir sanal sunucu üzerine geliştirme yapmak veya lab ortamı kurmak gibi amaçlarla Kubernetes kurulumu sağlayan çok sayıda araç var. Bunlar arasından alternatif olarak benzer mantıkla çalışan KinD‘ı bir örnek olarak verebiliriz.