Перейти к основному содержимому

5.1.3.2. Добавление узла

Обратите внимание!

Данный раздел является опциональным и предназначен только для случаев, когда необходимо настроить данный ресурс отдельно от остальных.

Переменные окружния

export HOST_NAME=master-2
export CLUSTER_NAME=my-first-cluster
export BASE_DOMAIN=example.com
export MACHINE_LOCAL_ADDRESS=$(ip -4 addr show scope global | awk '/inet/ {print $2; exit}' | cut -d/ -f1)
export FULL_HOST_NAME=${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}

# Получаем список существующих etcd-нод
mapfile -t ETCD_PODS < <(kubectl get pods \
--kubeconfig=/etc/kubernetes/admin.conf \
-n kube-system -l component=etcd \
-o jsonpath="{range .items[*]}{.metadata.name} {.status.podIP}{'\n'}{end}")

ETCD_EXISTING_NODES=""
ETCD_ENDPOINTS=""

for entry in "${ETCD_PODS[@]}"; do
read -r podname podip <<< "$entry"
nodename="${podname#etcd-}"
ETCD_EXISTING_NODES+="${nodename}=https://${podip}:2380,"
ETCD_ENDPOINTS+="https://${podip}:2379,"
done

ETCD_EXISTING_NODES="${ETCD_EXISTING_NODES%,}"
ETCD_ENDPOINTS="${ETCD_ENDPOINTS%,}"

# Добавляем текущий узел, если его нет в списке
ETCD_CURRENT_NODE="${FULL_HOST_NAME}=https://${MACHINE_LOCAL_ADDRESS}:2380"

if [[ "$ETCD_EXISTING_NODES" == *"${FULL_HOST_NAME}="* ]]; then
export ETCD_INITIAL_CLUSTER="$ETCD_EXISTING_NODES"
else
if [[ -n "$ETCD_EXISTING_NODES" ]]; then
export ETCD_INITIAL_CLUSTER="${ETCD_EXISTING_NODES},${ETCD_CURRENT_NODE}"
else
export ETCD_INITIAL_CLUSTER="${ETCD_CURRENT_NODE}"
fi
fi

export ETCD_ENDPOINTS

Рабочая директория

mkdir -p /etc/kubernetes/manifests
Static Pod ETCD

Генерация манифеста

cat <<EOF > /etc/kubernetes/manifests/etcd.yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/etcd.advertise-client-urls: https://${MACHINE_LOCAL_ADDRESS}:2379
creationTimestamp: null
labels:
component: etcd
tier: control-plane
name: etcd
namespace: kube-system
spec:
containers:
- command:
- etcd
- --advertise-client-urls=https://${MACHINE_LOCAL_ADDRESS}:2379
- --auto-compaction-retention=8
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --election-timeout=1500
- --experimental-initial-corrupt-check=true
- --experimental-watch-progress-notify-interval=5s
- --heartbeat-interval=250
- --initial-advertise-peer-urls=https://${MACHINE_LOCAL_ADDRESS}:2380
- --initial-cluster=${ETCD_INITIAL_CLUSTER}
- --initial-cluster-state=existing
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://0.0.0.0:2379
- --listen-metrics-urls=http://0.0.0.0:2381
- --listen-peer-urls=https://0.0.0.0:2380
- --logger=zap
- --max-snapshots=10
- --max-wals=10
- --metrics=extensive
- --name=${FULL_HOST_NAME}
- --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
- --snapshot-count=10000
- --quota-backend-bytes=10737418240
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
image: registry.k8s.io/etcd:3.5.12-0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 0.0.0.0
path: /health?exclude=NOSPACE&serializable=true
port: 2381
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: etcd
resources:
requests:
cpu: 100m
memory: 100Mi
startupProbe:
failureThreshold: 24
httpGet:
host: 0.0.0.0
path: /health?serializable=false
port: 2381
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
name: etcd-certs
hostNetwork: true
priority: 2000001000
priorityClassName: system-node-critical
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd
type: DirectoryOrCreate
name: etcd-data
status: {}
EOF
Расширение ETCD кластера

Добавление узла

Объявляем alias для etcdctl с использованием нужных сертификатов

alias etcdctl='etcdctl \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt'

Функция для получения списка client-URL'ов всех текущих членов кластера

etcdctlMembers() {
etcdctl member list \
--endpoints="$ETCD_ENDPOINTS" \
--write-out=json | jq \
-r '[.members[].clientURLs[]] | join(",")'
}

Просмотр текущих членов кворума

etcdctl \
--endpoints=$(etcdctlMembers) member list \
-w table

Добавление нового узла в ETCD кластер

etcdctl \
--endpoints=$(etcdctlMembers) \
member add ${FULL_HOST_NAME} \
--peer-urls=https://${MACHINE_LOCAL_ADDRESS}:2380
ВНИМАНИЕ!

После добавления второй ноды в ETCD-кворум, первый мастер может стать недоступным, пока второй узел ETCD не будет запущен. Обязательно запустите ETCD на новой ноде с помощью kubelet (см. шаг ниже), прежде чем продолжать.