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从备集群向主集群同步数据。保证两个集群的数据一致。

  • 相关阅读:
    android animation
    android手机屏幕分辨率 及 sp dip(dp) px 区别 及高中低分辨率时处理
    android ExpandableListView
    android ImageView 之 android:scaleTye=" "
    android popupwindow
    如何使用 TransactSQL 编写作业脚本(企业管理器)
    线程访问临界区的问题 实例,需解决
    企业信息化
    使用Installshield制作asp,asp.net应用的安装程序
    Linux 系统目录结构
  • 原文地址:https://www.cnblogs.com/yuhaohao/p/12893061.html
Copyright © 2011-2022 走看看