Centos 7 Üzerine Kubernetes kurulumu

Bu makale ile uzun bir maratona başlıyoruz. Hazır olun… Kubernetes… İlk bölümlerde kurulumlara başlıyoruz.

Aşağıda paylaşacağım detaylar 1 master, 2 worker olmak üzere 3 node Kubernetes kurulumunu anlatmaktadır. Kurulum adımlarını tüm node’lar ve master node olmak üzere 2 bölümde gruplanmıştır.

Tüm Node’larda

Öncelikle sunucularda firewall’un aktif olması durumunda aşağıdaki komutlarla gerekli izinler verilmelidir;

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

alternatif olarak FirewallD aşağıdaki komutla disable edilebilir;

systemctl stop firewalld
systemctl disable firewalld

IPTables aktif ise Kubernetes kurulumu için br_netfilter Kernel modülüne ihtiyaç bulunmaktadır. Bu modül sayesinde bridge üzerinden gezen paketler iptables tarafından filtreleme ve port forwarding için işlenebilecek, kubernetes pord’ları cluster içerisinde birbiri ile iletişim kurabilecektir. Bu sebeple modül aşağıdaki şekilde aktif hale getirilir;

modprobe overlay
modprobe br_netfilter

cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sysctl --system

Sistemin yeniden başlatılması ardından da değişikliklerin etkin olması için;

echo overlay >> /etc/modules-load.d/overlay.conf
echo br_netfilter >> /etc/modules-load.d/br_netfilter.conf

Sistemlerin güncellemesi yapılır;

yum update -y

Sunucuların birbirine isimleri üzerinde gidebildiği test edilir. DNS sunucusu yoksa /etc/hosts dosyasına diğer sunucular girdi olarak eklenmelidir.

Aşağıdaki komutlar sunucularda swap kullanımı kapatılır;

swapoff -a
sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab

Kontrol için aşağıdaki komut kullanılabilir;

free

Container Runtime Kurulumu – Docker

Kubernetes farklı Container Runtime’larını desteklemektedir. Bu yazımda Docker ile ilerleyeceğim için öncelikle Docker kurulumu yapılmalıdır.

Tüm sunucularda SELinux kapatılır;

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux

Bu komutlarla SELinux permissive modunda çalıştırılır. Bu sayede container’lar host dosya sistemine ulaşabilecektir, bu durum örneğin pod network’leri için gereklidir.

Docker kurulumu için gerekli paketler kurulur;

yum install -y yum-utils device-mapper-persistent-data lvm2

Docker deposu kurulur;

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Docker kurulumu yapılır;

yum install -y docker-ce

/etc/docker dizini oluşturulur;

mkdir /etc/docker

deamon.json dosyası oluşturulur;

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

docker.service.d dizini oluşturulur

mkdir -p /etc/systemd/system/docker.service.d

Docker servisi yeniden başlatılır;

systemctl daemon-reload
systemctl enable docker
systemctl start docker

Kubelet Kurulumu

Sunucularda aşağıdaki içerikle /etc/yum.repos.d/kubernetes.repo adresinde bir repository dosyası oluşturulur;

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

Aşağıdaki komutla kubelet kurulumu yapılır;

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

kurulum ardından kubelet servisi aktive edilir;

systemctl enable --now kubelet

kubelet servisi yeniden başlatılır;

systemctl daemon-reload
systemctl restart kubelet

Master Sunucu’da

Kubernetes Cluster ilklendirilmesi

Başlarken, opsiyonel olarak, init öncesi yapılandırma imajları indirilir;

kubeadm config images pull

Master sunucuda aşağıdaki komutla kubernetes cluster’ı ilklendirilir; (network_cdir alanına ilgili cidr değeri girilmelidir.)

kubeadm init --pod-network-cidr=[NETWORK_CIDR]

pod-network-cid parametresi pod network’ü için kullanılacak olan ağı belirtmektedir. Aşağıda tercih edilen network doğrultusunda kullanılacak Network CIDR değerleri bulunabilir;

Network AdıCidrDesteklenen Platform
Clico192.168.0.0/16amd64, arm64, ppc64le
Canal10.244.0.0/16amd64
Cilium10.217.0.0/16 
Flannel10.244.0.0/16amd64, arm, arm64, ppc64le, s390x

Kubernetes cluster ilklendirmesi tamamlandıktan sonra çıktıda yer alan ve kubeadm join ile başlayan bölümü kopyalayın. Bu değer daha sonradan Kubernetes Cluster’ına yeni node’lar eklenmesinde kullanılacaktır.

kubeadm init --apiserver-advertise-address=192.168.200.2 --pod-network-cidr=10.244.0.0/16
Image

Bu işlemler ardından Kubernetes komutlarını kullanabilmek adına aşağıdaki komutlar çalıştırılır;

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Bu işlemler ardından pod network addon yapılandırmasına hazırız. Bu adım pod’ların birbiri ile iletişim kurabilmesi için zorunludur. Bunun için aşağıdaki komutu kullanabiliriz;

kubectl apply -f [NETWORK_YAML]
Network AdıYalm Dosyası
Calicohttps://docs.projectcalico.org/v3.7/manifests/calico.yaml
Canalhttps://docs.projectcalico.org/v3.7/manifests/canal.yaml
Ciliumhttps://raw.githubusercontent.com/cilium/cilium/v1.5/examples/kubernetes/1.14/cilium.yaml
Flannelhttps://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
Image

Yaklaşık bir dakika bekledikten sonra aşağıdaki komutlarla cluster durumu kontrol edilebilir;

kubectl get nodes
kubectl get pods --all-namespaces
Image

Varsayılan olarak Kubernetes güvenlik nedeniyle master node’larda pod schedule etmez. Bunu aşağıdaki komut yardımıyla bypass edebilirsiniz;

kubectl taint nodes --all node-role.kubernetes.io/master-

Kubernetes Cluster’ına Node’ların Eklenmesi

Kubernetes Cluster’ının kurulması ardından aşağıdaki adımlar takip edilerek diğer sunucular worker node olarak cluster’a dahil edilebilir. Work node’ların Cluster’a dahil edilmesi için Cluster kurulumunun sonunda bize verilen komut her iki worker node üzerinde de çalıştırılmalıdır.

Örneğin;

kubeadm join 192.168.200.2:6443 --token yxo08j.gvowyx1im86kwwrz \
--discovery-token-ca-cert-hash sha256:471ea1505089f263aa82cef6b6180030ac5b8dec21b66f08f7725966954d48ea

Not: Token not alınmadıysa, aşağıdaki komutla öğrenilebilir;

kubeadm token list

Token’lar varsayılanda 24 saat geçerli olacak şekilde üretilirler. Eğer node, üretilen token zaman aşımına uğradıktan sonra cluster’ı dahil ediliyorsa, aşağıdaki komut kullanılarak yeni bir token üretilebilir.

kubeadm token create

Eğer –discovery-token-ca-cert-hash parametresine verilecek değer not alınmadıysa, aşağıdaki komut yardımıyla bu değer öğrenilebilir;

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2&amp;amp;amp;amp;gt;/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'

Node’ların doğru eklendiği aşağıdaki komutla teyit edilebilir;

kubectl get nodes
Image

Master Dışındaki Makinelerden Cluster Kontrolü

Opsiyonel olarak; aşağıdaki komut diğer sunucularda çalıştırılarak cluster kontrolünün bu sunucularda da yapılabilmesi sağlanabilir;

scp root@[master ip]:/etc/kubernetes/admin.conf .

Sonuç aşağıdaki komut çalıştırılarak test edilebilir;

kubectl --kubeconfig ./admin.conf get nodes

6 Comments

  1. Herkes master + 2 worker şeklinde kurulum yapmış.

    master01 master02, worker01 worker02… şeklinde bir kulurum örnegi verebilir misiniz?

    1. Merhaba Alparslan,
      Belirttiğin yapılandırmadan üretim ortamı için kurulum yaptığını varsayıyorum. Bu tarz kurulumlar için Kubespray ile kurulumu tavsiye ederim. Bu yöntemde kube-master -> host altına diğer masterları kolaylıkla ekleyebilirsin.

  2. Merhabalar sizin yaptığınız gibi kurulum yaptım test olsun diye de 3 tane container kurmak istedim ama üçüncü container pending’de bekliyor hep. Hatta çalışan container lardan birisini durdurursam pending’de bekleyen çalışıyor ama bu sefer de duran kalkmıyor.
    aşağıdaki gibi hata görüyorum, sizce nedeni ne olabilir nasıl çözebilirim?
    Warning FailedScheduling default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn’t tolerate, 2 node(s) didn’t have free ports for the requested pod ports

    1. Merhaba Kenan,
      Pod’un sheduler tarafından çalışması için bir node’a atanamıyor. Schedulari pod’un çalışması için uygun bir node bulamıyor. Hata mesajında da bu durumun nedeni belirtilmiş. Atama yapılabilecek 3 node’a sahipsin. Öte yandan node’lardan birisi master olduğu için varsayılanda sahip olduğu “node-role.kubernetes.io/master” taint’ı nedeniyle sistem podları dışında bir pod çalışmıyor. Diğer iki node’da ise pod tanımında belirttiğin port’lar kullanımda. farklı pod’lar için aynı port’u vermiş olabilirsin. Bu iki durumda birini düzeltmediğin sürece pod’un pending’de kalacaktır.

Leave a Comment

en_USEnglish