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

163 lines
6.4 KiB
YAML

---
- hosts:
- all
roles:
- native/root
# Load default variables and perform prechecks on all hosts
- hosts:
- all
gather_facts: true
roles:
- defaults
- hosts:
- etcd
roles:
- role: etcd
when:
- .delete.etcd
- .etcd.deployment_type | eq "external"
- hosts:
- kube_control_plane
pre_tasks:
- name: DeleteNode | Ensure at least one control plane node remains in the cluster
run_once: true
command: |
{{- $cpNodes := list -}}
{{- range .groups.kube_control_plane -}}
{{- if index $.hostvars . "kubernetes_install_LoadState" "stdout" | eq "loaded" -}}
{{- $cpNodes = append $cpNodes . -}}
{{- end -}}
{{- end -}}
{{- if (subtractList $cpNodes .delete_nodes) | empty }}
echo "At least one control plane node must be retained in the cluster." >&2
exit 1
{{- end }}
tasks:
- name: DeleteNode | Update etcd certificate for kube_control_plane
when:
- .delete.etcd
- .etcd.deployment_type | eq "external"
block:
- name: DeleteNode | Check if should update apiserver certificates
run_once: true
add_hostvars:
hosts: kube_control_plane
vars:
need_uninstall_etcd: >-
{{- $needUnInstalled := list -}}
{{- range .groups.etcd -}}
{{- if $.delete_nodes | default list | has . -}}
{{- $needUnInstalled = append $needUnInstalled . -}}
{{- end -}}
{{- end -}}
{{ $needUnInstalled | toJson }}
- name: DeleteNode | Update apiserver etcd certificates
when:
- .need_uninstall_etcd | fromJson | empty | not
block:
- name: DeleteNode | Copy etcd CA certificate to control plane node
copy:
src: >-
{{ .etcd.ca_file }}
dest: /etc/kubernetes/pki/etcd/ca.crt
- name: DeleteNode | Copy etcd client certificate to control plane node
copy:
src: >-
{{ .etcd.cert_file }}
dest: /etc/kubernetes/pki/etcd/client.crt
- name: DeleteNode | Copy etcd client key to control plane node
copy:
src: >-
{{ .etcd.key_file }}
dest: /etc/kubernetes/pki/etcd/client.key
- name: DeleteNode | update ks-apiserver
command: |
{{- $endpoints := list -}}
{{- range .groups.etcd | default list -}}
{{- if $.need_uninstall_etcd | fromJson | has . | not -}}
{{- $endpoints = append $endpoints (printf "https://%s:2379" (index $.hostvars . "internal_ipv4")) -}}
{{- end -}}
{{- 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
pre_tasks:
- name: DeleteNode | Remove node from Kubernetes cluster
when: .delete_nodes | default list | has .inventory_hostname
command: |
if kubectl get node {{ .hostname }} > /dev/null 2>&1; then
kubectl cordon {{ .hostname }}
if [ $(kubectl get nodes --no-headers | wc -l) -gt 1 ]; then
kubectl drain {{ .hostname }} --ignore-daemonsets --delete-emptydir-data --force --disable-eviction
else
kubectl drain {{ .hostname }} --ignore-daemonsets --delete-emptydir-data --force
fi
{{- if .cni.type | eq "calico" }}
calicoctl delete node {{ .hostname }}
{{- end }}
kubectl delete node {{ .hostname }}
fi
roles:
- role: uninstall/kubernetes
when: .delete_nodes | default list | has .inventory_hostname
- role: uninstall/cri
when:
- .delete.cri
- .groups.image_registry | default list | has .inventory_hostname | not
- .delete_nodes | default list | has .inventory_hostname
post_tasks:
- name: DeleteNode | Clean up local DNS configuration files
ignore_errors: true
loop: "{{ .native.localDNS | toJson }}"
command: |
sed -i ':a;$!{N;ba};s@# kubekey hosts BEGIN.*# kubekey hosts END@@' {{ .item }}
sed -i ':a;$!{N;ba};s@# kubekey kubernetes control_plane_endpoint BEGIN.*# kubekey kubernetes control_plane_endpoint END@@' {{ .item }}
sed -i ':a;$!{N;ba};s@# kubekey image_registry control_plane_endpoint BEGIN.*# kubekey image_registry control_plane_endpoint END@@' {{ .item }}
when:
- .delete.dns
- .delete_nodes | default list | has .inventory_hostname
- hosts:
- image_registry
roles:
- role: uninstall/image-registry
when:
- .delete.image_registry
- .delete_nodes | default list | has .inventory_hostname