feat: add plugin: backup and restore etcd.

Signed-off-by: joyceliu <joyceliu@yunify.com>
This commit is contained in:
joyceliu 2024-05-30 17:45:01 +08:00
parent 0491f22e6f
commit 8f4b8438da
14 changed files with 105 additions and 4 deletions

View File

@ -39,7 +39,7 @@
mv /etc/apt/sources.list.kubekey.bak /etc/apt/sources.list
mv /etc/apt/sources.list.d.kubekey.bak /etc/apt/sources.list.d
else
apt install -y socat conntrack ipset ebtables chrony ipvsadm
apt-get update && apt install -y socat conntrack ipset ebtables chrony ipvsadm
fi
when: os.release.ID_LIKE == "debian"
- name: Init rhel repository

View File

@ -9,6 +9,7 @@ etcd:
compaction_retention: 8
snapshot_count: 10000
data_dir: /var/lib/etcd
token: k8s_etcd
# metrics: basic
# quota_backend_bytes: 100
# max_request_bytes: 100

View File

@ -3,7 +3,7 @@ ETCD_ADVERTISE_CLIENT_URLS={{ internal_ipv4|stringformat:"https://%s:2379" }}
ETCD_INITIAL_ADVERTISE_PEER_URLS={{ internal_ipv4|stringformat:"https://%s:2380" }}
ETCD_INITIAL_CLUSTER_STATE={{ etcd.state }}
ETCD_LISTEN_CLIENT_URLS={{ internal_ipv4|stringformat:"https://%s:2379" }},https://127.0.0.1:2379
ETCD_INITIAL_CLUSTER_TOKEN=k8s_etcd
ETCD_INITIAL_CLUSTER_TOKEN={{ etcd.env.token }}
ETCD_LISTEN_PEER_URLS={{ internal_ipv4|stringformat:"https://%s:2380" }}
ETCD_NAME={{ inventory_name }}
ETCD_PROXY=off

View File

@ -27,8 +27,6 @@ import (
_const "github.com/kubesphere/kubekey/v4/pkg/const"
)
var builtinProjectFS fs.FS
func newLocalProject(pipeline kubekeyv1.Pipeline) (Project, error) {
if !filepath.IsAbs(pipeline.Spec.Playbook) {
if pipeline.Spec.Project.Addr == "" {

View File

@ -0,0 +1,5 @@
---
- hosts:
- etcd|random
roles:
- etcd/backup

View File

@ -0,0 +1,15 @@
---
- hosts:
- kube_control_plane
roles:
- kubernetes/stop
- hosts:
- etcd
roles:
- etcd/restore
- hosts:
- kube_control_plane
roles:
- kubernetes/start

View File

@ -0,0 +1,4 @@
etcd:
env:
data_dir: /var/lib/etcd
token: k8s_etcd

View File

@ -0,0 +1,15 @@
---
- name: Generate backup from etcd
command: |
if [ ! -d /tmp/kubekey/etcd/ ]; then
mkdir -p /tmp/kubekey/etcd/
fi
export $(cat /etc/etcd.env | grep ETCDCTL_CACERT)
export $(cat /etc/etcd.env | grep ETCDCTL_CERT)
export $(cat /etc/etcd.env | grep ETCDCTL_KEY)
ETCDCTL_API=3 etcdctl --endpoints=https://{{ internal_ipv4 }}:2379 snapshot save /tmp/kubekey/etcd/snapshot.db
- name: Fetch backup to local
fetch:
src: /tmp/kubekey/etcd/snapshot.db
dest: "{{ work_dir }}/kubekey/etcd/snapshot.db"

View File

@ -0,0 +1,4 @@
etcd:
env:
data_dir: /var/lib/etcd
token: k8s_etcd

View File

@ -0,0 +1,27 @@
---
- name: Sync etcd snapshot to remote
copy:
src: "{{ work_dir }}/kubekey/etcd/snapshot.db"
dest: /tmp/kubekey/etcd/snapshot.db
- name: Stop etcd
command: systemctl stop etcd
- name: Remove etcd data dir
command: |
rm -rf /var/lib/etcd/*
- name: Restore etcd by snapshot
command: |
export $(cat /etc/etcd.env | grep ETCDCTL_CACERT)
export $(cat /etc/etcd.env | grep ETCDCTL_CERT)
export $(cat /etc/etcd.env | grep ETCDCTL_KEY)
etcdctl snapshot restore /tmp/kubekey/etcd/snapshot.db \
--name={{ inventory_name }} --endpoints=https://{{ internal_ipv4 }}:2379 \
--initial-cluster={% for h in groups['etcd'] %}{% set hv=inventory_hosts[h] %}{{ hv.inventory_name }}={{ hv.internal_ipv4|stringformat:"https://%s:2380" }}{% if (not forloop.Last) %},{% endif %}{% endfor %} \
--initial-advertise-peer-urls=https://{{ internal_ipv4 }}:2380\
--initial-cluster-token={{ etcd.env.token }} \
--data-dir={{ etcd.env.data_dir }}
- name: Start etcd
command: systemctl start etcd

View File

@ -0,0 +1,2 @@
cri:
container_manager: docker

View File

@ -0,0 +1,14 @@
---
- name: Start cri in kubernetes
block:
- name: Stop docker in kubernetes
command: |
systemctl start docker
when: cri.container_manager == 'docker'
- name: Start containerd in kubernetes
command: |
systemctl start containerd
when: cri.container_manager == 'containerd'
- name: Start kubelet in kubernetes
command: systemctl start kubelet

View File

@ -0,0 +1,2 @@
cri:
container_manager: docker

View File

@ -0,0 +1,14 @@
---
- name: Stop kubelet in kubernetes
command: systemctl stop kubelet
- name: Stop cri in kubernetes
block:
- name: Stop docker in kubernetes
command: |
systemctl stop docker
when: cri.container_manager == 'docker'
- name: Stop containerd in kubernetes
command: |
systemctl stop containerd
when: cri.container_manager == 'containerd'