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

 362 total views,  4 views today