Before the installation

Very Important

Kurulumlara başlamadan önce mutlaka sunucuların aynı ağda ve aynı vm üzerinde olduğunu sistem yöneticilerinden teyit edin.

Very Important

Kurulumlara başlamadan önce mutlaka sunucunun hostname'nin localhost.localdomain olmadığından (hostname komutu ile) emin olun. Eğer bu şekilde ise mutlaka işlemlere başlamadan önce değiştirin.

(If Required) Changing Hostname

hostnamectl set-hostname your-new-hostname
POWERSHELL


Very Important

/etc/resolv.conf dosyasında "nameserver 127.0.1.1" şeklinde bir girdi olmamalıdır.


Very Important

Sadece CentOS'larda, Docker kurumuluna başlamadan önce aşağıdaki paketlerin silinmesi gerekmektedir.

yum remove podman* -y 

yum remove buildah* -y

Checking the System

------- CPU Bilgisini Okuma -------------------
grep processor /proc/cpuinfo | wc -l
echo "Total logical core(s): $(grep processor /proc/cpuinfo | wc -l)"
echo "Core per cpu: $(grep '^core id' /proc/cpuinfo | sort -u | wc -l)"

less /proc/cpuinfo

------- Memory Bilgilsini Okuma -------------------
free -h

------- Disk durumunu görüntüleme ------- 
df -h
du -sh file_path
POWERSHELL


Important

1., 2. ve 3. adımların Kubernetes Cluster olarak çalışacak tüm sunucular üzerinde yapılması gerekmektedir. 

1. Operating System Configurations

Ubuntu 2020.04 

Centos 7.9

Necessary tools for development & diagnostic

sudo apt -y install curl apt-transport-https wget
POWERSHELL

Create Apinizer user

sudo adduser apinizer

sudo usermod -aG sudo apinizer
POWERSHELL

Disable firewall

sudo systemctl stop ufw

sudo systemctl disable ufw
POWERSHELL

Deactivate Swap

Node'lardaki iletişim sorunlarını önlemek için swap'i devre dışı bırakalım.  Bunun için aşağıdaki adımlar yapılır ve /etc/fstab dosyası içindeki swap satırı silinir.

sudo swapoff -a

sudo vi /etc/fstab              
POWERSHELL

IP Tables Configurations

Daha sonra vi dosyasını kapatalım (:wq). IPTables ayarlarına kaldığımız yerden devam edeceğiz.

sudo vi /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_max_syn_backlog=40000
net.core.somaxconn=40000
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.ipv4.tcp_sack=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_moderate_rcvbuf=1
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_mem=134217728 134217728 134217728
net.ipv4.tcp_rmem=4096 277750 134217728
net.ipv4.tcp_wmem=4096 277750 134217728
net.core.netdev_max_backlog=300000
POWERSHELL

Save Changes

Aşağıdaki komutu çalıştırarak değişiklikleri uygulayalım.

sudo modprobe br_netfilter

sudo sysctl --system
POWERSHELL

Loading br_netfilter module ( → Reboot)    

br_netfilter modülünü yükleyelim ve sonrasında yeniden başlatalım.

sudo lsmod | grep br_netfilter

sudo reboot
POWERSHELL

Necessary tools for development & diagnostic

sudo yum install -y net-tools yum-utils bind-utils  device-mapper-persistent-data lvm2 telnet wget zip curl lsof
POWERSHELL

Create Apinizer user


adduser apinizer  

sudo usermod -aG wheel apinizer

sudo passwd apinizer
POWERSHELL

Disable firewall

sudo systemctl stop firewalld

sudo systemctl disable firewalld
POWERSHELL

Deactivate Selinux

Sunuculardaki iletişim sorunlarını önlemek için SELinux'u devre dışı bırakalım. 

sudo setenforce 0

sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
POWERSHELL

Deactivate Swap

Node'lardaki iletişim sorunlarını önlemek için swap'i devre dışı bırakalım.  Bunun için aşağıdaki adımlar yapılır. ve /etc/fstab dosyası içindeki swap satırı silinir.

sudo swapoff -a

sudo vi /etc/fstab              
POWERSHELL

IP Tables Configurations

Daha sonra vi dosyasını kapatalım (:wq). IPTables ayarlarına kaldığımız yerden devam edeceğiz.

sudo vi /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_max_syn_backlog=40000
net.core.somaxconn=40000
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.ipv4.tcp_sack=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_moderate_rcvbuf=1
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_mem=134217728 134217728 134217728
net.ipv4.tcp_rmem=4096 277750 134217728
net.ipv4.tcp_wmem=4096 277750 134217728
net.core.netdev_max_backlog=300000
POWERSHELL

Save Changes

Aşağıdaki komutu çalıştırarak değişiklikleri uygulayalım.

sudo modprobe br_netfilter

sudo sysctl --system
POWERSHELL

Loading br_netfilter module ( → Reboot)    

br_netfilter modülünü yükleyelim ve sonrasında yeniden başlatalım.

sudo lsmod | grep br_netfilter

sudo reboot
POWERSHELL

Not : Ubuntu paketleri güncellerken Türkiye lokasyonundaki sunucudan çekmeye çalışır. Ancak zaman zaman tr.archive.ubuntu.com adresinde sorun olabilmektedir. Bu durumda aşağıdaki değişikliği yapmak gerekir.

sudo vi /etc/apt/sources.list

### içinde tr. olan adreslerin hepsini "Replace All" ile değiştirin.

Örnek : 

Eski http://tr.archive.ubuntu.com/ubuntu

Yeni : http://archive.ubuntu.com/ubuntu


2. Docker Installation

Kubernetes kurulumuna geçmeden önce Docker'ı yüklemek için aşağıdaki komut çalıştırılır.

Ubuntu 2020.04 

Centos 7.9

sudo apt update

sudo apt install -y curl gnupg2 software-properties-common \ 
apt-transport-https ca-certificates

curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update

sudo apt install -y containerd.io docker-ce docker-ce-cli

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

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


sudo systemctl daemon-reload 
sudo systemctl restart docker
sudo systemctl enable docker

sudo groupadd docker

sudo gpasswd -a $USER docker
POWERSHELL
sudo yum-config-manager \
--add-repo https://download.docker.com/linux/centos/docker-ce.repo
 
sudo yum install docker-ce --nobest -y
 
sudo mkdir /etc/docker
 
sudo vi /etc/docker/daemon.json 
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}

sudo mkdir -p /etc/systemd/system/docker.service.d
 
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

sudo usermod -aG docker apinizer
POWERSHELL

3. Kubernetes Installation

Ubuntu 2020.04 

Centos 7.9

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg \
| sudo apt-key add -

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update
POWERSHELL
sudo apt -y install kubelet=1.18.4-00 kubeadm=1.18.4-00 kubectl=1.18.4-00
POWERSHELL
sudo systemctl enable kubelet

sudo systemctl start kubelet
POWERSHELL
sudo vi /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
POWERSHELL
sudo yum install -y kubelet-1.18.4 kubeadm-1.18.4 kubectl-1.18.4
POWERSHELL
sudo systemctl enable kubelet

sudo systemctl start kubelet
POWERSHELL

Beware

Yukarıdaki adımların hepsi Kubernetes Cluster'da olan tüm sunucular için yapılmalıdır.

4. Setup Kubernetes Master Node

(on Master Node)

Beware

Aşağıdaki adımlar sadece Kubernetes Master Sunucusu üzerinde yapılmalıdır.

Setting Single-Master Kubernetes (Skip the instruction below!)

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<MASTER-SERVER-IP-ADRESİNİZ>
POWERSHELL

Setting Multi-Master Kubernetes (Previous instruction must be skipped!)

Buradaki Load Balance adresi için, Master olarak tanımlanacak sunucuların bir Load Balancer arkasından yapılması gerekiyor. 

sudo kubeadm init --kubernetes-version "1.18.4" --pod-network-cidr "10.244.0.0/16" --control-plane-endpoint "<MASTER-SERVER-IP-ADRESİNİZ>:6443" --upload-certs
POWERSHELL

Changing the kubectl-authorized user to apinizier user.

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

Set up Pod Network

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
POWERSHELL

Using Master node also as Worker node

Kubernetes single control-plane konfigürasyonu yapılır.

Aşağıdaki kod parçası çalıştırıldığında tek makine üzerinde Master node aynı zamanda Worker node olarak çalıştırılabilir. Tavsiye edilen bir kurulum yöntemi değildir. En az 2 sunucu bulunması gerekmektedir.

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

Master'ı pod silmeden kaldırmak için

kubectl taint nodes node-name dedicated:NoSchedule-
POWERSHELL

5. Registering Kubernetes Worker Nodes to Kubernetes Master Node

Worker sunucusunu Master'a bağlamak için bir token bilgisine ihtiyaç vardır. Bu kurulum aşamasında master node'da yazılı olarak görülecektir. Ama atlanırsa ya da tekrar görüntülemek isterseniz aşağıdaki komut kullanılabilir.

(On Master Node)

$ sudo kubeadm token create --print-join-command
POWERSHELL

(For using Multi-Master structure, join the other Master nodes with code below)

sudo kubeadm join <MASTER-SERVER-IP-ADRESİNİZ>:6443 --token 8rd7kq.kcg3bkzkzdus8v54 \
  --discovery-token-ca-cert-hash sha256:4efb75f7e09c0a2a9db0d317dd40ac9cf9906c31109a670428d0d49981264904 \
  --control-plane --certificate-key c4161499f1f614322ea788831b4f72529175712c7c6f8888cdc14f5aab83fbce
BASH

(Affiliate the Worker node/s to Master node)

sudo kubeadm join <MASTER-SERVER-IP-ADRESİNİZ>:6443 --token 8rd7kq.kcg3bkzkzdus8v54 \
  --discovery-token-ca-cert-hash sha256:4efb75f7e09c0a2a9db0d317dd40ac9cf9906c31109a670428d0d49981264904 
BASH

6. Checking the Result

Master'dan aşağıdaki kod çalıştırıldığında Master'a ek olarak oluşturulan Node da görünüyorsa kurulum başarıyla tamamlanmış demektir.

İki dakika sonunda NotReady durumundan Ready durumuna geçmezse "kubectl describe node NODENAME" komutu ile sorun incelenmelidir.

kubectl get node

NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   5d    v1.18.4
ks-worker1   Ready    <none>   5d    v1.18.4

BASH

7. Registering Kubernetes Authorizations

Kubernetes küme verilerinizi korumak için, varsayılan olarak en az bir RBAC yapılandırması ile konuşlandırır. Şu anda, Dashboard yalnızca Bearer Token ile giriş yapmayı destekler. Aşağıdaki adımları sırası ile uygulayınız.

(Master Node üzerinde)

$ vi service.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
YML

(Master Node üzerinde)

$ vi adminuser.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
YML

(Master Node üzerinde)

kubectl apply -f service.yaml

kubectl apply -f adminuser.yaml

kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --user=admin --user=kubelet --group=system:serviceaccounts

kubectl create clusterrolebinding kubernetes-dashboard -n kube-system --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
POWERSHELL

DNS Test (Optional)

https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#inheriting-dns-from-the-node

kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml

kubectl get pods --namespace=kube-system -l k8s-app=kube-dns

kubectl -n kube-system get configmap coredns -oyaml

kubectl exec -i -t dnsutils -- nslookup kubernetes.default

kubectl exec -ti dnsutils -- cat /etc/resolv.conf
POWERSHELL