Зовнішній кластер Etcd для K8s з використанням Systemd – 2

Цей текст описує основні кроки для налаштування та побудови etcd кластеру. Код, який буде наведений нижче, слід виконувати по черзі і зазвичай з правами root. Роботи виконуються на всіх etcd вузлах, поки не буде вказано інакше.

  • Активуємо брандмауер:
systemctl enable firewalld  
systemctl start firewalld  

# Calico  
firewall-cmd --permanent --add-interface="cali+"  

# Kubernetes API сервер  
firewall-cmd --permanent --add-port=6442-6443/tcp  

# etcd  
firewall-cmd --permanent --add-port=2379-2380/tcp  

# kubelet API  
firewall-cmd --permanent --add-port=10250/tcp  

firewall-cmd --reload

Джерело: https://kubernetes.io/docs/reference/networking/ports-and-protocols/

  • Виконання основних налаштувань
vi /etc/hosts  
192.168.1.241 etcd0 control-plane0  
192.168.1.39 etcd1 control-plane1  
192.168.1.141 etcd2 control-plane2  
192.168.1.113 worker0  
192.168.1.137 worker1  
192.168.1.89 worker2  
192.168.1.105 worker3  
---  

dnf install -y chrony-4.5-3.el9 wget tar  
systemctl enable chronyd  
systemctl start chronyd  
systemctl stop firewalld <- якщо брандмауер активний, цей крок можна пропустити  
systemctl disable firewalld <- якщо брандмауер активний, цей крок можна пропустити  

echo '1' > /proc/sys/net/ipv4/ip_forward  

cat <

ЗадачаMax=infinity  
OOMScoreAdjust=-999  

[Install]  
WantedBy=multi-user.target  
---  

cd ~  
mkdir /etc/containerd  
containerd config default > /etc/containerd/config.toml  
vi /etc/containerd/config.toml  
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]  
 ...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]  
 SystemdCgroup = true <- змінити false на true!  
---  

systemctl daemon-reload  
systemctl enable --now containerd  
wget https://github.com/opencontainers/runc/releases/download/v1.2.2/runc.amd64  
install -m 755 runc.amd64 /usr/local/sbin/runc  
mkdir -p /opt/cni/bin  
wget https://github.com/containernetworking/plugins/releases/download/v1.6.0/cni-plugins-linux-amd64-v1.6.0.tgz  
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.6.0.tgz

Джерело: https://github.com/containerd/containerd/blob/v1.7.24/docs/getting-started.md, https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd-systemd

  • вимкнення swap і включення kubelet
swapoff -a  
vi /etc/fstab  
#/dev/mapper/rl-swap none swap defaults 0 0 <- закоментуйте  
---  

systemctl enable kubelet

Джерело: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/#setting-up-the-cluster

  • створення та копіювання сертифікатів etcd
vi kubeadm-config.sh  
#!/bin/bash  
# Оновіть HOST0, HOST1 та HOST2 з IP-адресами ваших хостів  
export HOST0=192.168.1.241  
export HOST1=192.168.1.39  
export HOST2=192.168.1.141  

# Оновіть NAME0, NAME1 та NAME2 з іменами ваших хостів  
export NAME0="etcd0"  
export NAME1="etcd1"  
export NAME2="etcd2"  

# Створення тимчасових директорій для файлів, які будуть передані на інші хости  
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/v1beta4"  
kind: InitConfiguration  
nodeRegistration:  
 name: ${NAME}  
localAPIEndpoint:  
 advertiseAddress: ${HOST}  
---  
apiVersion: "kubeadm.k8s.io/v1beta4"  
kind: ClusterConfiguration  
etcd:  
 local:  
 serverCertSANs:  
 - "${HOST}"  
 peerCertSANs:  
 - "${HOST}"  
 extraArgs:  
 - name: initial-cluster  
 value: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380  
 - name: initial-cluster-state  
 value: new  
 - name: name  
 value: ${NAME}  
 - name: listen-peer-urls  
 value: https://${HOST}:2380  
 - name: listen-client-urls  
 value: https://${HOST}:2379  
 - name: advertise-client-urls  
 value: https://${HOST}:2379  
 - name: initial-advertise-peer-urls  
 value: https://${HOST}:2380  
EOF  
done  
---  

chmod +x kubeadm-config.sh  
./kubeadm-config.sh  
kubeadm init phase certs etcd-ca  
vi create-certs.sh  
#!/bin/bash  
export HOST0=192.168.1.241  
export HOST1=192.168.1.39  
export HOST2=192.168.1.141  
kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml  
kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml  
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml  
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml  
cp -R /etc/kubernetes/pki /tmp/${HOST2}/  
# очищення не повторюваних сертифікатів  
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete  

kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml  
kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml  
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml  
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml  
cp -R /etc/kubernetes/pki /tmp/${HOST1}/  
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete
kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml  
kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml  
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml  
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml  
# Не потрібно переносити сертифікати, оскільки вони призначені для HOST0  

# очищаємо сертифікати, які не слід копіювати з цього хоста  
find /tmp/${HOST2} -name ca.key -type f -delete  
find /tmp/${HOST1} -name ca.key -type f -delete  
---  

chmod +x create-certs.sh  
./create-certs.sh  
vi copy.sh  
#!/bin/bash  

export HOST1=192.168.1.39  
export HOST2=192.168.1.141  

HOSTS=(${HOST1} ${HOST2})  

for i in "${!HOSTS[@]}"; do  
HOST=${HOSTS[$i]}  
USER=root  
HOST=${HOST}  
scp -r /tmp/${HOST}/* ${USER}@${HOST}:  
done  
---  

chmod +x copy.sh  
./copy.sh

Джерело: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/#setting-up-the-cluster

Процес для 192.168.1.39

  • Переміщення сертифікатів
mv ~/pki /etc/kubernetes/

Процес для 192.168.1.141

  • Переміщення сертифікатів
mv ~/pki /etc/kubernetes/

Процес для 192.168.1.241

  • Реєстрація сервісу etcd (etcd systemd) та запуск сервісу
cd etcd-v3.5.17-linux-amd64  
vi etcd.service  
[Unit]  
Description=etcd  

[Service]  
Type=exec  
ExecStart=/root/etcd-v3.5.17-linux-amd64/etcd \  
 --name  
 --cert-file=/etc/kubernetes/pki/etcd/server.crt \  
 --client-cert-auth=true \  
 --data-dir=/var/lib/etcd \  
 --key-file=/etc/kubernetes/pki/etcd/server.key \  
 --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt \  
 --peer-client-cert-auth=true \  
 --peer-key-file=/etc/kubernetes/pki/etcd/peer.key \  
 --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt \  
 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt \  
 --initial-advertise-peer-urls=https://192.168.1.241:2380 \  
 --listen-peer-urls=https://192.168.1.241:2380 \  
 --advertise-client-urls=https://192.168.1.241:2379 \  
 --listen-client-urls=https://192.168.1.241:2379,https://127.0.0.1:2379 \  
 --initial-cluster=etcd0=https://192.168.1.241:2380,etcd1=https://192.168.1.39:2380,etcd2=https://192.168.1.141:2380 \  
 --initial-cluster-state=new  
Restart=on-failure  
RestartSec=5  

[Install]  
WantedBy=multi-user.target  
---  

cp etcd.service /usr/lib/systemd/system  
systemctl daemon-reload  
systemctl enable --now etcd  
systemctl start etcd

Процес для 192.168.1.39

  • Реєстрація сервісу etcd (etcd systemd) та запуск сервісу
cd etcd-v3.5.17-linux-amd64  
vi etcd.service  
[Unit]  
Description=etcd  

[Service]  
Type=exec  
ExecStart=/root/etcd-v3.5.17-linux-amd64/etcd \  
 --name=etcd1 \  
 --cert-file=/etc/kubernetes/pki/etcd/server.crt \  
 --client-cert-auth=true \  
 --data-dir=/var/lib/etcd \  
 --key-file=/etc/kubernetes/pki/etcd/server.key \  

 --peer-client-cert-auth=true \  
 --peer-key-file=/etc/kubernetes/pki/etcd/peer.key \  
 --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt \  
 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt \  
 --initial-advertise-peer-urls=https://192.168.1.39:2380 \  
 --listen-peer-urls=https://192.168.1.39:2380 \  
 --advertise-client-urls=https://192.168.1.39:2379 \  
 --listen-client-urls=https://192.168.1.39:2379,https://127.0.0.1:2379 \  
 --initial-cluster=etcd0=https://192.168.1.241:2380,etcd1=https://192.168.1.39:2380,etcd2=https://192.168.1.141:2380 \  
 --initial-cluster-state=new  
Restart=on-failure  
RestartSec=5  

[Install]  
WantedBy=multi-user.target  
---  

cp etcd.service /usr/lib/systemd/system  
systemctl daemon-reload  
systemctl enable --now etcd  
systemctl start etcd

Процес для 192.168.1.141

  • Реєстрація сервісу etcd (etcd systemd) та запуск сервісу
cd etcd-v3.5.17-linux-amd64  
vi etcd.service  
[Unit]  
Description=etcd
--name=etcd2 \  
 --cert-file=/etc/kubernetes/pki/etcd/server.cr  
 --key-file=/etc/kubernetes/pki/etcd/server.key \  
 --peer-cert-file  
 --peer-key-file=/etc/kubernetes/pki/etcd/peer.key \  
 --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt \  
 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt \  
 --initial-advertise-peer-urls=https://192.168.1.141:2380 \  
 --listen-peer-urls=https://192.168.1.141:238  
 --listen-client-urls=https://192.  
 --initial-cluster=etcd0=https://192.168.1.241:2380,etcd1=https://192.168.1.39:2380,etcd2  
 --initial-cluster-state=new  
Restart=on-failure  
RestartSec=5  

[Install]  
WantedBy=multi-user.target  
---  

cp etcd.service /usr/lib/systemd/system  
systemctl daemon-reload  
systemctl enable --now etcd  
systemctl start etcd

Процес для будь-якого вузла

  • Тестування etcd
cd etcd-v3.5.17-linux-amd64  
ETCDCTL_API=3 ./etcdctl \  
 --cert /etc/kubernetes/pki/etcd/  
 --cacert /etc/kubernetes/pki/etcd/ca.crt \  
 --endpoints https://192.168.1.241:2379 endpoint health --cluster  
# Не обов'язково використовувати IP 241, можна також використати 141 або 39.

Джерело: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/

Перекладено з: External Etcd K8s cluster with Systemd - 2

Leave a Reply

Your email address will not be published. Required fields are marked *