Kubernetes üzerinde geliştirme yapabilmek için tercih edilecek en iyi yollardan biri Minikube kullanmak. Minikube lokal makinenizde bir VM içinde, tek node’lu bir cluster oluşturarak Kubernetes deneyimi yaşamanıza imkan veriyor. Ancak çok node’lu bir cluster nasıl çalışıyor görmek istiyorsanız, lokal makinenize sanal makinelerden oluşan bir kurulum yapmanız gerekiyor. Ben Windows ile çalıştığım için VMware Workstation kullanacağım ancak kurulum adımları bir çok farklı sanallaştırma aracı veya fiziksel ortam için de geçerli.

Tipik bir Kubernetes cluster genellikle bir master ve birkaç worker nod’dan meydana gelir. Worker node lar daha sonra master node tarafından yönetilir, böylece cluster’ın merkezi bir noktadan yönetilmesi sağlanır.

Anlatmaya çalışacağım Kubernets cluster yapısı 1 master node, iki 2 worker node şeklinde bir yapı olacak. Master node’da en az 2 CPU ve 4 GB RAM olması önerilir. Kurulum sırasında repository lerden paketler indireceğimiz için tüm nodelarda internet bağlantısı gerekli, sanallaştırma ortamını buna uygun ayarlamamız gerekir. Tahmin edeceğiniz gibi kubernetes container runtime olarak docker kullanacağız.

  • Master Node : 192.168.10.20
  • Worker Node 1 : 192.168.10.21
  • Worker Node 2 : 192.168.10.22

Kurulum aşamasının daha kolay anlaşabilmesi adına kurulumu 3 aşamaya böldüm. Bu aşamalardan birincisi sanal ortamda kurulum yaptığım için Sanal Makinele Network Yapılandırılması ikinci aşama master node konfigurasyonu ve üçüncü aşama worker node konfigurasyonu.

Sanal Makinele Network Yapılandırılması

Önce master ve worker nodel er için kullanılabilecek 3 tane sanal makine oluşturup, centos 7 kuruyoruz daha sonra her sanal makinenin, sanal network kartlarının mac adreslerini bir yere not edip makineleri kapatıyoruz.

Kuracağımız cluster’ın düzgün çalışabilmesi için, cluster içindeki tüm makinelerin iletişimlerinin sorunsuz olduğundan emin olmamız gerekiyor. VMare tarafından her makineye atanan IP’lerin sabitlenmesi de emin olmak için atmamız gereken adımlardan biri. VMware’in oluşturduğu vmnet8 adında, sanal makinelerin fiziksel network ile NAT üzerinden haberleşmesini sağlayan network’ü kullanacağız. Dolayısıyla vmnet8 sanal network adaptörünün konfigürasyonuna müdahale etmemiz gerekiyor.  VMware, sabit IP ataması için bir arayüz sunmuyor, dolayısıyla bu işi manuel olarak çözeceğiz. Konfigürasyonu, C:\ProgramData\VMware\vmnetdhcp.conf dosyası içinde gerçekleştiriyoruz.

host K8SMaster {
 hardware ethernet 00:50:56:27:3B:12;
 fixed-address 192.168.10.20;
}
host K8SNode1 {
 hardware ethernet 00:50:56:21:B9:EB;
 fixed-address 192.168.10.21;
}
host K8SNode2 {
 hardware ethernet 00:50:56:2F:28:95;
 fixed-address 192.168.10.22;
}

Bu konfigürasyona her müdahale ettiğinizde VMware’i tekrar başlatmanız gerekiyor. Dolayısıyla, konfigürasyonu tek seferde halledip, her sanal makine oluşturduğumuzda buradaki MAC adreslerini kullanmak daha kolay bir yöntem olacak. Bu liste bir yerlerde açık olarak elinizin altında bulunsun. Ayrıca dosyayı değiştirdiğinizde VMware açık ise kapatıp açmayı unutmayın.

vmnetdhcp.conf  dosyasını düzenledikten sonra sanal makinelerimizi başlatıp her birinin ip lerini düzenleriz bu şekilde hem makineler kendi arasında haberleşebilecek hemde internete çıkmış olacak. Bu kısım Linux ve sanallaştırma ile ilgili olduğu için konunun özünden uzaklaşmamak adına çok detaylı yazmadım ama sıkıntı yaşayan olursa yardımcı olabilirim.

Bu aşamada son olarak eklemek istediğim, standart olarak kuruluma başlamadan öce her zaman linux  paketleri güncellerim, zorunlu değil ama tavsiye ederim.

yum -y update

Master Node Konfigurasyonu

Master node’da hostname’i ayarlarız.

hostnamectl set-hostname master.localdomain

Tüm sunucuların birbirlerine host isimleriyle ulaşabilmesi için host isimleri ve IP adreslerini eşleştirmemiz gerekiyor. Yazının başında verdiğimiz statik IP’leri aynen hosts dosyasına giriyoruz:

cat <<EOF>> /etc/hosts
192.168.10.20	master.localdomain	master
192.168.10.21 node1.localdomain	node1
192.168.10.22 node2.localdomain	node2
EOF

ping atarak makineler arasındaki bağlantımızı test edebiliriz.

ping node1
ping node2

selinux’u devre dışı  bırakırız.

setenforce 0

Açılışta selinux’ün tekrardan aktif olmaması için /etc/sysconfig/selinux dosyasını güncelleriz.

sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
reboot

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

  • 6443 : Kube-apiserver
  • 2379-2380 : Etcd client api
  • 10250 : Kubelet-api
  • 10251 : Kube-scheduler
  • 10252 : Kube-controler-manager
  • 10255 : Read-only kubelet api
  • 30000-32767 : Nodeport ports
  • 8472 : Canal/Flannel VXLAN overlay networking
  • 6783 : Weave Port
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

firewall 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 br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

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

systemctl stop firewalld
systemctl disable firewalld

Centos 7’de varsayılan olarak yüklenmediklerinden Kubernetes repositorylerini manuel olarak eklemeniz gerekecektir.

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
EOF

Artık kubeadm ve docker paketlerini yükleyebiliriz.

yum install kubeadm docker -y

Yükleme başarıyla tamamlandığında, her iki serviside de ektinleştirip ve başlatabiliriz

systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker

Bu aşamada servislerin durumunu kontrol ettiğimizde docker servisinin çalıştığını  ama kubelet servisinde hata olduğunu göreceksiniz. 🙂

[root@master ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-04-12 17:08:24 +03; 17s ago
     Docs: http://docs.docker.com
 Main PID: 11699 (dockerd-current)
    Tasks: 21
   CGroup: /system.slice/docker.service
           ├─11699 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgrou...
           └─11705 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --stat...

Apr 12 17:08:22 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:22.619823656+03:00" level=info msg="libcontainerd: new containerd process...: 11705"
Apr 12 17:08:23 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:23.718038942+03:00" level=info msg="Graph migration to content-addressabi...seconds"
Apr 12 17:08:23 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:23.718776898+03:00" level=info msg="Loading containers: start."
Apr 12 17:08:23 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:23.731197731+03:00" level=info msg="Firewalld running: true"
Apr 12 17:08:23 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:23.905475542+03:00" level=info msg="Default bridge (docker0) is assigned ...address"
Apr 12 17:08:24 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:24.096054501+03:00" level=info msg="Loading containers: done."
Apr 12 17:08:24 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:24.114897348+03:00" level=info msg="Daemon has completed initialization"
Apr 12 17:08:24 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:24.114932131+03:00" level=info msg="Docker daemon" commit="cccb291/1.13.1...n=1.13.1
Apr 12 17:08:24 master.localdomain dockerd-current[11699]: time="2020-04-12T17:08:24.118693626+03:00" level=info msg="API listen on /var/run/docker.sock"
Apr 12 17:08:24 master.localdomain systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
[root@master ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: activating (auto-restart) (Result: exit-code) since Sun 2020-04-12 17:08:27 +03; 3s ago
     Docs: https://kubernetes.io/docs/
  Process: 11782 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=255)
 Main PID: 11782 (code=exited, status=255)

Apr 12 17:08:27 master.localdomain systemd[1]: kubelet.service: main process exited, code=exited, status=255/n/a
Apr 12 17:08:27 master.localdomain systemd[1]: Unit kubelet.service entered failed state.
Apr 12 17:08:27 master.localdomain systemd[1]: kubelet.service failed.

Kubernetes’in swap kullanımında garip hatalar verdiğine dair bilgiler mevcut. Dolayısıyla swap kullanımını devre dışı bırakıyoruz:

swapoff -a

Tekrardan aktif olmamsı adına /etc/fstab dosyasını da düzenliyoruz.

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

Master sunucuda aşağıdaki komutla kubernetes cluster’ı ilklendirilir;

[root@master ~]# kubeadm init
W0412 17:14:15.708095   12136 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.18.1
[preflight] Running pre-flight checks
        [WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [master.localdomain kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.10.20]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [master.localdomain localhost] and IPs [192.168.10.20 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [master.localdomain localhost] and IPs [192.168.10.20 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
W0412 17:15:23.000667   12136 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W0412 17:15:23.001798   12136 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 22.502698 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.18" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node master.localdomain as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node master.localdomain as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: khqxlc.nlsh5pd1xoebomuu
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.10.20:6443 --token khqxlc.nlsh5pd1xoebomuu \
    --discovery-token-ca-cert-hash sha256:75e1bf032aa4c3127cd587f65c87ac2f97c1ba7f87f781b16ea5bcc585310d54

Bu komuta istersek iki parametre verebiliriz. Bunlar apiserver-advertise-address ve pod-network-cidr parametreleridir.

  • apiserver-advertise-address : Bu adres, Kubernetes master sunucusunun gelen istekleri dinleyeceği IP’dir. Değer verilmezse default gw ile ilişkilendirilen interface kullanılır. Bizim kurulumumuz için bu değer vm’in IP’si olacak: — apiserver-advertise-address=192.168.10.20
  • pod-network-cidr : Bu parametre sistemde kurulacak olan network modülüne göre (Container Network Interface – CNI) değer alır. CNI konusu Kubernetes’deki en önemli konulardan biridir. Yazıda bu konuya detaylı olarak girmeyeceğim ama kısaca şunları söyleyeyim: Kubernetes kurulum sırasında bir ağ çözümü sağlamaz. 3. parti bir çözüm kurmanızı bekler.

İstersek bu paramtreleri set ederek de kubeadm’yi ilklendirebiliriz.

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

Kubelet servisini şimdi kontrol ettiğimizde servisin çalıştığını ama hatalar olduğunu göreceğiz bunun nedeni de kubeadm init yaparken pod-network-cidr belirtmediğimiz için.

 [root@master ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Sun 2020-04-12 17:15:46 +03; 4min 21s ago
     Docs: https://kubernetes.io/docs/
 Main PID: 13120 (kubelet)
    Tasks: 15
   CGroup: /system.slice/kubelet.service
           └─13120 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubel...

Apr 12 17:19:47 master.localdomain kubelet[13120]: W0412 17:19:47.273836   13120 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Apr 12 17:19:47 master.localdomain kubelet[13120]: E0412 17:19:47.798919   13120 kubelet.go:2187] Container runtime network not ready: NetworkReady=false ...itialized
Apr 12 17:19:52 master.localdomain kubelet[13120]: W0412 17:19:52.282308   13120 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Apr 12 17:19:52 master.localdomain kubelet[13120]: E0412 17:19:52.803346   13120 kubelet.go:2187] Container runtime network not ready: NetworkReady=false ...itialized
Apr 12 17:19:57 master.localdomain kubelet[13120]: W0412 17:19:57.282846   13120 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Apr 12 17:19:57 master.localdomain kubelet[13120]: E0412 17:19:57.805392   13120 kubelet.go:2187] Container runtime network not ready: NetworkReady=false ...itialized
Apr 12 17:20:02 master.localdomain kubelet[13120]: W0412 17:20:02.283498   13120 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Apr 12 17:20:02 master.localdomain kubelet[13120]: E0412 17:20:02.808287   13120 kubelet.go:2187] Container runtime network not ready: NetworkReady=false ...itialized
Apr 12 17:20:07 master.localdomain kubelet[13120]: W0412 17:20:07.284266   13120 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Apr 12 17:20:07 master.localdomain kubelet[13120]: E0412 17:20:07.809894   13120 kubelet.go:2187] Container runtime network not ready: NetworkReady=false ...itialized
Hint: Some lines were ellipsized, use -l to show in full.

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. “\” karakterini silmeyi unutmayın.

kubeadm join 192.168.10.20:6443 --token khqxlc.nlsh5pd1xoebomuu     --discovery-token-ca-cert-hash sha256:75e1bf032aa4c3127cd587f65c87ac2f97c1ba7f87f781b16ea5bcc585310d54 

Kubernetes’i başarıyla başlattıktan sonra, kullanıcının cluster’ı kullanmaya başlamasına izin vermeniz gerekir. Tercih ettiğiniz sudo özellikli bir kullanıcı oluşturup kullanıcıya geçebilirsiniz.

 adduser kubernetes
passwd kubernetes
id kubernetes
usermod -aG wheel kubernetes
su - kubernetes

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
 

Şimdi kubectl komutunun etkin olup olmadığını kontrol edin.

kubernetes@master ~]$ kubectl  get nodes
NAME                 STATUS     ROLES    AGE   VERSION
master.localdomain   NotReady   master   90m   v1.18.1
 

Bu noktada, master node’un durumunun ‘NotReady’ olduğunu da fark edeceksiniz. Bunun nedeni, pod networkü henüz clusterda yapılandırmamızdır. Yukarıda hatırlayacağınız gibi istersek kubeadm init aşamasında halledebileceğimiz gibi sonra da yapabiliriz.

Yeri gelmişken kubernetes ağ mimarisinden kısaca bahsetmek istiyorum; Ağ mimarisi, Kubernetes kurulumunun en karmaşık yönlerinden biridir. Kubernetes ağ modelinin kendisi belli ağ özelliklerini gerektiriyor ancak uygulama konusunda bir miktar esneklik sağlıyor. Sonuç olarak, belirli ortamlara ve gereksinimlere yönelik çeşitli projeler yayınlanmıştır. CNI (Container Network Interface), konteynerler oluşturulduğunda veya imha edildiğinde konteyner ağını yapılandırmayı kolaylaştırmak için tasarlanmış bir standart olan, konteyner ağı arayüzü anlamına gelir. En popüler CNI eklentilerini inceleyeceğiz: flannel, calico, weave, and canal. Bu eklentiler, Kubernetes’in ağ gereksinimlerinin karşılandığından emin olmak ve cluster yöneticilerinin ihtiyaç duyduğu ağ iletişimi özelliklerini sağlamak için kullanılır. Kubernetes kullanıldığında, kubelet bulduğu eklentileri uygun zamanlarda arayarak başlattığı pod‘lar için ağı otomatik olarak yapılandırmaya izin verir.

Özet bilgiden kurulumumuzu olabildiğince basit tutmak istediğimizden, herhangi bir yapılandırma veya ekstra kod gerektirmeyen Weavenet eklentisini kullanacağız ve bu eklenti her konteyner için bir IP adresi sağlayacak.

export kubever=$(kubectl version | base64 | tr -d '\n')
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
 

Şimdi master node’u kontrol edersek durumun “Ready” olduğunu görürüz.

[kubernetes@master ~]$ kubectl  get nodes
NAME                 STATUS   ROLES    AGE    VERSION
master.localdomain   Ready    master   102m   v1.18.1
 

Hatta serviside kontrol ettiğimizde artık hatada olmadığını göreceğiz.

[kubernetes@master ~]$ systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Sun 2020-04-12 17:15:46 +03; 1h 42min ago
     Docs: https://kubernetes.io/docs/
 Main PID: 13120 (kubelet)
    Tasks: 17
   CGroup: /system.slice/kubelet.service
           └─13120 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubel...

Apr 12 18:56:24 master.localdomain kubelet[13120]: W0412 18:56:24.180718   13120 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Apr 12 18:56:24 master.localdomain kubelet[13120]: E0412 18:56:24.793742   13120 kubelet.go:2187] Container runtime network not ready: NetworkReady=false ...itialized
Apr 12 18:56:29 master.localdomain kubelet[13120]: W0412 18:56:29.184413   13120 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
Apr 12 18:56:29 master.localdomain kubelet[13120]: E0412 18:56:29.798913   13120 kubelet.go:2187] Container runtime network not ready: NetworkReady=false ...itialized
Apr 12 18:56:44 master.localdomain kubelet[13120]: I0412 18:56:44.138931   13120 topology_manager.go:233] [topologymanager] Topology Admit Handler
Apr 12 18:56:44 master.localdomain kubelet[13120]: I0412 18:56:44.159077   13120 topology_manager.go:233] [topologymanager] Topology Admit Handler
Apr 12 18:56:44 master.localdomain kubelet[13120]: I0412 18:56:44.285856   13120 reconciler.go:224] operationExecutor.VerifyControllerAttachedVolume started for vo...
Apr 12 18:56:44 master.localdomain kubelet[13120]: I0412 18:56:44.285899   13120 reconciler.go:224] operationExecutor.VerifyControllerAttachedVolume started for vo...
Apr 12 18:56:44 master.localdomain kubelet[13120]: I0412 18:56:44.285927   13120 reconciler.go:224] operationExecutor.VerifyControllerAttachedVolume started for vo...
Apr 12 18:56:44 master.localdomain kubelet[13120]: I0412 18:56
 

Worker Node Konfigurasyonu

Aşağıdaki adımlar worker node larda çalışacaktır. Kubernetes cluster’ına katılırken bu adımlar her worker node’da gerçekleştirilmelidir.

Worker node larda hostnameler ve /etc/hosts dosyaları düzenlenir.

hostnamectl set-hostname node1.localdomain

cat <<EOF>> /etc/hosts
192.168.10.20	master.localdomain	master
192.168.10.21 node1.localdomain	node1
192.168.10.22 node2.localdomain	node2
EOF
 

selinux disable edilir. Açılışta tekrar aktif olmamsı adına /etc/sysconfig/selinux dosyasıda düzenlenir.

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

firewall izinleri verilir.

firewall-cmd --permanent --add-port=6783/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd  --reload
modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
 

Kubernetes repository’si eklenir.

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
EOF
 

kubeadm ve docker paketleri yüklenir.

yum install kubeadm docker -y 

Servisler başlatılır.

systemctl enable docker
systemctl start docker
systemctl enable kubelet
systemctl start kubelet
 

swap kullanımı kapatılmalıdır.

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

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.

[root@node1 ~]# kubeadm join 192.168.10.20:6443 --token khqxlc.nlsh5pd1xoebomuu --discovery-token-ca-cert-hash sha256:75e1bf032aa4c3127cd587f65c87ac2f97c1ba7f87f781b16ea5bcc585310d54
W0412 19:11:26.950466   52954 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.18" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
 

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

[kubernetes@master ~]$ kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
khqxlc.nlsh5pd1xoebomuu   21h         2020-04-13T17:15:46+03:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
 

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>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 

Master node’a geri dönün ve çalışan node-1 ile çalışan node-2’nin aşağıdaki komutu kullanarak clustera katılıp katılmadığını kontrol edin.

[kubernetes@master ~]$ kubectl  get nodes
NAME                 STATUS   ROLES    AGE     VERSION
master.localdomain   Ready    master   120m    v1.18.1
node1.localdomain    Ready    <none>   42s     v1.18.1
node2.localdomain    Ready    <none>   4m53s   v1.18.1

[kubernetes@master ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
kube-system   coredns-66bff467f8-h57d4                     1/1     Running   0          124m
kube-system   coredns-66bff467f8-vlv46                     1/1     Running   0          124m
kube-system   etcd-master.localdomain                      1/1     Running   0          124m
kube-system   kube-apiserver-master.localdomain            1/1     Running   0          124m
kube-system   kube-controller-manager-master.localdomain   1/1     Running   0          124m
kube-system   kube-proxy-7kfm5                             1/1     Running   0          124m
kube-system   kube-proxy-lsf99                             1/1     Running   0          8m39s
kube-system   kube-proxy-pwbq5                             1/1     Running   0          4m28s
kube-system   kube-scheduler-master.localdomain            1/1     Running   0          124m
kube-system   weave-net-5lx56                              2/2     Running   0          23m
kube-system   weave-net-hpgwd                              2/2     Running   1          8m39s
kube-system   weave-net-w8sd8                              2/2     Running   0          4m28s

[kubernetes@master ~]$ kubectl cluster-info
Kubernetes master is running at https://192.168.10.20:6443
KubeDNS is running at https://192.168.10.20:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Bu noktada, Centos 7’de bir Kubernetes cluster kurulumunu başarıyla tamamladık ve iki worker node  başarıyla çalıştı. Artık pod oluşturmaya ve deploy yapmaya başlayabilirsiniz.

Mustafa Bektaş Tepe
İyi Çalışmalar

Referanslar;

 1,418 total views,  2 views today