mirror of
https://github.com/kubesphere/kubekey.git
synced 2025-12-25 17:12:50 +00:00
163 lines
6.4 KiB
YAML
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
|