K3D ile K3S Kubernetes Cluster Kurulumu

Giriş
Bundan önceki yazımda Kind’ı ve Kind aracını kullanarak nasıl Kubernetes Cluster’ı kurabileceğimizi ele almıştım (Kind hakkındaki yazıma buradan ulaşabilirsiniz). Bu yazımda ise Rancher’ın bir aracı olan K3D ile Linux tabanlı bir işletim sisteminde nasıl Kubernetes Cluster’ı oluşturabileceğimize değineceğim.
K3S (Lightweight Kubernetes)
K3S, 2019 yılında açık kaynak olarak Rancher tarafından piyasaya sürülen hafif bir Kubernetes dağıtımıdır. K3S, 100MB’ın altında bir binary dosyası olarak tasarlanmıştır. Ayrıca CNCF (Cloud Native Computing Foundation) sertifikalı bir Kubernetes aracıdır. K3S, hafifliği sayesinde düşük donanımlı sistemlerde bile Kubernetes Cluster’ı kurabilmemizi sağlamakta. K3S’nin minimum sistem gereksinimleri şu şekilde;
- Linux 3.10
- 512MB RAM (sunucu)
- 75MB RAM (node)
- 200MB disk alanı
K3D
K3D, hızlı bir şekilde Kubernetes Cluster’ı oluşturmamızı sağlayan bir araçtır. K3D ile oluşturulan cluster’lar oldukça hafiftir çünkü yukarıda anlattığım K3S’i baz almaktadır. Yani K3D kullanarak hızla, minimum efor ve minimum kaynak kullanımı ile bir K3S cluster’ı kurabiliyoruz. Ayrıca K3D cross-platform olduğu için Windows, Mac OS ve Linux cihazlarda çalışabilmekte ve birden çok cluster oluşturmayı desteklemektedir.
1) Kurulumlar
Gereksinimler
- Docker
- Kubectl
- K3D
1.1. Docker Kurulumu
Docker kurulumunu hızlı bir şekilde yapmak için aşağıda verdiğim komut ile Rancher tarafından hazırlanan betiği kullanabilirsiniz veya bu adresten yükleyeceğiniz ortama uygun kurulum adımlarını takip edebilirsiniz.
[Rancher Script] $ curl https://releases.rancher.com/install-docker/19.03.sh | sh
1.2. Kubectl Kurulumu
Kubernetes API ile haberleşmek için Kubectl kurmamız gerekiyor, bunu da aşağıdaki adımları takip ederek kolaylıkla yapabilirsiniz.
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" $ chmod +x ./kubectl $ sudo mv ./kubectl /usr/local/bin/kubectl
Tüm bu işlemlerden sonra aşağıdaki komut ile kubectl versiyon kontrolünü yapabilirsiniz.
$ kubectl version --client
1.3. K3D Kurulumu
K3D kurulumu oldukça basit, tek yapmanız gereken terminalinize aşağıdaki komutu girmek. Dilerseniz bu adresten kurulum adımlarını kendi ortamınıza göre yapabilirsiniz.
$ wget -q -O - https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash

Siz de yukarıdaki resimdeki gibi bir çıktı aldıysanız kurulumu başarılı bir şekilde yaptınız demektir. İsterseniz versiyon kontrolü yaparak kurulumunuzu doğrulayabilirsiniz, bunun için terminalinize aşağıdaki komutu girmeniz gerekiyor.
$ k3d --version
1.4. K3D Komutları
Kind ile ilgili yazımı okuduysanız veya daha önce kullandıysanız Kind ile cluster kurulumunun ne kadar basit olduğunu biliyorsunuzdur. K3D, CLI tarafından bakınca Kind’a oldukça benziyor. Cluster kurulumuna geçmeden önce terminalimize sadece k3d yazarak bize neler sunduğuna bir bakalım.

k3d cluster komutu ile;
- Yeni bir k3s cluster kurabiliriz.
- Kurduğumuz cluster’ları listeleyebiliriz.
- Kurduğumuz cluster’ı durdurabiliriz.
- Kurduğumuz cluster’ı başlatabiliriz.
- Kurduğumuz cluster’ı silebiliriz.
k3d node komutu ile;
- Yeni bir node oluşturabiliriz.
- Oluşturulan node’ları listeleyebiliriz.
- Node’ları durdurabiliriz.
- Node’ları başlatabiliriz.
- Node’ları silebiliriz.
Bunun dışında k3d kubeconfig komutu ile cluster config dosyasının çıktısını elde edebilirsiniz.
1.5. K3D ile Cluster Kurulumu
Artık cluster kurulumuna geçebiliriz. Aşağıdaki komut ile siz de kendi seçtiğiniz bir isim ile cluster oluşturmaya başlayabilirsiniz.
$ k3d cluster create [NAME]

İlk kurulumda yaklaşık 150–200mb boyutunda bir docker imajı indirdiği için kurulum süresi internet hızınıza göre biraz zaman alabilir ama bu imajları silmediğiniz sürece bir sonraki cluster kurulumlarınız daha kısa sürecektir.
k3d cluster list komutu ile oluşturduğunuz cluster’ları ve durumlarını görebilirsiniz.

Eğer bu adımları takip ederek uzak bir sunucuya K3D kurulumu yapıp cluster’ı bu ortamda oluşturduysanız, bir uygulama kurduğunuz zaman bu uygulamaya erişemezsiniz. Çünkü herhangi bir port’a izin vermediğimiz için sadece cluster içinden erişime açık olacaktır.
Sonraki adımda uygulamalarımıza nasıl erişebiliriz buna değineceğim.$ k3d cluster delete -a --> Tüm cluster'ları siler $ k3d cluster delete [name] --> Belirtilen cluster'ı siler
2) Servislere Erişmek
Kind yazımda Kind’ın henüz çok yeni olduğunu, birtakım sorunlarının olduğunu söylemiştim. Bunlardan birisi de eğer Kind’ı local ortamımıza değil de uzak bir sunucuya kurduysak port açmanın meşakkatli bir iş olmasıydı. Kind kullanırken elle tek tek port açmamız gerekiyor ve çalışan bir cluster’da yeni port ihtiyacımız olduğu takdirde cluster’ı silip, config dosyasını tekrar ayarlayıp ayağa kaldırmamız gerekiyordu. K3D kullanırken de öncesinde port açmamız gerekiyor fakat bunun için bize birçok yol sunmakta. İster node-port olarak istersek de Load Balancer aracılığı ile uygulamalarımıza erişebiliyoruz.
2.1. K3D Load Balancer Ayarları
K3D varsayılan olarak traefik kullanıyor ve ben de traefik üzerinden ilerleyeceğim. Eğer K3D kurulumunu uzaktaki bir sunucuya yaptıysanız erişim için dışarı port açmanız gerekiyor. Bunun için aşağıdaki komutu kullanarak load balancer’ımızı dışarı açıyoruz.
$ k3d cluster create [NAME] -p 80:80@loadbalancer
Cluster kurulduktan sonra örnek bir nginx uygulamasını ayağa kaldıralım. Bunun için aşağıdaki kubectl komutunu çalıştırabilirsiniz.
$ kubectl create deployment demo --image nginx --port 80
Bu komut ile iç portu 80 olan ve ismi demo olan bir nginx imajı ayağa kaldırdık. Şimdi ise oluşturduğumuz Deployment’a erişmek için bir servis oluşturalım.
$ kubectl expose deployment demo
Servisimizi de başarılı bir şekilde oluşturduktan sonra artık load balancer ayarlarını yapabiliriz. Şimdi demo-ingress.yaml adında bir dosya oluşturalım ve içeriğini aşağıdaki gibi düzenleyelim.
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx annotations: ingress.kubernetes.io/ssl-redirect: "false" spec: rules: - http: paths: - path: / backend: serviceName: demo servicePort: 80
Dosyayı Kubernetes’de deploy etmek için;
$ kubectl create -f demo-ingress.yaml
Bu şekilde az önce oluşturduğumuz demo nginx uygulamasının load balancer ayarlarını yapmış olduk. kubectl get pod,svc,ing komutu ile oluşturduğumuz Kubernetes objelerini görebiliriz.

Siz de yukarıdaki gibi bir çıktı aldıysanız artık test edebiliriz. Kurulumu kendi bilgisayarınıza yaptıysanız localhost ile, uzak sunucu üzerine yaptıysanız sunucu IP adresi ile nginx sayfasına ulaşabilir ve kurulumu doğrulayabilirsiniz.

2.2. K3D NodePort Ayarları
Yukarıda bahsettiğim gibi Kind kullanırken portların tek tek config dosyasına girilmesi ve yeni bir port ihtiyacı doğduğunda cluster’ın baştan kurulması gerekiyor. K3D bu noktada Kind’dan ayrılıyor çünkü k3d ile port açmak için belli bir port aralığını açmasını söyleyebiliyoruz. Hemen aşağıdaki örnek ile anlatmaya devam edeyim.
$ k3d cluster create [NAME] -p "30000-30100:30000-30100@server[0]"
Yukarıdaki komutta yeni bir parametre ekledik. “-p” (publish) parametresini docker kullananlar sık sık kullanmıştır. Bu parametre ile host-container portu açabiliyoruz. Yukarıda da bu işlemi yaptık ve 30000–30100 port aralığını hem host tarafında hem de konteyner tarafında açtık. (Kubernetes default node port aralığı: 30000–32767)
NOT: 30000–32767 aralığını açmanızı düşük donanımlı sistemler için önermiyorum çünkü portları açınca ciddi miktarda ram kullanımı artmakta. Büyük port aralıkları tanımladığım bazı testlerimde docker’ın çalışmamasına neden oldu. Hata alırsanız bu aralığı düşürebilir ve servisi yeniden başlatabilirsiniz.
Şimdi, yukarıda kurduğumuz nginx uygulamasını bu sefer nodeport açarak kuralım. demo-nodeport.yaml isimli bir dosya oluşturun ve aşağıdaki satırları içerisine ekleyip kaydedin.
apiVersion: apps/v1 kind: Deployment metadata: name: demo labels: app: demo spec: replicas: 1 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - name: demo image: nginx --- kind: Service apiVersion: v1 metadata: name: demo spec: selector: app: demo type: NodePort ports: - name: node-port port: 80 nodePort: 30050
Yukardaki yaml dosyası ile deployment ve service yaratıyoruz. Ben NodePort için 30050 adresini kullanacağım, siz de açtığınız aralıktan bir port belirleyip belirlediğiniz port üzerinden uygulamaya erişebilirsiniz. Şimdi demo-nodeport.yaml dosyasını uygulayalım.
$ kubectl create -f demo-nodeport.yaml

kubectl get pod,svc komutu ile oluşturduğumuz objeleri görebiliriz. Sorunsuz bir şekilde pod’unuz ve servisiniz oluşturulduysa tarayıcınızdan uygulamaya erişebilirsiniz. (IP:NODEPORT)

3) Multi Node Cluster Kurulumu
K3D ile birden fazla node’a sahip cluster da kurabilirsiniz. Biz 3 node’lu bir cluster kurulumu yapalım ve daha sonra k3d node komutu ile çalışan cluster’a ek olarak 1 node daha ekleyelim. Öncelikle aşağıdaki komut ile K3D’ye 3 node’luk bir cluster kurmasını söylüyoruz.
$ k3d cluster create [NAME] --servers 3
Node’lar oluştuktan sonra aşağıdaki komutlar ile node’larımızın durumunu görebiliriz.
[K3D İLE KONTROL ETME] $ k3d cluster list
[KUBECTL İLE KONTROL ETME] $ kubectl get node

3.1. Node Ekleme
Node’larımız başarılı bir şekilde oluştu. Peki ihtiyaca göre yeni bir node eklemek istersek ne yapmamız gerekiyor? Çok kolay bir şekilde aşağıdaki komut ile az önce oluşturduğumuz cluster’a node ekleyebiliriz.
$ k3d create node new-node --cluster [CLUSTER-NAME] --role server

4) Traefik Dashboard Etkinleştirme
Traefik paneli, varsayılan olarak devre dışı gelmektedir. Paneli aktifleştirme işlemi en kısa yoldan nasıl yapılabilir buna da değinmek istiyorum. Bunun için Kubernetes’den traefik ConfigMap’i düzenlememiz gerekiyor. Aşağıdaki komut ile ilgili ConfigMap’i düzenlemek için açıyoruz.
$ kubectl edit configmap traefik -n kube-system
Daha sonra aşağıdaki satırları açtığımız ConfigMap içerisine ekliyoruz ve kaydedip çıkıyoruz. Yardımcı olması açısından aşağıdaki ekran görüntüsünü görebilirsiniz.
[api] dashboard = true
Yukarıdaki ilk komut ile configmap’imizi düzenlemek için açıyoruz. Daha sonra belirtilen komutu açtığımız configmap içerisine ekliyoruz ve kaydedip çıkıyoruz. Yardımcı olması açısından bir sonraki adımda ekran görüntüsünü görebilirsiniz.

Şimdi ayarların geçerli olması için pod’u güncellememiz gerekiyor. Bunun için pod’u silebilirsiniz ya da deployment boyutunu ölçeklendirebilirsiniz. Ben ikinci seçenek ile ilerleyeceğim. Bunun için öncelikle pod sayısını 0 yapıp hemen ardından tekrar 1 olarak güncelleyeceğim.
$ kubectl scale deployment traefik --replicas 0 -n kube-system $ kubectl scale deployment traefik --replicas 1 -n kube-system $ kubectl get pod,svc -n kube-system
Son adımda pod’ları ve servisleri kontrol ediyoruz. Traefik servisimizin loadbalancer olarak ayarlandığını görmeniz gerekiyor. Bu adımdan sonra, eğer kurulumu kendi bilgisayarınıza yaptıysanız direkt belirtilen port ile erişebilirsiniz. Eğer uzak bir sunucuya kurduysanız port-forward kullanabilirsiniz.
$ kubectl port-forward --address 192.168.1.74 deployment/traefik -n kube-system
Dikkat etmeniz gereken bir nokta var; –address parametresine uzak sunucunuzun IP adresini yazmalısınız. Ben örnek olması açısından yukarıda kendi IP adresimi yazdım.
Artık tarayıcınızdan dashboard’a erişebilirsiniz.

4.1. Traefik ile Uygulama Ayağa Kaldırma
Son olarak yukarıda (2.1) loadbalancer ile ayağa kaldırdığımız nginx uygulamasını tekrar ayağa kaldıralım ve traefik dashboard’dan görüntüleyelim.

Oluşturduğumuz servis traefik panelinde görünmekte.
En sade şekilde local ya da uzak sunucunuzda K3D ile K3S cluster’ını nasıl kurabileceğinize değindim. Kind yazımda da söylediğim gibi bu tarz araçlar ile gerek test gerekse gerçek ortam için çok hızlı bir şekilde cluster kurulumu yapabilirsiniz. Docker konteyner olarak çalıştığı için dışarıya servis açmak konusunda biraz yorucu oluyorlar fakat bilgisayarınızda zaten bir docker kurulu ise bu adımları local’de yapmak oldukça kolay olacaktır.
Yazan: Doğukan Turan
Yayınlanma Tarihi: 13.07.2021
