> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinizer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Red Hat

> RHEL (Red Hat Enterprise Linux) 8.x / 9.x ve Rocky Linux işletim sistemlerinde Kubernetes 1.34 sürümünü kurabilir. Containerd container runtime'ını yapılandırabilir, Flannel network plugin'i ile cluster ağ yapısını oluşturabilir ve multi-master yapılandırması yapabilir.

## Kuruluma Başlamadan Önce Yapılması Gereken Kontroller

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

<Warning>
  ### (Gerekirse) Hostname değiştirme

  ```bash theme={null}
  hostnamectl set-hostname your-new-hostname
  ```

  `/etc/hosts` dosyasında `127.0.1.1` gibi ip'li blok hostname assign olmasın.

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

<Warning>
  Eğer internete erişim için Proxy gerekiyorsa aşağıdaki kodlar çalıştırılmalıdır.

  ```bash theme={null}
  #Linux Shell üzerinde aşağıdakileri çalıştırın:
  export http_proxy=http://proxyIp:port/
  export https_proxy=http://proxyIp:port/
  export no_proxy=localhost,127.0.0.1,SERVERIP,*.hostname
  ```

  Aşağıdaki dosyalara altındaki kodları ekleyiniz:

  ```bash theme={null}
  sudo vi /etc/apt/apt.conf
  ```

  ```
  Acquire::http::Proxy "http://username:password@proxyIp:port";
  Acquire::https::Proxy "https://username:password@proxyIp:port";
  ```

  ```bash theme={null}
  sudo mkdir -p /etc/systemd/system/containerd.service.d/

  sudo vi /etc/systemd/system/containerd.service.d/http-proxy.conf
  ```

  ```
  [Service]
  Environment="HTTP_PROXY=http://proxyIp:port"
  Environment="HTTPS_PROXY=https://proxyIp:port"
  Environment="NO_PROXY=localhost,127.0.0.1,::1,SERVERIP,*.hostname"
  ```

  ```bash theme={null}
  # systemd'yi yeniden yüklenir
  sudo systemctl daemon-reload
   
  # containerd'yi yeniden başlatılır
  sudo systemctl restart containerd
   
  # Ayarların yüklendiğini kontrol edilir
  sudo systemctl show --property=Environment containerd
  ```
</Warning>

## 1) İşletim Sistemi Konfigürasyonları (Tüm Sunucularda Yapılacaktır)

```bash theme={null}
# Refresh your cache of enabled yum repositories.
dnf makecache --refresh

# Execute following dnf command to update your Rocky Linux server.
dnf update -y

# Aşağıdaki araçların tüm sunucular üzerinde kurulu olması tavsiye edilmektedir.
sudo dnf install -y net-tools yum-utils bind-utils  device-mapper-persistent-data lvm2 telnet wget zip curl lsof

# Apinizer kullanıcısı oluşturulur ve yetkilendirilir.
sudo adduser apinizer
sudo passwd apinizer
sudo usermod -aG wheel apinizer

# Kullanıcıya geçilerek işlemlere devam edilir
su - apinizer

# Güvenlik duvarı kapatılır
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# Sunuculardaki iletişim sorunlarını önlemek için SELinux'u devre dışı bırakılır.
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# Swap kapatılır ve yeniden başlamasının önlenmesi için /etc/fstab dosyası içindeki swap satırı silinir.
sudo swapoff -a
sudo vi /etc/fstab
# Daha sonra vi dosyasını kapatılır (:wq)
```

## 2) Kubernetes Kurulumu

### 2.1) Konteyner Kurulumu (Tüm Kubernetes Sunucularında Yapılacaktır)

Kubernetes kurulumuna geçmeden önce sistemi hazırlamak ve Docker'ı yüklemek için aşağıdaki adımlar izlenir.

```bash theme={null}
#Modüllerin çalışmakta olan sistemde yüklenmeleri için
sudo modprobe overlay
sudo modprobe br_netfilter

sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

#sysctl ayarları 
sudo vi /etc/sysctl.d/k8s.conf
```

Buradaki ilk üç satır zorunlu olup, diğerleri ihtiyaca göre değiştirilebilinir.

```
net.ipv4.ip_local_port_range=1024 65535
fs.file-max=2097152
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_max_tw_buckets=1440000
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
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
```

Gerekli modüller yüklenir.

```bash theme={null}
#Konfigürasyonların yüklenmesi
sudo sysctl --system

#Docker deposunun tanımlanması
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf makecache

#containerd modülünün yüklenmesi
sudo dnf install -y containerd.io

#containerd modülünün ayarları
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

#containerd modülünün başlatılması
sudo systemctl restart containerd
sudo systemctl enable containerd
systemctl status containerd
```

<Info>
  `package runc-1:1.1.4-1.module+el8.7.0+16520+2db5507d.x86_64` is filtered out by modular filtering benzeri hatalar ile karşılaşılırsa aşağıdaki komut satırı uygulanır.

  ```bash theme={null}
  sudo yum remove containerd.io | sudo yum remove runc
  ```
</Info>

### 2.2) Kubernetes Kurulumu (Master ve Worker sunucularda)

Kubernetes anahtarlarını ve depo adresleri sisteme yüklenir, kubernetes kurulur ve başlatılır.

```bash theme={null}
sudo vi /etc/yum.repos.d/kubernetes.repo
```

```
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
```

```bash theme={null}
#Kubernetes kurulumu
sudo dnf makecache --refresh
sudo dnf install -y kubeadm kubelet kubectl
systemctl enable --now kubelet.service

#Kubernetes kurulum kontrolü ve başlatılması
kubectl version --client && kubeadm version
```

#### 2.2.1) Bash Auto-Completion (İsteğe Bağlı, Herhangi Bir Kubernetes Master Sunucusunda)

Bu işlem ile kubernetes komutlarının yazımında hız kazanılabilir.

```bash theme={null}
yum install bash-completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc
```

#### 2.2.2) Kubernetes Control Plane (Master) Başlatma

Kubernetes Kümesi oluşturmak için gerekli olan container image'lerini indirmek için aşağıdaki komutu yürütün.

Bu Node, kümedeki ilk Node olduğu için Kubernetes Control Plane olarak seçilecektir.

```bash theme={null}
kubeadm config images pull
sudo kubeadm init --pod-network-cidr "10.244.0.0/16" --control-plane-endpoint "<MASTER_SERVER_HOSTNAME>" --upload-certs
```

Multi-Master yapısını kullanmak için diğer Master olacak node'lar aşağıdaki kod ile bağlanmalıdır.

```bash theme={null}
sudo kubeadm join <MASTER_SERVER_HOSTNAME>:6443 --token <XXX> --discovery-token-ca-cert-hash sha256:<YYY> --control-plane --certificate-key <ZZZ>
```

<Warning>
  **Çok Önemli**

  Eğer bağlantı komutu yeniden oluşturulmak istenirse aşağıdaki kodlardan ikincisinin çıktısı ilkine eklenmelidir;

  ```bash theme={null}
  kubeadm token create --print-join-command
  sudo kubeadm init phase upload-certs --upload-certs
  ```

  Sonuç olarak aşağıdaki gibi bir görünümde olmalıdır:

  ```
  <1. adımdaki join komutunun çıktısı> --control-plane --certificate-key <2. adımın çıktısı olan key değeri>
  ```

  Eğer kod manuel olarak oluşturulmak istenirse, aşağıdakiler kullanılır:

  * XXX için → `kubeadm token list`
  * YYY için → `openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'`
  * ZZZ için → `sudo kubeadm init phase upload-certs --upload-certs`
</Warning>

#### 2.2.3) Kubernetes Master Sunucusunda Kubectl Komutunun Kullanıcı Konfigürasyonunu Ayarlama (Kubernetes Master Sunucularında)

kubectl komutlarını çalıştıracak kullanıcıda iken gerekli ayarlar yapılır.

```bash theme={null}
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown -R $(id -u):$(id -g) $HOME/.kube
```

Tüm oturumlar için KUBECONFIG değişkenini ayarlamak için aşağıdaki komutu yürütün.

```bash theme={null}
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile.d/k8s.sh
```

#### 2.2.4) Kubernetes Ağ Eklentisini Kurun (Kubernetes Master Sunucularında)

Bu kılavuzda Calico ağ eklentisini kullanacağız. Desteklenen diğer ağ eklentilerini seçebilirsiniz. calico, Kubernetes için tasarlanmış bir Layer-3 ağ yapısını yapılandırmanın basit ve kolay bir yoludur.

```bash theme={null}
curl https://raw.githubusercontent.com/projectcalico/calico/v3.31.3/manifests/calico.yaml -O 
```

```bash theme={null}
kubectl apply -f calico.yaml
```

#### 2.2.5) Master Sunucu Aynı Zamanda Worker Olarak da Kullanılmak İstenirse (Opsiyonel)

<Warning>
  Canlı ortamlar için tavsiye edilen bir yöntem değildir.
</Warning>

<Info>
  Master'dan Worker görevini eklemek için

  ```bash theme={null}
  # Tüm Master'ları Worker yapmak için
  kubectl  taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-

  # Tüm Master'lara Worker görevi vermek için, bazı durumlarda master yazmak gerekiyor
  kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule-

  # Sadece bir Master'a Worker görevi vermek için
  kubectl taint nodes <NODE_NAME> node-role.kubernetes.io/control-plane:NoSchedule-
  ```

  Master'dan Worker görevini kaldırmak için

  ```bash theme={null}
  # Tüm Master'lardan Worker'lık görevini kaldırmak için
  kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule

  # Bazı durumlar için control-plane yerine master yazmak gerekiyor
  kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule

  # Sadece bir Master'dan Worker görevini kaldırmak için
  kubectl taint nodes <NODE_NAME> node-role.kubernetes.io/control-plane:NoSchedule
  ```
</Info>

#### 2.2.6) Kubernetes Worker Sunucularını Master'a Kaydetmek (Kubernetes Worker Sunucularında)

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.

Master Node üzerinde

```bash theme={null}
sudo kubeadm token create --print-join-command
```

Worker olacak Node(lar) üzerinde

```bash theme={null}
sudo kubeadm join <MASTER_SERVER_HOSTNAME>:6443 --token xxx --discovery-token-ca-cert-hash sha256:yyy
```

#### 2.2.7) Kurulum Kontrol (Herhangi Bir Kubernetes Master Sunucusunda)

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 <NODE_NAME>"` komutu ile sorun incelenmelidir.

```bash theme={null}
kubectl get node
```

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

### 2.3) DNS Test (İsteğe Bağlı, Herhangi Bir Kubernetes Master Sunucusunda)

```bash theme={null}
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
```

Daha fazla bilgi için lütfen bu linkteki adresi inceleyiniz.
