Kubernetes Multi-Master Kurulumu (External ETCD)
Kurulum yaparken kullanacağım environment listem aşağıdaki gibidir.
# OS DEBIAN10
# Master
10.30.90.2 VTGENK8SMAS01
10.30.90.3 VTGENK8SMAS02
10.30.90.4 VTGENK8SMAS03
#ETCD
10.30.90.5 VTGENK8SETD02
10.30.90.6 VTGENK8SETD01
10.30.90.7 VTGENK8SETD03
# Worker
10.30.90.8 VTGENK8SWOR01
10.30.90.9 VTGENK8SWOR02
10.30.90.10 VTGENK8SWOR03
10.30.90.11 VTGENK8SWOR04
10.30.90.12 VTGENK8SWOR05
10.30.90.13 VTGENK8SWOR06
10.30.90.14 VTGENK8SWOR07
10.30.90.15 VTGENK8SWOR08
10.30.90.16 VTGENK8SWOR09
10.30.90.17 VTGENK8SWOR10
#HAPROXY
10.30.90.21 VTGENK8SHAP01
Docker kubernetes ve kubernetes komponentleri hakkında daha detaylı bilgi için aşağıdaki yazılarımı inceleyebilirsiniz.
1. Haproxy Kurulumu
HAproxy’nin amacı master sunucular üzerinde çalışan api adreslerini loadbalance yaparken multi-master clsuter oluşturmaktır. Bunun için öncelikle haproxy kurulumu yapılır.
apt-get install haproxy
Daha sonra konfigürasyon dosyası eklenir ve haproxy aktif edilir.
# /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log /dev/log local0
log /dev/log local1 notice
daemon#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 1
timeout http-request 10s
timeout queue 20s
timeout connect 5s
timeout client 20s
timeout server 20s
timeout http-keep-alive 10s
timeout check 10s#---------------------------------------------------------------------
# apiserver frontend which proxys to the control plane nodes
#---------------------------------------------------------------------
frontend apiserver
bind *:6443
mode tcp
option tcplog
default_backend apiserver#---------------------------------------------------------------------
# round robin balancing for apiserver
#---------------------------------------------------------------------
backend apiserver
option httpchk GET /healthz
http-check expect status 200
mode tcp
option ssl-hello-chk
balance roundrobin
server VTGENK8SMAS01 VTGENK8SMAS01:6443 check
server VTGENK8SMAS02 VTGENK8SMAS02:6443 check
server VTGENK8SMAS03 VTGENK8SMAS03:6443 check
2. Base Kurulumlar
Kubernetes master, worker ve etcd sunucularda aşağıdaki komutlar çalıştırılır base kurulum tamamlanır.
apt-get updateswapoff -a### Kubernetes, Kubelet ve Kubectl Kurulumuapt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl### Container Runtime kurulumusudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-commonsudo mkdir -p /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-pluginrm /etc/containerd/config.tomlsystemctl restart containerd
3. ETCD Cluster Kurulumu
Cluster ETCD kurulumundan önce birbirleri arasında iletişim kurarken sertifika hatası almamak için VTGENK8SETD01 üzerinde sertifika oluşturulur ve diğer etcd sunucularına taşıma işlemi yapılır.
Aşağıdaki script VTGENK8SETD01 sunucunda /tmp/etcd.sh olarak kaydedilir.
# Update HOST0, HOST1 and HOST2 with the IPs of your hosts
export HOST0=10.30.90.6
export HOST1=10.30.90.7
export HOST2=10.30.90.8
# Update NAME0, NAME1 and NAME2 with the hostnames of your hosts
export NAME0="VTGENK8SETD01"
export NAME1="VTGENK8SETD02"
export NAME2="VTGENK8SETD03"
# Create temp directories to store files that will end up on other hosts.
mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/
HOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=(${NAME0} ${NAME1} ${NAME2})
for i in "${!HOSTS[@]}"; do
HOST=${HOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
---
apiVersion: "kubeadm.k8s.io/v1beta3"
kind: InitConfiguration
nodeRegistration:
name: ${NAME}
localAPIEndpoint:
advertiseAddress: ${HOST}
---
apiVersion: "kubeadm.k8s.io/v1beta3"
kind: ClusterConfiguration
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
initial-cluster: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380
initial-cluster-state: new
name: ${NAME}
listen-peer-urls: https://${HOST}:2380
listen-client-urls: https://${HOST}:2379
advertise-client-urls: https://${HOST}:2379
initial-advertise-peer-urls: https://${HOST}:2380
EOF
done
Sertifika oluşturma işlemlerinin hepsi VTGENK8SETD01 sunucusunda yapılacak daha sonra diğer sunuculara aktarım yapılacaktır.
sh /tmp/etcd.sh# VTGENK8SETD02 için sertifika işlemleri yapılır.kubeadm init phase certs etcd-server --config=/tmp/10.30.90.7/kubeadmcfg.yamlkubeadm init phase certs etcd-peer --config=/tmp/10.30.90.7/kubeadmcfg.yamlkubeadm init phase certs etcd-healthcheck-client --config=/tmp/10.30.90.7/kubeadmcfg.yamlkubeadm init phase certs apiserver-etcd-client --config=/tmp/10.30.90.7/kubeadmcfg.yamlcp -R /etc/kubernetes/pki /tmp/10.30.90.7/
# cleanup non-reusable certificates
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete# VTGENK8SETD03 için sertifika işlemleri yapılır.kubeadm init phase certs etcd-server --config=/tmp/10.30.90.5/kubeadmcfg.yamlkubeadm init phase certs etcd-peer --config=/tmp/10.30.90.5/kubeadmcfg.yamlkubeadm init phase certs etcd-healthcheck-client --config=/tmp/10.30.90.5/kubeadmcfg.yamlkubeadm init phase certs apiserver-etcd-client --config=/tmp/10.30.90.5/kubeadmcfg.yamlcp -R /etc/kubernetes/pki /tmp/10.30.90.5/
# cleanup non-reusable certificates
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete# VTGENK8SETD01 için sertifika işlemleri yapılır.kubeadm init phase certs etcd-server --config=/tmp/10.30.90.6/kubeadmcfg.yamlkubeadm init phase certs etcd-peer --config=/tmp/10.30.90.6/kubeadmcfg.yamlkubeadm init phase certs etcd-healthcheck-client --config=/tmp/10.30.90.6/kubeadmcfg.yamlkubeadm init phase certs apiserver-etcd-client --config=/tmp/10.30.90.6/kubeadmcfg.yaml# Taşıma Öncesi Gereksiz Sertifikalar temizlenir.find /tmp/10.30.90.7 -name ca.key -type f -delete
find /tmp/10.30.90.5 -name ca.key -type f -delete#Sertifikalar taşınır.scp -r /tmp/10.30.90.7/* arif@10.30.90.7:/home/arif/
scp -r /tmp/10.30.90.5/* arif@10.30.90.5:/home/arif/# VTGENK8SETD02 ve VTGENK8SETD03 sunucularında sertifikalar gerekli dizine kopyalanır.mv /home/arif/pki /etc/kubernetes/#VTGENK8SETD01, VTGENK8SETD02 ve VTGENK8SETD03 sunucularında çalıştırılırkubeadm init phase etcd local --config=/home/arif/kubeadmcfg.yaml
Kurulum sonrasında kontrol etmek için
docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.k8s.io/etcd:3.4.3-0 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints https://10.30.90.5:2379 endpoint health --cluster
Dikkat!!! Bu komut ile etcd temizleme işlemi yapabilirsiniz.
docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.k8s.io/etcd:3.4.3-0 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints https://10.30.90.5:2379 del "" --from-key=true
Kubernetes Cluster initiation kısmına geçmeden önce sertifikalar VTGENK8SMAS01 sunucusuna kopyalanor.
scp -r /etc/kubernetes/pki/etcd/ca.crt root@VTGENK8SMAS01:/etc/kubernetes/pki/etcd/scp -r /etc/kubernetes/pki/apiserver-etcd-client.crt root@VTGENK8SMAS01:/etc/kubernetes/pki/etcd/scp -r /etc/kubernetes/pki/apiserver-etcd-client.key root@VTGENK8SMAS01:/etc/kubernetes/pki/etcd/
VTGENK8SMAS01 sunucusuna bağlanılır ve aşağıdaki gibi config oluşturulur.
#VTGENK8SMAS01cat << EOF > /tmp/kubeadm-config.yaml
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "10.30.90.21:6443" # change this (see below)
etcd:
external:
endpoints:
- https://10.30.90.6:2379 # change ETCD_0_IP appropriately
- https://10.30.90.5:2379 # change ETCD_1_IP appropriately
- https://10.30.90.7:2379 # change ETCD_2_IP appropriately
caFile: /etc/kubernetes/pki/etcd/ca.crt
certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt
keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key
networking:
podSubnet: "10.244.0.0/16" # --pod-network-cidrEOF
Daha sonra oluşturduğumuz config dosyasını kullanarak initiation işlemi başlatılır.
#Master1sudo kubeadm init --config /tmp/kubeadm-config.yaml --upload-certsmkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
VTGENK8SMAS01 sunucusunda işlem bittikten outputda görünen control-plane join komutu VTGENK8SMAS02 ve VTGENK8SMAS03 sunucularında çalıştırılır.
#VTGENK8SMAS02 / VTGENK8SMAS03kubeadm join 10.30.90.21:6443 --token apo6io.ucdqdkz5tk1zcrbk \ --discovery-token-ca-cert-hash sha256:93de7b662abe4b2a0811326b5202c585a5494ad2ebc01c52aa7de1665214c8cd \ --control-plane --certificate-key 0558277d27dd5981467cea1271865bd9e6a9456aa2feasd5a2f6c1c6c7ae6060mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
Yine aynı output içerisindeki worker node join komutu ile worker node eklenir.
# Tüm Worker Sunuculardakubeadm join 10.30.90.21:6443 --token apo6io.ucdqdkz5tk1zcrbk --discovery-token-ca-cert-hash sha256:93de7b662abe4b2a0811326b5202c585a5494562ebc01asd2aa7de1665214c8cd
CNI kurulumu yapılır ve kurulum tamamlanır.
kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
Kurulumlarımız tamamalandı.
kubectl get nodes -o wide
kubectl get pods --all-namespaces
HAProxy loglarına bakarak 3 master sunucunun isteklere cevap verdiğini görebiliriz.