Цей текст описує основні кроки для налаштування та побудови 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
- створення та копіювання сертифікатів 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
Процес для 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