K3D ile K3S Kubernetes Cluster Kurulumu

Dogukan Turan
Devops Türkiye☁️ 🐧 🐳 ☸️
8 min readNov 3, 2020

Bundan önceki yazımda kind’ı ele almıştım ve kind aracını kullanarak nasıl kubernetes cluster’ı kurabileceğimizi ele almıştım(Kind hakkındaki yazıma buradan ulaşabilirsiniz). Şimdi ise Rancher’ın bir aracı olan K3D ile 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’in bir güzel yanı ise bu hafifliği sayesinde çok düşük sistemlerde bile kubernetes cluster’ı kurabilmemizi sağlamakta. K3S’in minimum sistem gereksinimleri şu şekilde;

  • Linux 3.10
  • 512 MB RAM (sunucu)
  • 75 MB RAM (node)
  • 200 MB 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 K3S cluster’ı kuruyoruz ve bunu çok hızlı ve minimum efor sarfederek minimum kaynak kullanarak yapıyoruz.
Ayrıca K3D cross-platform olduğu için Windows, Mac OS ve Linux üzerinde çalışabilmekte ve birden çok küme oluşturmayı desteklemekte.

1 - KURULUM

Gereksinimler

  • Windows, Linux veya MacOS ortamı
  • Docker
  • Kubectl
  • K3D

1.1 - Docker Kurulumu

Docker kurulumunu hızlı bir şekilde yapmak için rancher tarafından hazırlanan script’i kullanabilirsiniz veya bu adresten docker kurulumunu uygun ortamınıza göre yapabilirsiniz.

[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, bunuda 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 komudu 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

Sizde 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ı

Evet şimdi geldik cluster kurulumuna, kind kullandıysanız veya yazımı okuduysanız kind ile cluster kurulumunun ne kadar basit olduğunu göreceksiniz. K3D, CLI tarafından bakınca kind’a oldukça benziyor. Cluster kurulumuna geçmeden önce terminalimize sadece k3d yazarak bize neler sunduğuna bakalım isterseniz.

k3d cluster komutu ile;

  • Yeni bir k3s cluster’ını hızlı bir şekilde 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.

Önemli olan komutları yazmaya çalıştım.Bunun dışında kubeconfig komutu ile cluster config dosyasını print edebilirsiniz.

1.5 - K3D ile Cluster Kurulumu

Artık cluster kurulumuna geçebiliriz. Terminalinize aşağıdaki resimde oluşturduğum gibi sizde kendi oluşturduğunuz name ile cluster oluşturmaya başlayabilirsiniz.

$ k3d cluster create [NAME]

İlk cluster kurulumunda yaklaşık 150–200mb boyutunda docker image pull etmesi gerektiği için kurulum süresi internet hızınıza göre biraz zaman alabilir ama bu image’leri silmediğiniz sürece cluster kurulumunuz çok kısa sürecektir.

Resimdeki komut ile oluşturduğunuz cluster’ları ve durumlarını görebilirsiniz.

Bu şekilde eğer uzak bir sunucuya k3d kurulumu yapıp cluster’ı bu ortamda oluşturduysanız bir uygulama deploy ettiğiniz zaman buna erişemezsiniz. Çünkü herhangi bir port’a izin vermediğimiz için sadece cluster içinden erişime açık olacaktır. Oluşturduğunuz cluster’ı aşağıdaki komut ile silebilirsiniz. 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 bir takım sorunlarının olduğunu söylemiştim, bunlardan biriside eğer kind’ı local ortamımıza değilde uzak bir sunucuya kurduysak port açmanın meşakatli bir iş olmasıydı. Elle tek tek port açmamız gerekiyordu ve çalışan bir cluster’da yeni bir açılmamış port ihtiyacımız olduğu takdirde cluster’ı silip tekrar config dosyasını ayarlayıp ayağa kaldırmamız gerekiyordu. K3D kullanırkende öncesinde port açmamız gerekiyor fakat bunun için bize bir çok yol sunmakta, ister node-port olarak istersek de Load Balancer aracılığı ile uygulamalarımıza erişebiliyoruz.

2.1 - K3D Ingress Ayarları

K3D varsayılan olarak traefik kullanıyor ve bende traefik üzerinden ilerleyeceğim. Eğer k3d kurulumunu bir sunucuya yaptıysanız erişim için dışarı port açmanız gerekiyor bunun için aşağıdaki komutu terminalinize yazarak 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. Ayağa kaldırmak için aşağıdaki kubernetes komutunu terminalinize yazabilirsiniz.

$ kubectl create deployment demo --image nginx --port 80

Bu komut ile iç portu 80 olan ve ismi demo olan bir nginx image 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’da deploy etmek için;

$ kubectl create -f demo-ingress.yaml

Bu şekilde az önce oluşturduğumuz demo nginx uygulamasının loadbalancer ayarlarını yapmış olduk.

Sizde yukarıdaki gibi bir çıktı aldıysanız artık test edebiliriz. İşlemleri host’unuzdan yaptıysanız localhost ile, sunucu üzerine kurduysanız IP adresiniz ile tarayıcınızdan nginx’i görmeniz gerekiyor.

2.2 - K3D NodePort Ayarları

Kind yazımda da belirttiğim gibi port açmak için elle tek tek portları config dosyasına girmemiz gerekiyordu ve çalışan cluster’da yeni bir pod ihtiyacımız doğduğunda cluster’ı silip tekrar ayağa kaldırmamız gerekiyordu.
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” docker kullananlar bu komutu sık sık kullanmıştır -p(publish) komutu ile host-container portu açabiliyoruz. Yukarıda da bu işlemi yaptık 30000–30100 aralığını hem host tarafında hemde container tarafında açmasını söylüyorum. (Kubernetes default node port aralığı: 30000–32767)

NOT: 30000–32767 aralığını açmanızı düşük sistemli sistemler için önermiyorum çünkü portları açınca ciddi miktarda ram kullanımı artmakta bu yüzden bazı testlerimde docker’ın çalışmamasına neden oldu ve servisi tekrar başlatmama sebep oldu. Hata alırsanız bu aralığı düşürebilirsiniz.

Şimdi yukarda yaptığımız nginx uygulamasını bu sefer nodeport açarak yapalım demo-nodeport.yaml isimli bir dosya oluşturun ve aşağıdaki kodu 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. NodePort için 30050 adresini kullanacağım ben siz de açtığınız aralıktan bir port belirleyip belirlediğiniz port üzerinden uygulamaya erişebilirsiniz. Şimdi demo-nodeport.yaml dosyasını çalıştıralım.

$ kubectl create -f demo-nodeport.yaml

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 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 komut’lar 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 ihtiyaca göre yeni bir node eklemek istersen ne yapmamız gerekiyor peki? Ç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 dashboard varsayılan olarak kapalı olarak gelmekte. Dashboard’u aktifleştirmek için en kısa yoldan nasıl yapılabilir buna da değinmek istiyorum. Bunun için kubernetes’dan traefik config map’i düzenlememiz gerekiyor.

--EDIT CONFIGMAP--
$ kubectl edit configmap traefik -n kube-system
--ENABLE DASHBOARD--
[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 podu silebilirsiniz yada deployment scale edebilirsiniz. Ben deployment’ı scale ederek güncelleyeceğ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 local’de k3d çalıştırıyorsanız direk belirtilen port ile erişebilirsiniz. Benim gibi uzak 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 parametresi ile uzak sunucunuzun ip adresinizi yazabilirsiniz. Ben örnek olması açısından yukarda kendi ip adresimi yazdım bunu kendinize göre değiştirmeniz gerekiyor.

Artık tarayıcınızdan dashboard’a erişebilirsiniz.

4.1 - Traefik ile Uygulama Ayağa Kaldırma

Son olarak yukarda(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.

$ kubectl create deployment demo --image nginx --port 80$ kubectl expose deployment demo

Daha sonra yukarda oluşturduğumuz demo-ingress.yaml dosyamızı çalıştıralım.

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

Şimdi bu dosyayı ayağa kaldıralım.

$ kubectl create -f demo-ingress.yaml

Daha sonra dashboard’a erişip kontrol edelim.

Oluşturduğumuz servis traefik dashboard’ında görünmekte. Tabi bu örnek olması açısından yaptığımız bir örnek olduğu için temel seviyede bir örnek oldu.

En sade şekilde local yada 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 prod ortamı için çok hızlı bir şekilde cluster kurulumu yapabilirsiniz. Docker container olarak çalıştığı için service expose konusunda biraz yorucu oluyorlar fakat local’inizde zaten bir docker kurulu ise bu adımları local’de yapmak oldukça kolay olacaktır. Aşağıdaki bağlantıdan kind ile ilgili yazmış olduğum yazıya ve diğer yazılarıma ulaşabilirsiniz.

--

--