• K8s利用etcd定时备份集群结合钉钉机器人通知


    在这里插入图片描述

    如何通过脚本的方式进行K8s集群的备份

    查看K8s中master节点中etcd集群的状态

    kubectl get pods -n kube-system | grep etcd
    

    image-20240913090214864

    由于使用的etcd服务是K8s搭建时自身携带的,并不是独立搭建的etcd集群信息。使用 K8s 搭建集群时,etcd 是 Kubernetes 集成的一个重要组件因此需要查看此K8s中etcd的配置信息如何。执行下面的命令。

    kubectl -n kube-system get pods # 首先执行这个命令查看一下master节点中etcd服务的name信息
    

    image-20240913090804336

    拿到信息之后需要将 kubectl -n kube-system describe pod 这个命令修改成上述pod的名称信息进行得到运行的日志,需要从中获取到想对应的密钥信息,此步不可缺少不然执行备份命令时候会出现备份文件停留在备份过程中状态。

    kubectl -n kube-system describe pod etcd-xiaolumaster1
    

    image-20240913091104803

    此处是上述命令执行结果中详细信息做一下展示,我在下面的信息中使用了提取这个密钥信息这个标注出了信息的位置在哪里。

    [root@master01 ~]# kubectl -n kube-system describe pod etcd-xiaolumaster1
    Name:                 etcd-xiaolumaster1
    Namespace:            kube-system
    Priority:             2000001000
    Priority Class Name:  system-node-critical
    Node:                 xiaolumaster1/192.168.65.10
    Start Time:           Thu, 12 Sep 2024 15:58:19 +0800
    Labels:               component=etcd
                          tier=control-plane
    Annotations:          kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.168.65.10:2379
                          kubernetes.io/config.hash: 891d5c4b32621c9c00025c4596a9fa98
                          kubernetes.io/config.mirror: 891d5c4b32621c9c00025c4596a9fa98
                          kubernetes.io/config.seen: 2024-09-12T15:54:42.469300940+08:00
                          kubernetes.io/config.source: file
    Status:               Running
    SeccompProfile:       RuntimeDefault
    IP:                   192.168.65.10
    IPs:
      IP:           192.168.65.10
    Controlled By:  Node/xiaolumaster1
    Containers:
      etcd:
        Container ID:  containerd://53f915abc40b5adc16e3c6e722c73054fb6538620bb3a14755951a5d093f1658
        Image:         registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.7-0
        Image ID:      registry.cn-hangzhou.aliyuncs.com/google_containers/etcd@sha256:e85dab14e03d2468bedd3f908898982ed0ef2622d3764cc7746eb51555fae06e
        Port:          <none>
        Host Port:     <none>
        Command:
          etcd
          --advertise-client-urls=https://192.168.65.10:2379
          --cert-file=/etc/kubernetes/pki/etcd/server.crt    ### 提取这个密钥信息
          --client-cert-auth=true
          --data-dir=/var/lib/etcd
          --experimental-initial-corrupt-check=true
          --experimental-watch-progress-notify-interval=5s
          --initial-advertise-peer-urls=https://192.168.65.10:2380
          --initial-cluster=xiaolumaster1=https://192.168.65.10:2380
          --key-file=/etc/kubernetes/pki/etcd/server.key    ### 提取这个密钥信息
          --listen-client-urls=https://127.0.0.1:2379,https://192.168.65.10:2379
          --listen-metrics-urls=http://127.0.0.1:2381
          --listen-peer-urls=https://192.168.65.10:2380
          --name=xiaolumaster1
          --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
          --peer-client-cert-auth=true
          --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
          --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
          --snapshot-count=10000
          --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt   ### 提取这个密钥信息 虽然上面有一个和这个一样的,但是不提取 --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt 这个的原因是 --trusted-ca-file:这个参数用于为 etcd 客户端连接提供 CA 证书,确保客户端能够验证服务器的身份。因此,这个 CA 证书是客户端与服务器通信时使用的。而--peer-trusted-ca-file:这个参数用于 etcd 集群内节点之间(peer-to-peer)的通信。它确保节点之间能够相互验证身份,使用的是集群内节点之间的 CA 证书。
    
    --peer-trusted-ca-file:这个参数用于 etcd 集群内节点之间(peer-to-peer)的通信。它确保节点之间能够相互验证身份,使用的是集群内节点之间的 CA 证书。
        State:          Running
          Started:      Thu, 12 Sep 2024 15:54:55 +0800
        Ready:          True
        Restart Count:  0
        Requests:
          cpu:        100m
          memory:     100Mi
        Liveness:     http-get http://127.0.0.1:2381/health%3Fexclude=NOSPACE&serializable=true delay=10s timeout=15s period=10s #success=1 #failure=8
        Startup:      http-get http://127.0.0.1:2381/health%3Fserializable=false delay=10s timeout=15s period=10s #success=1 #failure=24
        Environment:  <none>
        Mounts:
          /etc/kubernetes/pki/etcd from etcd-certs (rw)
          /var/lib/etcd from etcd-data (rw)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      etcd-certs:
        Type:          HostPath (bare host directory volume)
        Path:          /etc/kubernetes/pki/etcd
        HostPathType:  DirectoryOrCreate
      etcd-data:
        Type:          HostPath (bare host directory volume)
        Path:          /var/lib/etcd
        HostPathType:  DirectoryOrCreate
    QoS Class:         Burstable
    Node-Selectors:    <none>
    Tolerations:       :NoExecute op=Exists
    Events:
      Type    Reason   Age                From     Message
      ----    ------   ----               ----     -------
      Normal  Killing  63m                kubelet  Stopping container etcd
      Normal  Pulled   16m (x4 over 47h)  kubelet  Container image "registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.7-0" already present on machine
      Normal  Created  16m (x4 over 47h)  kubelet  Created container etcd
      Normal  Started  16m (x4 over 47h)  kubelet  Started container etcd
    

    编写备份的脚本shell文件

    文件名称 backup_etcd.sh

    #!/bin/bash
    #时间戳,用来区分不同备份
    timestamp=`date +%Y%m%d-%H%M%S`
    #备份到哪个文件夹
    back_dir="/opt/k8s"
    #etcd集群列表
    endpoints="https://192.168.65.10:2379"
    #etcd证书路径
    cert_file="/etc/kubernetes/pki/etcd/server.crt"
    #etcd证书的key路径
    key_file="/etc/kubernetes/pki/etcd/server.key"
    #ca证书路径
    cacert_file="/etc/kubernetes/pki/etcd/ca.crt"
    
    mkdir -p $back_dir
    ETCDCTL_API=3 etcdctl \
    --endpoints="${endpoints}" \
    --cert=$cert_file \
    --key=$key_file \
    --cacert=$cacert_file \
    snapshot save $back_dir/snapshot_$timestamp.db
    

    image-20240913092023027

    赋予文件执行权限并查看权限信息

    这边我使用的上述路径下的文件,所以后续跟上的是这个路径在命令中。

    chmod +x /opt/K8sJK/backup_etcd.sh
    

    查看一下权限是否已经赋予

    image-20240913092559723

    这里给上面的权限信息做一下详细的解释

    1. 文件类型与权限: -rwxr-xr-x
      • -:表示这是一个普通文件(不是目录)。
      • rwx:文件所有者(528287,后面解释)拥有执行权限。
      • r-x:文件所属的组(89939)拥有执行权限,但没有写权限。
      • r-x:其他用户(即系统中的其他任何人)拥有执行权限,但没有写权限。
    2. 硬链接数量: 1
      • 表示有 1 个硬链接指向这个文件。

    执行备份文件的命令进行备份的验证

    /opt/K8sJK/backup_etcd.sh
    

    image-20240913093018414

    在配置的备份文件位置查看备份的信息,时间也可以刚好对上就是刚才的备份文件。

    image-20240913093049167

    对接钉钉机器人进行报备

    创建一下自己的组织获取管理员身份

    钉钉机器人开发平台直达链接

    https://open.dingtalk.com/document/tutorial/create-a-robot
    

    image-20240913093942315

    具体的配置信息展示

    image-20240913094356442

    梳理开发对接钉钉的SDK功能jar包

    这里采用钉钉官方旧版本SDK基础之上进行二开,后续如果需要进行持续迭代升级会考虑尝试新版本SDK风格进行二开。这里需要说明的是这个只是一个钉钉官方的小demo,二开需要根据自己的需求信息适量的修改和原创。

    https://github.com/open-dingtalk/org-mini-program-tutorial-java
    

    image-20240913125038520

    钉钉官方的参考文章地址:

    https://open.dingtalk.com/document/tutorial/create-a-robot
    

    修改pom文件中旧版SDK最新地址

     
    	com.aliyun
    	alibaba-dingtalk-service-sdk
    	2.0.0
    
    

    定时任务与@回复消息的大体代码展示

    定时备份etcd
    /**
     * Copyright © 2024年 integration-projects-maven. All rights reserved.
     * ClassName EtcdBackupTask.java
     * author 舒一笑 yixiaoshu88@163.com
     * version 1.0.0
     * Description etcd定时备份逻辑实现
     * createTime 2024年09月11日 15:41:00
     */
    @Component
    @Slf4j
    public class EtcdBackupTask {
       
    
        @Value("${dingtalk.webhook}")
        private String dingTalkWebhook;
    
        @Value("${shell.script.path}")
        private String shellScriptPath;
    
        @Value("${backup.file.path}")
        private String backupFilePath;
    
        private final RobotsController robotsController;
    
        public EtcdBackupTask(RobotsController robotsController) {
       
            this.robotsController = robotsController;
        }
    
        @Scheduled(fixedRate = 60000) // 每1分钟执行一次备份
        public void backupEtcd() {
       
            log.info("Starting etcd backup process...");
    
            try {
       
                // 使用 ProcessBuilder 调用 shell 脚本
                ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", shellScriptPath);
                processBuilder.environment().remove("ETCDCTL_CERT");  // 移除可能存在的环境变量
                processBuilder.redirectErrorStream(true);
                Process process = processBuilder.start();
    
                // 捕获输出日志
                String backupLog = captureProcessOutput(process);
    
                // 等待进程完成,设置较长的超时时间,例如10分钟
                boolean finished = process.waitFor(10, TimeUnit.MINUTES);
    
                if (!finished) {
       
                    // 如果进程未在规定时间内完成,强制终止并发送警告消息
                    process.destroyForcibly();
                    sendDingTalkMessage("你好,Etcd 备份失败!备份进程超时。");
                    log.error("Etcd backup process timed out.");
                    return;
                }
    
                int exitCode = process.exitValue();
    
                if (exitCode == 0) {
       
    //                String backupFileName = getBackupFileName(backupLog);
    //                log.info("Etcd backup succeeded. Backup file: " + backupFileName);
    //                sendDingTalkMessage("你好,Etcd 备份成功!备份文件已保存,文件名:" + backupFileName);
                    String backupFileName = getBackupFileName(backupLog);
                    log.info("Etcd backup succeeded. Backup file: " + backupFileName);
    
                    // 获取备份文件状态
                    String snapshotStatus = getSnapshotStatus(backupFileName);
                    log.info("Etcd backup snapshot status: \n" + snapshotStatus);
    
                    // 将备份文件名和状态发送到钉钉
                    sendDingTalkMessage("你好,Etcd 备份成功!备份文件已保存,文件名:" + backupFileName + "\n" + snapshotStatus);
                    // 清理一周前的备份文件
                    cleanOldBackups(backupFilePath);
                } else {
       
                    log.error("Etcd backup failed with exit code: " + exitCode);
                    log.error("Etcd backup failed. Error log: \n" + backupLog);
                    sendDingTalkMessage("你好,Etcd 备份失败!错误信息:" +
  • 相关阅读:
    k8s-----7、Pod健康检查
    六月集训(第24天) —— 线段树
    开源的滚滚浪潮:近年来开源多样化的几大亮点
    HummerRisk 入门3:开发手册
    jxTMS设计思想之流程引擎与任务分发
    ref和reactive的区别?
    基于Html的某大学校园网展示静态网页设计 课程报告+源代码
    【Leetcode Sheet】Weekly Practice 5
    c高级 day1
    03-HTTP报文
  • 原文地址:https://blog.csdn.net/weixin_50503886/article/details/142255537