Kubernetes cluster kurmak için çeşitli araçlar vardır, ihtiyaca uygun bunlardan faydalanabiliriz.
- kubeadm: Tek bir master node’u olan cluster kurabiliriz.
- Kubespray: Arka planda kubeadm kullanır ve single master nodelu cluster kurabileceği gibi multiple master node’lu clusterda kurabilir.
- kops : cloud provider larda single veya multi master nodelu cluster kurmamıza yarar.
- eksctl: AWS altyapısında bir cluster oluşturur.
- Rancher: Birkaç kümeyi yönetmek için web kullanıcı arayüzü sağlar, hatta cluster kurulumu için de kullanılabilir.
Liste tabi ki daha da uzayabilir, open source dünyası olduğu için zilyon tane alternatif var 🙂
Daha önceki yazımda kubeadm ile tek master node’u olan bir kubernetes cluster kurmuştum, ama tahmin edebileceğiniz gibi production ortamda master node’un high availability olması lazım. İşte kubespray tam burada ortaya çıkıyor multi master yapıda çok basit bir şekilde kubernetes cluster kurmamızı sağlıyor.
Resmi Kubespray GitHub bağlantısı linkteki gibidir, kubespray’ın amacı basitlik bu nedenle kurulum adımlarıda çok basit, biz sadece birbirlerini gören makineleri veriyoruz gerisini kubespray bizim için hallediyor. Bu arada şunuda söylemeden geçemiyeceğim, kubespray’ın tek kötü özelliği varsa oda her adımdaki kontroller nedeniyle kurulumun uzun (15-25 dk) sürmesidir.
Şimdi örnek bir kuruluma başlayacak olursak. Ben bu örnek için aşağıdaki iplere sahip 4 tane centos 7 makine hazırladım, bunlardan 2 sinide master node olarak ayarlayacağım birde etcd ilk basştaki 3 sunucuya cluster yapıda kurmasını sağlayacağım.
- 168.10.30
- 168.10.31
- 168.10.32
- 168.10.33
Öncelikle 4 makinem içinde güncelleştirmeleri tamamlarım.
yum update –y
Kubernetes Cluster’ında zaman konusunda bir sıkıntı yaşanmaması adına Cluster üyelerine ntp istemci kurulumunun yapılmasında fayda olacaktır. Bunun için aşağıdaki komutların çalıştırılması gereklidir;
yum install ntp –y #NTP Server bilgileri server kısmnına eklenir vi /etc/ntp.conf systemctl start ntpd systemctl enable ntpd systemctl status ntpd
timedatectl set-ntp true
timedatectl Local time: Wed 2020-05-13 00:07:17 +03 Universal time: Tue 2020-05-12 21:07:17 UTC RTC time: Tue 2020-05-12 21:07:17 Time zone: Europe/Istanbul (+03, +0300) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a
ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== asteroid.botas. 193.140.100.41 3 u 6 64 1 0.778 -9.721 0.000 213.251.52.185 195.66.241.2 2 u 1 64 1 41.733 11.955 0.223 time.ume.tubita .PPS. 1 u - 64 1 19.892 0.987 0.269 ntp2.home4u.ch .INIT. 16 u - 64 0 0.000 0.000 0.000 85.199.214.98 .GPS. 1 u - 64 1 53.425 -3.287 1.229
Cluster üyesi node’larda Firewall’un yapılandırılması ve gerekli izinlerin verilmesi gerekmektedir. Bunun için Master sunucuda aşağıdaki komutlar çalıştırılır;
firewall-cmd --permanent --add-port=6443/tcp firewall-cmd --permanent --add-port=2379-2380/tcp firewall-cmd --permanent --add-port=30000-32767/tcp firewall-cmd --permanent --add-port=6783/tcp firewall-cmd --permanent --add-port=10250/tcp firewall-cmd --permanent --add-port=10251/tcp firewall-cmd --permanent --add-port=10252/tcp firewall-cmd --permanent --add-port=10255/tcp firewall-cmd --reload
Master dışındaki sunucularda firewall yapılandırması içi aşağıdaki komutlar çalıştırılır;
firewall-cmd --permanent --add-port=10250/tcp firewall-cmd --permanent --add-port=10255/tcp firewall-cmd --permanent --add-port=30000-32767/tcp firewall-cmd --permanent --add-port=6783/tcp firewall-cmd --reload
Alternatif olarak Cluster üyelerinin tamamında aşağıdaki komutlar yardımıyla firewall tamamen kapatılabilir;
systemctl stop firewalld systemctl disable firewalld
br_netfilter modülü yüklenir. Bu modül, maskelemeyi etkinleştirmek ve cluster daki kubernetes podları arasındaki iletişim için Virtual Extensible LAN (VxLAN) trafiğini kolaylaştırmak için gereklidir.
modprobe br_netfilter echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
ip formard aktifleştirilir.
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf /sbin/sysctl -p
Kubespray kurulumunu, ansible playbookları üzerinden yapar bu nedenle ansible sunucusundan cluster node larına şifresiz erişim gerekmektedir. Benim örneğimde ansible playbookların çalıştırılacağı sunucu master nodelardan ilki olacak. Kurulumların root kullanıcısı ile gerçekleştirilmesi bir zorunluluk değildir. Farklı bir kullanıcı oluşturularakda işlem yapılabilir, o zamanda sudo yetkisi vermek gerekecek.
Öncelikle ssh-keygen oluşturuyoruz sonrasında ise oluşturulan keygenleri diğer sunucuya kopyalıyoruz.
ssh-keygen –t rsa ssh-copy-id 192.168.10.30 ssh-copy-id 192.168.10.31 ssh-copy-id 192.168.10.32 ssh-copy-id 192.168.10.33
Aşağıdaki komutlar yardımıyla python kurulumları yapılır.
yum install python3 python3-pip libselinux-python3 -y
Git ile kubespray repository’sini klonlayarız. Cluster oluşturmak için gereken tüm ansible playbooklarını içerir.
git clone https://github.com/kubernetes-sigs/kubespray.git
Kubespray dizinine gider ve bu dizinde bulunan requirements.txt dosyası yardımıyla bağımlı paketlerin kurulumu yapılır;
cd kubespray pip3 install -r requirements.txt
Cluster isimlendirmesi hazırlanır;
CLUSTER_NAME="test" CLUSTER_DOMAIN="mustafabektastepe.com" CLUSTER_FQDN="$CLUSTER_NAME.$CLUSTER_DOMAIN"
Yukarıdaki değişkenlerden cluster_name ve cluster_domain’i kendi ihtiyaçlarınız doğrultusunda güncelleyebilirsiniz. Cluster yapılandırması için yeni bir dizin oluşturularak örnek dosyalar buraya kopyalanır;
cp -rfp inventory/sample inventory/$CLUSTER_NAME
Ansible inventory dosyası Inventory Builder ile güncellenir;
declare -a IPS=(192.168.10.30 192.168.10.31 192.168.10.32 192.168.10.33) CONFIG_FILE=inventory/$CLUSTER_NAME/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
Bu komutların ardından oluşturulan inventory/$CLUSTER_NAME/hosts.yml dosyası yapılandırmanız ve ihtiyaçlarınız doğrultusunda düzenlenmelidir; Benim örneğimde son durum aşağıdaki gibidir;
all: hosts: master1: ansible_host: 192.168.10.30 ip: 192.168.10.30 access_ip: 192.168.10.30 master2: ansible_host: 192.168.10.31 ip: 192.168.10.31 access_ip: 192.168.10.31 node1: ansible_host: 192.168.10.32 ip: 192.168.10.32 access_ip: 192.168.10.32 node2: ansible_host: 192.168.10.33 ip: 192.168.10.33 access_ip: 192.168.10.33 children: kube-master: hosts: master1: master2: kube-node: hosts: master1: master2: node1: node2: etcd: hosts: master1: master2: node1: k8s-cluster: children: kube-master: kube-node: calico-rr: hosts: {}
Bu noktadan itibaren Kubernetes Cluster’ımızı ihtiyaçlarımız doğrultusunda özelleştirmeye başlıyoruz. Değiştirebileceğimiz değerlere sahip parametre dosyaları inventory/$CLUSTER_NAME/group_vars dizini altında yer almaktadır. Aşağıda detayları bulunan parametreler ve daha fazlası için bu dosyalar incelenebilir.
k8s-cluster.yml dosyasındaki cluster adı güncellenir;
sed -i "s/cluster_name: cluster.local/cluster_name: $CLUSTER_FQDN/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-cluster.yml
Kubectl kurulmak istenirse aşağıdaki komut kullanılabilir;
sed -i "s/# kubeconfig_localhost: false/kubeconfig_localhost: true/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-cluster.yml
Container Network Interface (CNI) olarak varsayılanda kurulan Calico yerine Weave network eklentisinin kurulması istenirse aşağıdaki şekilde belirtilir;
sed -i 's/kube_network_plugin: calico/kube_network_plugin: weave/g' inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-cluster.yml
Weave network eklentisi için bir şifre oluşturularak yapılandırma dosyasına yazılır;
sed -i "s/# weave_password: ~/weave_password: 112233ee /g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-net-weave.yml
addons.yml dosyası incelenerek istenilen ek özellikler kurulabilir. Mesela helm’in de kurulması istenirse aşağıdaki komut çalıştırabilir.
sed -i "s/helm_enabled: false/helm_enabled: true/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/addons.yml
addons.yml ile istersek yukarıdaki örnek gibi aşağıdakileri araçları kurdurabiliriz.
- Docker registry
- Metrics Server
- Rancher
- Volume
- CephFS
- Nginx ingress
- ALB Ingress
- Cert manage
Opsiyonel olarak, tanımlı tüm node’lara erişilebildiği aşağıdaki komutla kontrol edilir;
ansible -i inventory/$CLUSTER_NAME/hosts.yml -m ping all
Yukarıdaki ayarlamalar ardından belirtilen ihtiyaçlar doğrultusunda Kubernetes Cluster’ının ve çevre uygulamaların kurulum ve yapılandırmalarının gerçekleştirilmesi için aşağıdaki komut kullanılabilir;
ansible-playbook -i inventory/$CLUSTER_NAME/hosts.yml --become --become-user=root cluster.yml
kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE ingress-nginx ingress-nginx-controller-4c85z 1/1 Running 0 3m34s ingress-nginx ingress-nginx-controller-cwwk8 1/1 Running 0 3m34s ingress-nginx ingress-nginx-controller-pwmf9 1/1 Running 0 3m31s ingress-nginx ingress-nginx-controller-wh6bq 1/1 Running 0 3m34s kube-system coredns-74b594f4c6-n2sv9 1/1 Running 0 2m58s kube-system coredns-74b594f4c6-w7jtb 1/1 Running 0 3m14s kube-system dns-autoscaler-7594b8c675-c9t6s 1/1 Running 0 3m10s kube-system kube-apiserver-master1 1/1 Running 0 6m47s kube-system kube-apiserver-master2 1/1 Running 0 5m54s kube-system kube-controller-manager-master1 1/1 Running 0 6m47s kube-system kube-controller-manager-master2 1/1 Running 0 5m40s kube-system kube-proxy-4hm72 1/1 Running 0 4m29s kube-system kube-proxy-fzct6 1/1 Running 0 4m29s kube-system kube-proxy-hkxq9 1/1 Running 0 4m29s kube-system kube-proxy-n9rcb 1/1 Running 0 4m29s kube-system kube-scheduler-master1 1/1 Running 0 6m47s kube-system kube-scheduler-master2 1/1 Running 0 5m54s kube-system kubernetes-dashboard-7dbcd59666-687n6 1/1 Running 0 3m5s kube-system kubernetes-metrics-scraper-6858b8c44d-xhtf6 1/1 Running 0 3m5s kube-system metrics-server-8548b9f95f-m8scl 2/2 Running 0 2m28s kube-system nginx-proxy-node1 1/1 Running 0 4m43s kube-system nginx-proxy-node2 1/1 Running 0 4m43s kube-system nodelocaldns-b628f 1/1 Running 0 3m8s kube-system nodelocaldns-kqg2b 1/1 Running 0 3m8s kube-system nodelocaldns-p68tv 1/1 Running 0 3m8s kube-system nodelocaldns-q5xct 1/1 Running 0 3m8s kube-system registry-2lz74 1/1 Running 0 2m44s kube-system registry-proxy-hk5gv 1/1 Running 0 2m44s kube-system registry-proxy-n976x 1/1 Running 0 2m44s kube-system registry-proxy-r54vv 1/1 Running 0 2m44s kube-system registry-proxy-zvzt5 1/1 Running 0 2m44s kube-system weave-net-hxzjc 2/2 Running 1 4m3s kube-system weave-net-rbwvl 2/2 Running 0 4m3s kube-system weave-net-rmpzq 2/2 Running 0 4m3s kube-system weave-net-ww65r 2/2 Running 0 4m3s
Kurulum ardından Kubernetes’ Dashboard’a aşağıdaki url üzerinden erişilebilir;
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.
http://192.168.10.30:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.
Kurulum sonrasında etcd’yi aşağıdaki gibi kontrol edebiliriz.
etcdctl --endpoints=https://127.0.0.1:2379 cluster-health
Cluster’a yeni bir node ekleyeceğiniz zaman aşağıdaki adımları yapmanız gerekmektedir. Öncelikle hosts.yml dosyasının all kısmına yeni node bilgilerini yazarız, mesela ben aşağıda node3’ü ekliyorum;
all: hosts: master1: ansible_host: 192.168.10.30 ip: 192.168.10.30 access_ip: 192.168.10.30 master2: ansible_host: 192.168.10.31 ip: 192.168.10.31 access_ip: 192.168.10.31 node1: ansible_host: 192.168.10.32 ip: 192.168.10.32 access_ip: 192.168.10.32 node2: ansible_host: 192.168.10.33 ip: 192.168.10.33 access_ip: 192.168.10.33 node3: ansible_host: 192.168.10.34 ip: 192.168.10.34 access_ip: 192.168.10.34
host.yml dosyasında kube-node kısmınada yeni sunucu bilgilerini ekleyin.
kube-node: hosts: master1: master2: node1: node2: node3:
Şimdi clusterı ölçeklemek için aşağıdaki komutu çalıştırın:
ansible-playbook -i inventory/$CLUSTER_NAME/hosts.yml scale.yml
Cluster’dan node silmek için ise yine host.yml dosyasınında kube-node kısmına sadece çıkarmak istediğimiz node’ı yazmamız gerekir.
[kube-node] node3
Sonrasında aşağıdaki komutu çalıştırarak node’u clusterdan çıkarabiliriz.
ansible-playbook -i inventory/$CLUSTER_NAME/hosts.yml remove-node.yml
Yeni kurulum için cluster’ı silmek istersek’de aşağıdaki komutdan yararlanabiliriz.
ansible-playbook -i inventory/$CLUSTER_NAME/hosts.yml reset.yml
Mustafa Bektaş Tepe
İyi Çalışmalar
Referanslar;
https://github.com/kubernetes-sigs/kubespray
https://enterprisecoding.com/kubespray-ile-uretim-ortamina-hazir-kubernetes-kurulumu
https://dzone.com/articles/kubespray-10-simple-steps-for-installing-a-product