Hatırlayacak olursanız, daha önceki makalemde sizlere Kubernetes Cluster’ını Centos 7 minimal kurulu bir sistem üzerinde nasıl ayağa kaldırabileceğinizi paylaşmıştım. Özellikle bu işle yeni ilgilenenler için hızlıca bir Kubernetes Cluster’ı oluşturabilmeyi hedeflediğim makalem ardından pek çok Kubernetes egzersizini gerçekleştirebildiğinizi umuyorum. Devamındaki makalelerimde ise bu kurulum üzerine ihtiyacımız olan diğer bileşenleri detaylarını da paylaşarak kurmuştuk. Bu makalemde ise artık üretim ortamı kullanımına yönelik olarak bir Kubernetes Cluster’ının ve gerekli olan pek çok bileşenin Kubespray yardımıyla tek kalemde nasıl kurabileceğimizi sizlerle paylaşmak istiyorum.
Aşağıdaki adımlar takip edilerek, Centos 7 minimal kurulu sistemler üzerinde Kubespray yardımıyla üretim ortamı kullanımına hazır Kubernetes Cluster’ı kurulabilir.
Cluster Planlaması
Kubernetes, doğası gereği esnektir. Üretim ortamında kullanılacak servis, node, master sayıları ve yapılandırmaları ihtiyaçlar doğrultusunda değişiklik gösterecektir. Bu makalede kurulumunu yapacağımız Kubernetes Cluster’ı basit olması adına bir adet master ve 2 adet worker node’dan oluşmaktadır.

Etcd’nin sadece master node üzerinde olması planlanmıştır. Bunun yanında üretim ortamı kullanımlarında ihtiyaç duyulacak Helm, Dashboard, Docker Registery, Nginx Ingress Controller, Metric Server kurulumları da yapılacaktır. Container Network Interface (CNI) olarak varsayılanda gelen calico yerine weave seçilmiştir. Kube Api anonim erişimi kapatılarak basit ve token bazlı erişimler açılmıştır. İhtiyaçlarınız doğrultusunda aşağıda detaylarını paylaştığım bu yapılandırmayı özelleştirebilirsiniz.
Ön Gereksinimler
Kubespray ile Kubernetes Cluster’ının kurulumu için öncelikle aşağıdaki ön gereksinimlerim tamamlanmış olması gerekmekte. Ön gereksinimler, tüm sunucularda çalıştırılacaklar ve kurulumu gerçekleştirecek sunucu olmak üzere ikiye ayrılmıştır.
Tüm Sunuculardaki Ön Gereksinimler
Sunucuların Birbirini Görmesi
Cluster node’larının birbirlerine ulaşabilir durumda olmaları gerekmektedir.
Firewal Yapılandırması
Cluster içi ve dışı iletişimin kesintiye uğramaması adına 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=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 modprobe br_netfilter
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
Bu firewall yapılandırmalarına alternatif olarak Cluster üyelerinin tamamında aşağıdaki komutlar yardımıyla firewall tamamen kapatılabilir;
systemctl stop firewalld systemctl disable firewalld
Tüm sunucularda br_netfilter kernel modelü yüklenir ve kalıcı hale getirilir;
modprobe br_netfilter echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
Ntp İstemci Kurulumu
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 -y install ntp systemctl start ntpd systemctl enable ntpd ntpdate -u -s 0.tr.pool.ntp.org 1.tr.pool.ntp.org 2.tr.pool.ntp.org 3.tr.pool.ntp.org systemctl restart ntpd
Bu işlemler ardında zaman senkronizasyonu aşağıdaki komutla kontrol edilebilir;
timedatectl

Kurulumu Gerçekleştirecek Sunucu Ön Gereksinimleri
Kubespray’in çalışacağı sunucuda aşağıdaki adımlar takip edilmelidir. Kubespray tamamen ayrı bir sunucuda ya da Kubernetes Cluster üyelerinden birisi üzerinde (tercihen bir master sunucuda) çalıştırılabilir.
Şifresiz SSH Yapılandırması
Tüm sunucular için kurulumu yapacak kullanıcı olan root kullanıcısının şifresiz SSH yapabilmesi için gerekli yapılandırma gerçekleştirilir. Kurulumların root kullanıcısı ile gerçekleştirilmesi bir zorunluluk değildir. Farklı bir kullanıcı oluşturularak işlem yapılabilir. Bu durumda makalenin devamındaki komutların oluşturulan bu kullanıcı ile çalıştırılması gerekmektedir. root kullanıcından farklı senaryolarda pek çok komut sudo ile çalıştırılmalıdır.
Sunucular arası şifresiz ssh erişimi yapılandırılır;
ssh-keygen -q -f ~/.ssh/id_rsa -N ""
ssh key tüm sunuculara kopyalanır;
ssh-copy-id [SUNUCU_IP]
örneğin;
ssh-copy-id 192.168.200.2 ssh-copy-id 192.168.200.3 ssh-copy-id 192.168.200.4
Python Kurulumu
Aşağıdaki komutlar çalıştırılarak tüm sunuculara python kurulumu yapılır;
yum install -y epel-release yum install –y python36 python36-devel python36-pip pip3 install --upgrade pip
Kubespray Kurulumu
Aşağıdaki komutlar yardımıyla güncel Kubespray sürümü yerele indirilerek açılır;
export KUBESPRAY_RELEASE=$(curl --silent "https://api.github.com/repos/kubernetes-sigs/kubespray/releases/latest" | grep -Po '"tag_name": "\K.*?(?=")') curl -o kubespray.tar.gz -L https://github.com/kubernetes-sigs/kubespray/archive/$KUBESPRAY_RELEASE.tar.gz mkdir kubespray tar -xzf kubespray.tar.gz -C kubespray --strip-components=1
Oluşturulan kubespray klasörüne gidilir;
cd kubespray
Bu dizinde bulunan requirements.txt dosyası yardımıyla bağımlı paketlerin kurulumu yapılır;
/usr/local/bin/pip3 install -r requirements.txt
Kubernetes Cluster Kurulumu
Cluster isimlendirmesi hazırlanır;
CLUSTER_NAME="k8s" CLUSTER_DOMAIN="enterprisecoding.local" CLUSTER_FQDN="$CLUSTER_NAME.$CLUSTER_DOMAIN"
Yukarıdaki değişlenlerden 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;
mkdir inventory/$CLUSTER_NAME cp -rfp inventory/sample/* inventory/$CLUSTER_NAME
Opsiyonel olarak; ihtiyaç olmayan dosyalar silinir;
rm -rf inventory/sample inventory/local/
Ansible inventory dosyası Inventory Builder ile güncellenir;
declare -a IPS=(192.168.200.2 192.168.200.3 192.168.200.4) CONFIG_FILE=inventory/$CLUSTER_NAME/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
Bu komutlar ardından oluşturulan inventory/$CLUSTER_NAME/hosts.yml dosyası yapılandırmanız ve ihtiyaçlarınız doğrultusunda düzenlenmelidir;
vi inventory/$CLUSTER_NAME/hosts.yml
Örneğin, aşağıdaki ekran görüntüsünde birinci makine master, diğer iki makine ise worker node olarak tanımlanmıştır. etcd sadece master makineye kurulacak şekilde ayarlanmıştır;

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
Kube api anonim yetkilendirmesi kapatılarak basic ve token yetkilendirmesi açılır;
sed -i 's/kube_api_anonymous_auth: true/kube_api_anonymous_auth: false/g' inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-cluster.yml sed -i 's/# kube_basic_auth: false/kube_basic_auth: true/g' inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-cluster.yml sed -i 's/# kube_token_auth: false/kube_token_auth: true/g' inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-cluster.yml sed -i 's/# kube_apiserver_insecure_port:/kube_apiserver_insecure_port:/g' inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-cluster.yml sed -i 's/kube_apiserver_insecure_port: 0/#kube_apiserver_insecure_port: 0/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;
export WEAVE_PASSWORD=$(date +%s | sha256sum | base64 | head -c 32 ; echo) sed -i "s/# weave_password: ~/weave_password: $WEAVE_PASSWORD/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/k8s-net-weave.yml
Cluster kaynak kullanımına dair metriklerin çekilebilmesi için kube salt okunur portu açılır;
sed -i "s/# kube_read_only_port:/kube_read_only_port:/g" inventory/$CLUSTER_NAME/group_vars/all/all.yml
Dikkat: Bu ayar yapılmazsa metrik bilgileri okunamadığı için HPA çalışmayacaktır.
Docker storage driver olaray overlay2 yapılandırılır;
sed -i "s/# docker_storage_options:/docker_storage_options:/g" inventory/$CLUSTER_NAME/group_vars/all/docker.yml
Docker Registery kurulması istenirse;
sed -i "s/registry_enabled: false/registry_enabled: true/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/addons.yml
Helm’in kurulması istenirse;
sed -i "s/helm_enabled: false/helm_enabled: true/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/addons.yml
Metric Server kurulması istenirse;
sed -i "s/metrics_server_enabled: false/metrics_server_enabled: true/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/addons.yml
Nginx Ingress Controller kurulması istenirse;
sed -i "s/ingress_nginx_enabled: false/ingress_nginx_enabled: true/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/addons.yml sed -i "s/# ingress_nginx_host_network: false/ingress_nginx_host_network: true/g" inventory/$CLUSTER_NAME/group_vars/k8s-cluster/addons.yml
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
Bu komut yaklaşık 15-20dk içerisinde Kubernetes Cluster’ınızı belirttiğiniz yapılandırma doğrultusunda kuracaktır.

Kurulum ardından Kubernetes’ Dashboard’a aşağıdaki url üzerinden erişilebilir;
https://[MASTER_SUNUCU_IP]:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login