kubekey/builtin/core/playbooks/add_nodes.yaml
redscholar c044b8aa26
fix: scaling down etcd
Signed-off-by: redscholar <blacktiledhouse@gmail.com>
2025-12-04 10:38:48 +08:00

138 lines
4.8 KiB
YAML

---
- hosts:
- all
roles:
- native/root
- import_playbook: hook/pre_install.yaml
# Load default variables and perform prechecks on all hosts
- hosts:
- all
gather_facts: true
roles:
- defaults
- precheck
# Download all required software and generate certificates on the localhost
- hosts:
- localhost
gather_facts: true
roles:
- certs/init
- download
- certs/check
# Initialize all nodes and install necessary software packages
- hosts:
- etcd
- k8s_cluster
- image_registry
- nfs
roles:
- native
# Install the etcd cluster
- hosts:
- etcd
gather_facts: true
roles:
- role: etcd
when:
- .etcd.deployment_type | eq "external"
- hosts:
- kube_control_plane
tasks:
- name: AddNodes | Check if should update apiserver certificates
run_once: true
add_hostvars:
hosts: kube_control_plane
vars:
need_installed_etcd: >-
{{- $needInstalled := list -}}
{{- range .groups.etcd -}}
{{- if and ((index $.hostvars . "etcd_install_LoadState" "stdout") | eq "not-found") ($.delete_nodes | default list | has . | not) -}}
{{- $needInstalled = append $needInstalled . -}}
{{- end -}}
{{- end -}}
{{ $needInstalled | toJson }}
- name: AddNodes | Update apiserver etcd certificates
when:
- .need_installed_etcd | fromJson | empty | not
- .etcd.deployment_type | eq "external"
block:
- name: AddNodes | Copy etcd CA certificate to control plane node
copy:
src: >-
{{ .etcd.ca_file }}
dest: /etc/kubernetes/pki/etcd/ca.crt
- name: AddNodes | Copy etcd client certificate to control plane node
copy:
src: >-
{{ .etcd.cert_file }}
dest: /etc/kubernetes/pki/etcd/client.crt
- name: AddNodes | Copy etcd client key to control plane node
copy:
src: >-
{{ .etcd.key_file }}
dest: /etc/kubernetes/pki/etcd/client.key
- name: AddNodes | update ks-apiserver
command: |
{{- $endpoints := list -}}
{{- range .groups.etcd | default list -}}
{{- $endpoints = append $endpoints (printf "https://%s:2379" (index $.hostvars . "internal_ipv4")) -}}
{{- end -}}
ETCD_ENDPOINTS="{{ join "," $endpoints }}"
if ! grep -q 'ClusterConfiguration' /etc/kubernetes/kubeadm-config.yaml 2>/dev/null; then
kubectl get cm kubeadm-config -n kube-system -o=jsonpath='{.data.ClusterConfiguration}' > /etc/kubernetes/kubeadm-config.yaml
fi
awk -v ep="$ETCD_ENDPOINTS" '
BEGIN {
n = split(ep, arr, ",")
for (i = 1; i <= n; i++) {
print " - " arr[i]
}
}
' > /etc/kubernetes/kubeadm_new_endpoints.yaml
# delete old endpoint
sed -i '/^[[:space:]]*endpoints:/{
:loop
N
s/\n[[:space:]]\+-.*//; t loop
s/\n[[:space:]]*\n/\n/g
P
D
}' /etc/kubernetes/kubeadm-config.yaml
# insert new endpoint
sed -i "/^[[:space:]]*endpoints:/r /etc/kubernetes/kubeadm_new_endpoints.yaml" /etc/kubernetes/kubeadm-config.yaml
rm /etc/kubernetes/kubeadm_new_endpoints.yaml
# update kubeadm-config
{{- if .kubernetes.kube_version | semverCompare "<v1.27.0" }}
kubeadm config upload from-file --config /etc/kubernetes/kubeadm-config.yaml
{{- else }}
kubeadm init phase upload-config kubeadm --config /etc/kubernetes/kubeadm-config.yaml
{{- end }}
# regenerate kube-apiserver
kubeadm init phase control-plane apiserver --config /etc/kubernetes/kubeadm-config.yaml
- hosts:
- k8s_cluster
roles:
- role: cri
when: or (.add_nodes | default list | empty) (.add_nodes | default list | has .inventory_hostname)
- role: kubernetes/pre-kubernetes
when: or (.add_nodes | default list | empty) (.add_nodes | default list | has .inventory_hostname)
- role: kubernetes/init-kubernetes
when: or (.add_nodes | default list | empty) (.add_nodes | default list | has .inventory_hostname)
- role: kubernetes/join-kubernetes
when:
- or (.add_nodes | default list | empty) (.add_nodes | default list | has .inventory_hostname)
- .kubernetes_install_LoadState.stdout | eq "not-found"
- role: kubernetes/certs
when:
- or (.add_nodes | default list | empty) (.add_nodes | default list | has .inventory_hostname)
- .groups.kube_control_plane | default list | has .inventory_hostname
- .kubernetes.certs.renew