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從備集群向主集群同步數據。保證兩個集群的數據一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM