1. Lựa chọn Giải pháp
Bản chính thức của Etcd cung cấp một công cụ đồng bộ dữ liệu theo thời gian thực có tên là mirror-maker. Trong trường hợp cụm máy chủ chính gặp sự cố, có thể chuyển đổi sang phòng thảm họa bằng cách thay đổi tên miền, quá trình này đảm bảo dữ liệu được đồng nhất.
Lưu ý: Việc sử dụng make-mirror phụ thuộc vào phiên bản API 3. Các phiên bản API2 không thể sử dụng công cụ này để đồng bộ dữ liệu.
1.1 Nguyên lý hoạt động
1.2 Cú pháp dòng lệnh
ETCDCTL_API=3 etcdctl make-mirror [tùy_chọn] <đích> [cờ]
Trong đó [tùy_chọn] chủ yếu là cấu hình thông tin chứng chỉ cho cụm nguồn và cụm đích, cũng như địa chỉ client của cụm nguồn. <đích> là địa chỉ client của cụm đích. Lệnh này là một chiều, các thay đổi của cụm đích không ảnh hưởng đến cụm nguồn.
2. Triển khai
Ở đây cần triển khai hai cụm etcd, sử dụng chứng chỉ TLS để mã hóa giao tiếp và bật xác thực hai chiều với chữ ký CA gốc.
2.1 Triển khai cụm etcd
Do hạn chế về thiết bị, chúng ta sử dụng triển khai đơn node cho cụm etcd.
2.1.1 Cài đặt hệ điều hành và cấu hình liên quan
Chúng ta cài đặt hệ điều hành centos7.6 và thực hiện các cấu hình liên quan
# Tắt tường lửa
systemctl stop firewalld
systemctl disable firewalld
# Tắt selinux
setenforce 0
# Cấu hình tệp selinux
[root@k8s001 ansible]# cat /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
# Cấu hình truy cập không mật khẩu
ssh-keygen
ssh-copy-id root@192.168.1.1
2.1.2 Cài đặt tệp nhị phân etcd và công cụ tạo chứng chỉ
Chúng ta cài đặt etcd phiên bản 3.3.10 và cfssl phiên bản 1.2.0, sau khi tải xong sao chép tệp nhị phân vào thư mục /usr/bin và cấp quyền 755.
cp etcd etcdctl cfssl cfssljson /usr/bin
chmod -R 755 /usr/bin/{etcd,etcdctl,cfssl,cfssljson}
2.1.3 Tạo chứng chỉ CA và khóa riêng
- Tạo thư mục lưu trữ chứng chỉ CA
mkdir -p /etc/kubernetes/ssl
- Tạo tệp cấu hình 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"
}
}
}
}
- Tạo tệp yêu cầu ký CA
[root@k8s001 templates]# cat /etc/cert/ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HaNoi",
"L": "HN",
"O": "k8s",
"OU": "System"
}
],
"ca": {
"expiry": "876000h"
}
}
- Tạo chứng chỉ CA và khóa riêng
[root@k8s001 ~]#cd /etc/cert
[root@k8s001 cert]#/usr/bin/cfssl gencert -initca ca-csr.json | /usr/bin/cfssljson -bare ca
# Ở đây sẽ tạo ra các tệp ca.pem và ca-key.pem
- Sao chép chứng chỉ CA và khóa riêng vào thư mục /etc/kubernetes/ssl
[root@k8s001 cert]# cp ca.pem ca-key.pem /etc/kubernetes/ssl/
2.1.4 Tạo chứng chỉ etcd và khóa riêng
- Tạo thư mục lưu trữ chứng chỉ và khóa riêng etcd và thư mục lưu trữ dữ liệu etcd
[root@k8s001 ~]# mkdir -p /etc/etcd/ssl
[root@k8s001 ~]# mkdir -p /var/lib/etcd
- Tạo tệp yêu cầu chứng chỉ etcd
[root@k8s001 ~]# cd /etc/cert
[root@k8s001 cert]# cat etcd-csr.json
{
"CN": "etcd",
"hosts": [
# Ghi lại các IP của tất cả các node trong cụm etcd
"192.168.1.1",
"127.0.0.1"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HaNoi",
"L": "HN",
"O": "k8s",
"OU": "System"
}
]
}
- Tạo chứng chỉ và khóa riêng 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
# Ở đây sẽ tạo ra các tệp etcd.pem và etcd-key.pem
- Sao chép chứng chỉ và khóa riêng etcd vào thư mục chứng chỉ etcd
[root@k8s001 cert]# cp etcd.pem etcd-key.pem /etc/etcd/ssl/
2.1.5 Tạo tệp unit cho etcd
[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=node1 \
--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=node1=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
- Kích hoạt khởi động etcd
[root@k8s001 ~]#systemctl enable etcd
- Khởi động etcd
[root@k8s001 ~]#systemctl daemon-reload && systemctl restart etcd
2.2 Triển khai cụm etcd thứ hai
Thực hiện theo 2.1 để triển khai thêm một cụm etcd tại 192.168.1.2
- Tạo thư mục lưu trữ chứng chỉ tương ứng cho từng cụm
[root@k8s001 ~]# mkdir -p /etc/kubernetes/etcd
[root@k8s002 ~]# mkdir -p /etc/kubernetes/etcd
- Sao chép chứng chỉ CA và khóa riêng etcd của cụm này sang thư mục /etc/kubernetes/etcd của cụm kia
[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
3. Kiểm tra và Xác thực
Chúng ta chọn cụm 192.168.1.1 làm cụm chính, ghi dữ liệu vào cụm:
[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
# Kiểm tra xem dữ liệu đã được ghi thành công chưa
[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
- Thực hiện make-mirror để đồng bộ dữ liệu
[root@k8s001 ~]#ETCDCTL_API=3 etcdctl make-mirror --no-dest-prefix=true https://192.168.1.2:2379 --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 --dest-cacert=/etc/kubernetes/backup/ca.pem --dest-cert=/etc/kubernetes/backup/etcd.pem --dest-key=/etc/kubernetes/backup/etcd-key.pem
- Kiểm tra xem dữ liệu đã được đồng bộ sang cụm dự phòng chưa
# Có thể thấy dữ liệu của cụm etcd chính đã được đồng bộ sang cụm dự phòng
[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
Lưu ý: Chu kỳ in ra đồng bộ dữ liệu trong mã nguồn etcdctl make-mirror là 30s một lần. Khi cụm chính gặp sự cố, có thể chuyển đổi sang cụm dự phòng bằng cách thay đổi tên miền. Khi cụm chính phục hồi, có thể thực hiện make-mirror từ cụm dự phòng sang cụm chính để đồng bộ dữ liệu, đảm bảo dữ liệu của hai cụm được đồng nhất.