mirror of
https://github.com/kubesphere/kubekey.git
synced 2025-12-26 01:22:51 +00:00
update etcd backup parameter exposure
Signed-off-by: “Forest-L <lilin@yunify.com>
This commit is contained in:
parent
6747fec162
commit
dfcafd11ba
|
|
@ -19,6 +19,8 @@ package v1alpha1
|
|||
import (
|
||||
"fmt"
|
||||
"github.com/kubesphere/kubekey/pkg/util"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
|
|
@ -50,6 +52,10 @@ const (
|
|||
Master = "master"
|
||||
Worker = "worker"
|
||||
K8s = "k8s"
|
||||
DefaultEtcdBackupDir = "/var/backups/kube_etcd"
|
||||
DefaultEtcdBackupPeriod = "30"
|
||||
DefaultKeepBackNumber = "5"
|
||||
DefaultEtcdBackupScript = "/usr/local/bin/kube-scripts"
|
||||
)
|
||||
|
||||
func (cfg *ClusterSpec) SetDefaultClusterSpec() (*ClusterSpec, *HostGroups) {
|
||||
|
|
@ -167,6 +173,29 @@ func SetDefaultClusterCfg(cfg *ClusterSpec) Kubernetes {
|
|||
if cfg.Kubernetes.ClusterName == "" {
|
||||
cfg.Kubernetes.ClusterName = DefaultClusterName
|
||||
}
|
||||
if cfg.Kubernetes.EtcdBackupDir == "" {
|
||||
cfg.Kubernetes.EtcdBackupDir = DefaultEtcdBackupDir
|
||||
}
|
||||
if cfg.Kubernetes.EtcdBackupPeriod == "" {
|
||||
cfg.Kubernetes.EtcdBackupPeriod = DefaultEtcdBackupPeriod
|
||||
} else {
|
||||
period, _ := strconv.Atoi(cfg.Kubernetes.EtcdBackupPeriod)
|
||||
if period > 60 && period < 1440 {
|
||||
cfg.Kubernetes.EtcdBackupPeriod = strconv.Itoa(period % 60)
|
||||
cfg.Kubernetes.EtcdBackupHour = strconv.Itoa(period / 60)
|
||||
}
|
||||
if period > 1440 {
|
||||
fmt.Println("Etcd backup cannot last more than one day, Please change it to within one day.")
|
||||
os.Exit(0)
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.Kubernetes.KeepBackupNumber == "" {
|
||||
cfg.Kubernetes.KeepBackupNumber = DefaultKeepBackNumber
|
||||
}
|
||||
if cfg.Kubernetes.EtcdBackupScript == "" {
|
||||
cfg.Kubernetes.EtcdBackupScript = DefaultEtcdBackupScript
|
||||
}
|
||||
|
||||
defaultClusterCfg := cfg.Kubernetes
|
||||
|
||||
|
|
|
|||
|
|
@ -25,4 +25,9 @@ type Kubernetes struct {
|
|||
NodeCidrMaskSize string `yaml:"nodeCidrMaskSize" json:"nodeCidrMaskSize,omitempty"`
|
||||
ApiserverCertExtraSans []string `yaml:"apiserverCertExtraSans" json:"apiserverCertExtraSans,omitempty"`
|
||||
ProxyMode string `yaml:"proxyMode" json:"proxyMode,omitempty"`
|
||||
EtcdBackupDir string `yaml:"etcdBackupDir" json:"etcdBackupDir,omitempty"`
|
||||
EtcdBackupPeriod string `yaml:"etcdBackupPeriod" json:"etcdBackupPeriod,omitempty"`
|
||||
EtcdBackupHour string `yaml:"etcdBackupHour" json:"etcdBackupHour,omitempty"`
|
||||
KeepBackupNumber string `yaml:"keepBackupNumber" json:"keepBackupNumber,omitempty"`
|
||||
EtcdBackupScript string `yaml:"etcdBackupScript" json:"etcdBackupScript,omitempty"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -267,21 +267,21 @@ func BackupEtcd(mgr *manager.Manager) error {
|
|||
}
|
||||
|
||||
func backupEtcd(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) error {
|
||||
_, err := mgr.Runner.ExecuteCmd("sudo -E /bin/sh -c \"if [ -d /opt/etcd_back ]; then rm -rf /opt/etcd_back ;fi && mkdir -p /opt/etcd_back\"", 0, false)
|
||||
_, err := mgr.Runner.ExecuteCmd(fmt.Sprintf("sudo -E /bin/sh -c \"mkdir -p %s\"", mgr.Cluster.Kubernetes.EtcdBackupScript), 0, false)
|
||||
if err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "Failed to mkdir /opt/etcd_back")
|
||||
return errors.Wrap(errors.WithStack(err), "Failed to create etcd backup")
|
||||
}
|
||||
tmpDir := "/tmp/kubekey"
|
||||
etcdBackupScript, _ := tmpl.EtcdBackupScript(mgr, node)
|
||||
etcdBackupScriptBase64 := base64.StdEncoding.EncodeToString([]byte(etcdBackupScript))
|
||||
_, err2 := mgr.Runner.ExecuteCmd(fmt.Sprintf("sudo -E /bin/sh -c \"echo %s | base64 -d > /opt/etcd_back/etcd-backup.sh && chmod +x /opt/etcd_back/etcd-backup.sh\"", etcdBackupScriptBase64), 1, false)
|
||||
_, err2 := mgr.Runner.ExecuteCmd(fmt.Sprintf("sudo -E /bin/sh -c \"echo %s | base64 -d > %s/etcd-backup.sh && chmod +x %s/etcd-backup.sh\"", etcdBackupScriptBase64, tmpDir, tmpDir), 1, false)
|
||||
if err2 != nil {
|
||||
return errors.Wrap(errors.WithStack(err2), "Failed to generate etcd backup")
|
||||
}
|
||||
_, err3 := mgr.Runner.ExecuteCmd("sudo -E /bin/sh -c \"crontab -l | grep -v '#' > /tmp/file;echo '0 2 * * * sh /opt/etcd_back/etcd-backup.sh' >> /tmp/file && awk ' !x[$0]++{print > \"/tmp/file\"}' /tmp/file;crontab /tmp/file\"", 2, false)
|
||||
_, err3 := mgr.Runner.ExecuteCmd(fmt.Sprintf("sudo cp %s/etcd-backup.sh %s &&sudo %s/etcd-backup.sh", tmpDir, mgr.Cluster.Kubernetes.EtcdBackupScript, mgr.Cluster.Kubernetes.EtcdBackupScript), 1, false)
|
||||
if err3 != nil {
|
||||
return errors.Wrap(errors.WithStack(err3), "Failed to crontab backup etcd data")
|
||||
return errors.Wrap(errors.WithStack(err3), "Failed to run the etcd-backup.sh")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,16 +16,18 @@ var EtcdBackupScriptTmpl = template.Must(template.New("etcdBackupScript").Parse(
|
|||
ETCDCTL_PATH='/usr/local/bin/etcdctl'
|
||||
ENDPOINTS='{{ .Etcdendpoint }}'
|
||||
ETCD_DATA_DIR="/var/lib/etcd"
|
||||
BACKUP_DIR="/var/backups/kube_etcd/etcd-$(date +%Y-%m-%d_%H:%M:%S)"
|
||||
BACKUP_DIR="{{ .Backupdir }}/etcd-$(date +%Y-%m-%d_%H:%M:%S)"
|
||||
KEEPBACKUPNUMBER='{{ .KeepbackupNumber }}'
|
||||
ETCDBACKUPPERIOD='{{ .EtcdBackupPeriod }}'
|
||||
ETCDBACKUPSCIPT='{{ .EtcdBackupScript }}'
|
||||
ETCDBACKUPHOUR='{{ .EtcdBackupHour }}'
|
||||
|
||||
ETCDCTL_CERT="/etc/ssl/etcd/ssl/admin-{{ .Hostname }}.pem"
|
||||
ETCDCTL_KEY="/etc/ssl/etcd/ssl/admin-{{ .Hostname }}-key.pem"
|
||||
ETCDCTL_CA_FILE="/etc/ssl/etcd/ssl/ca.pem"
|
||||
|
||||
|
||||
[ ! -d $BACKUP_DIR ] && mkdir -p $BACKUP_DIR
|
||||
|
||||
|
||||
export ETCDCTL_API=2;$ETCDCTL_PATH backup --data-dir $ETCD_DATA_DIR --backup-dir $BACKUP_DIR
|
||||
|
||||
sleep 3
|
||||
|
|
@ -39,7 +41,23 @@ export ETCDCTL_API=3;$ETCDCTL_PATH --endpoints="$ENDPOINTS" snapshot save $BACKU
|
|||
|
||||
sleep 3
|
||||
|
||||
cd $BACKUP_DIR/../;ls -lt |awk '{if(NR>14){print "rm -rf "$9}}'|sh
|
||||
cd $BACKUP_DIR/../;ls -lt |awk '{if(NR > '$KEEPBACKUPNUMBER'){print "rm -rf "$9}}'|sh
|
||||
|
||||
if [[ ! $ETCDBACKUPHOUR ]]; then
|
||||
time="*/$ETCDBACKUPPERIOD * * * *"
|
||||
else
|
||||
if [[ 0 == $ETCDBACKUPPERIOD ]];then
|
||||
time="* */$ETCDBACKUPHOUR * * *"
|
||||
else
|
||||
time="*/$ETCDBACKUPPERIOD */$ETCDBACKUPHOUR * * *"
|
||||
fi
|
||||
fi
|
||||
|
||||
crontab -l | grep -v '#' > /tmp/file
|
||||
echo "$time sh $ETCDBACKUPSCIPT/etcd-backup.sh" >> /tmp/file && awk ' !x[$0]++{print > "/tmp/file"}' /tmp/file
|
||||
crontab /tmp/file
|
||||
rm -rf /tmp/file
|
||||
|
||||
`)))
|
||||
|
||||
func EtcdBackupScript(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) (string, error) {
|
||||
|
|
@ -48,7 +66,12 @@ func EtcdBackupScript(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) (s
|
|||
ips = append(ips, fmt.Sprintf("https://%s:2379", host.InternalAddress))
|
||||
}
|
||||
return util.Render(EtcdBackupScriptTmpl, util.Data{
|
||||
"Hostname": node.Name,
|
||||
"Etcdendpoint": strings.Join(ips, ","),
|
||||
"Hostname": node.Name,
|
||||
"Etcdendpoint": strings.Join(ips, ","),
|
||||
"Backupdir": mgr.Cluster.Kubernetes.EtcdBackupDir,
|
||||
"KeepbackupNumber": mgr.Cluster.Kubernetes.KeepBackupNumber,
|
||||
"EtcdBackupPeriod": mgr.Cluster.Kubernetes.EtcdBackupPeriod,
|
||||
"EtcdBackupScript": mgr.Cluster.Kubernetes.EtcdBackupScript,
|
||||
"EtcdBackupHour": mgr.Cluster.Kubernetes.EtcdBackupHour,
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -115,6 +115,7 @@ ulimit -n 65535
|
|||
crontab -l | grep -v '#' > /tmp/file1
|
||||
echo "0 3 * * * ps -A -ostat,ppid | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -HUP > /dev/null 2>&1" >> /tmp/file1 && awk ' !x[$0]++{print > "/tmp/file1"}' /tmp/file1
|
||||
crontab /tmp/file1
|
||||
rm -rf /tmp/file1
|
||||
`)))
|
||||
|
||||
func InitOsScript(mgr *manager.Manager) (string, error) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue