zoukankan      html  css  js  c++  java
  • Etcd异地容灾方案

    一.方案选型

    ETCD官网提供了一种实时镜像同步数据的工具mirror-maker,如果出现主机房服务挂掉可以通过切换域名的形式切换到灾备机房,这个过程数据是可以保持一致的。
    注意:make-mirror 的使用需要依赖于API版本3, 使用API2的无法通过该工具做数据同步。

    1.1 原理图

    1.2 命令行语法

    ETCDCTL_API=3 etcdctl make-mirror [options] <destination> [flags]
    

    其中[options]主要是配置源集群和目的集群证书信息,以及源集群的客户端地址等。``是目的集群的客户端地址。该命令是单向的,目的集群的变化不会影响源集群。

    二.部署实现

    这里需要部署好两套etcd集群,这里采用TLS证书对通信进行加密,并开启即与CA根证书签名签名的双向认证。

    2.1 部署etcd集群

    这里由于设备限制,我们采用单节点部署etcd集群。

    2.1.1 安装操作系统及相关配置

    这里我们安装centos7.6的操作系统,并进行相关配置

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    # 关闭selinux
    setenforce 0
    # 配置selinux的配置文件
    [root@k8s001 ansible]# cat /etc/selinux/config 
    SELINUX=disabled
    SELINUXTYPE=targeted
    # 配置无秘钥访问
    ssh-keygen 
    ssh-copy-id root@192.168.1.1
    

    2.2.2 安装etcd二进制文件和证书生成工具

    这里我们安装etcd 3.3.10版本和cfssl 1.2.0版本,下载完毕后将二进制文件复制到/usr/bin目录下,并给与755权限。

    cp etcd etcdctl cfssl cfssljson /usr/bin
    chmod -R 755 /usr/bin/{etcd,etcdctl,cfssl,cfssljson}
    

    2.2.3 创建CA证书和私钥

    • 创建CA证书存放目录
    mkdir -p /etc/kubernetes/ssl
    
    • 创建CA配置文件
    [root@k8s001 ~]# mkdir /etc/cert
    [root@k8s001 ~]# cat /etc/cert/ca-config.json
    {
     "signing": {
       "default": {
         "expiry": "438000h"
       },
       "profiles": {
         "kubernetes": {
           "usages": [
               "signing",
               "key encipherment",
               "server auth",
               "client auth"
           ],
           "expiry": "438000h"
         }
       }
     }
    }
    
    • 创建CA签名请求文件
    [root@k8s001 templates]# cat /etc/cert/ca-csr.json 
    {
     "CN": "kubernetes",
     "key": {
       "algo": "rsa",
       "size": 2048
     },
     "names": [
       {
         "C": "CN",
         "ST": "HangZhou",
         "L": "XS",
         "O": "k8s",
         "OU": "System"
       }
     ],
     "ca": {
       "expiry": "876000h"
     }
    }
    
    • 生成CA证书和私钥
    [root@k8s001 ~]#cd /etc/cert
    [root@k8s001 cert]#/usr/bin/cfssl gencert -initca ca-csr.json | /usr/bin/cfssljson -bare ca
    # 这里会生成ca.pem和ca-key.pem文件
    
    • 复制CA证书和私钥到/etc/kubernetes/ssl目录
    [root@k8s001 cert]# cp ca.pem ca-key.pem /etc/kubernetes/ssl/
    

    2.2.4 创建etcd证书和私钥

    • 创建etcd证书私钥存放目录和etcd数据存放目录
    [root@k8s001 ~]# mkdir -p /etc/etcd/ssl
    [root@k8s001 ~]# mkdir -p /var/lib/etcd
    
    • 创建etcd证书请求文件
    [root@k8s001 ~]# cd /etc/cert
    [root@k8s001 cert]# cat etcd-csr.json
    {
     "CN": "etcd",
     "hosts": [
       # 这里记录etcd集群左右主机的IP
       "192.168.1.1",
       "127.0.0.1"
     ],
     "key": {
       "algo": "rsa",
       "size": 2048
     },
     "names": [
       {
         "C": "CN",
         "ST": "HangZhou",
         "L": "XS",
         "O": "k8s",
         "OU": "System"
       }
     ]
    }
    
    • 生成etcd证书和私钥
    [root@k8s001 cert]# /usr/bin/cfssl gencert  -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/etc/cert/ca-config.json -profile=kubernetes etcd-csr.json |/usr/bin/cfssljson -bare etcd 
    # 这里会生成etcd.pem和etcd-key.pem
    
    • 复制etcd证书和私钥到etcd证书目录
    [root@k8s001 cert]# cp etcd.pem etcd-key.pem /etc/etcd/ssl/
    

    2.2.5 创建etcd的unit文件

    [root@k8s001 tasks]# cat /etc/systemd/system/etcd.service 
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    Documentation=https://github.com/coreos
    
    [Service]
    Type=notify
    WorkingDirectory=/var/lib/etcd/
    ExecStart=/usr/bin/etcd 
     --name=k8s001.wf 
     --cert-file=/etc/etcd/ssl/etcd.pem 
     --key-file=/etc/etcd/ssl/etcd-key.pem 
     --peer-cert-file=/etc/etcd/ssl/etcd.pem 
     --peer-key-file=/etc/etcd/ssl/etcd-key.pem 
     --trusted-ca-file=/etc/kubernetes/ssl/ca.pem 
     --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem 
     --peer-client-cert-auth=true 
     --client-cert-auth=true 
     --initial-advertise-peer-urls=https://192.168.1.1:2380 
     --listen-peer-urls=https://192.168.1.1:2380 
     --listen-client-urls=https://192.168.1.1:2379,http://127.0.0.1:2379 
     --advertise-client-urls=https://192.168.1.1:2379 
     --initial-cluster-token=etcd-cluster-0 
     --initial-cluster=k8s001.wf=https://192.168.1.1:2380 
     --initial-cluster-state=new 
     --data-dir=/var/lib/etcd
    Restart=always
    RestartSec=5
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    
    • 开机启动etcd
    [root@k8s001 ~]#systemctl enable etcd
    
    • 启动etcd
    [root@k8s001 ~]#systemctl daemon-reload && systemctl restart etcd
    

    2.2 参考2.1部署好另外一套etcd集群

    这里部署好两套etcd集群分别为192.168.1.1,192.168.1.2

    • 分别在这两套集群创建对应的证书存放目录
    [root@k8s001 ~]# mkdir -p /etc/kubernetes/etcd
    [root@k8s002 ~]# mkdir -p /etc/kubernetes/etcd
    
    • 复制集群的CA证书和etcd证书私钥到对方集群的/etc/kubernetes/etcd目录下
    [root@k8s001 ~]# scp -p /etc/kubernetes/ssl/ca.pem /etc/etcd/ssl/{etcd.pem,etcd-key.pem} root@192.168.1.2:/etc/kubernetes/etcd
    [root@k8s002 ~]# scp -p /etc/kubernetes/ssl/ca.pem /etc/etcd/ssl/{etcd.pem,etcd-key.pem} root@192.168.1.1:/etc/kubernetes/etcd
    

    三.测试验证

    这里我们选择192.168.1.1集群作为主集群,向集群写入数据:

    [root@k8s001 ~]#ETCDCTL_API=3 etcdctl put 1 2 --endpoints=https://192.168.1.1:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem
    # 查看数据是否写入成功
    [root@k8s001 ~]#etcdctl get 1 --endpoints=https://192.168.1.1:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem 
    1
    2
    
    • 执行make-mirror同步数据
    [root@k8s001 ~]#ETCDCTL_API=3 etcdctl make-mirror --no-dest-prefix=true https://192.168.1.2:2379 --endpoints=https://192.168.1.1:2
    379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --dest-cacert=/etc/kubernetes/backup/ca.pem --dest-cert=/etc/kubernetes/backup/etcd.pem --dest-key=/etc/kubernetes/backup/etcd-key.pem
    
    • 查看备集群数据是否同步成功
    #可以看出etcd主集群数据已经同步到备集群中
    [root@k8s002 ~]# ETCDCTL_API=3 etcdctl get 1 --endpoints=https://192.168.1.2:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem 
    1
    2
    

    说明:etcdctl make-mirror 代码里面数据同步打印的周期是30s一次。主集群挂掉后,可以通过切换域名的形式到备集群中,主集群恢复后,可以执行make-mirror从备集群向主集群同步数据。保证两个集群的数据一致。
    说明:etcdctl make-mirror 代码里面数据同步打印的周期是30s一次。主集群挂掉后,可以通过切换域名的形式到备集群中,主集群恢复后,可以执行make-mirror从备集群向主集群同步数据。保证两个集群的数据一致。

  • 相关阅读:
    VScode 修改中文字体
    missing KW_END at ')' near '<EOF>'
    SQL inner join, join, left join, right join, full outer join
    SQL字符替换函数translater, replace
    SQL COOKBOOK SQL经典实例代码 笔记第一章代码
    sqlcook sql经典实例 emp dept 创建语句
    dateutil 2.5.0 is the minimum required version python
    安装postgresql后找不到服务 postgresql service
    Postgres psql: 致命错误: 角色 "postgres" 不存在
    【西北师大-2108Java】第十六次作业成绩汇总
  • 原文地址:https://www.cnblogs.com/yuhaohao/p/12893061.html
Copyright © 2011-2022 走看看