Etcd 3.4.13集群安裝


etcd 是基於 Raft 的分布式 key-value 存儲系統,由 CoreOS 開發,常用於服務發現、共享配置以及並發控制(如 leader 選舉、分布式鎖等)。kubernetes 使用 etcd 存儲所有運行數據。

本文檔介紹部署一個三節點高可用 etcd 集群的步驟:

  • 下載和分發 etcd 二進制文件;
  • 創建 etcd 集群各節點的 x509 證書,用於加密客戶端(如 etcdctl) 與 etcd 集群、etcd 集群之間的數據流;
  • 創建 etcd 的 systemd unit 文件,配置服務參數;
  • 檢查集群工作狀態;

etcd 集群各節點的名稱和 IP 如下:

  • 192.168.110.100 k8s-master
  • 192,168.110.101 k8s-node01
  • 192.168.110.102 k8s-node02

關閉防火牆以及SELinux

systemctl stop iptables
systemctl stop firewalld
systemctl disable iptables
systemctl disable firewalld
vi /etc/selinux/config
SELINUX=disable

設置hosts

vim /etc/hosts
192.168.110.100 k8s-master
192,168.110.101 k8s-node01
192.168.110.102 k8s-node02

創建用戶

useradd etcd -d /data/home -c "Etcd user" -r -s /sbin/nologin

下載和分發 etcd 二進制文件

在每個節點下載etcd二進制文件

wget https://github.com/coreos/etcd/releases/download/v3.3.7/etcd-v3.3.7-linux-amd64.tar.gz
tar -xvf etcd-v3.3.7-linux-amd64.tar.gz

cfssl安裝

  wget https: // pkg.cfssl.org/R1.2/cfssl_linux-amd64
 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
  mv cfssl_linux-amd64 /usr/local/bin/cfssl
  mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

創建 CA 證書配置,生成 CA 證書和私鑰

mkdir /opt/ssl
cd /opt/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json

然后分別修改這兩個文件為如下內容

config.json

cat > config.json <<EOF
{
"signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } } }
EOF

ca-config.json:

可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數;后續在簽名證書時使用某個 profile;

signing:

表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;

server auth:

表示 Client 可以用該 CA 對 Server 提供的證書進行驗證;

client auth:

表示 Server 可以用該 CA 對 Client 提供的證書進行驗證;

csr.json

cat > csr.json <<EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
} EOF

CN:

Common Name,kube-apiserver 從證書中提取該字段作為請求的用戶名(User Name);瀏覽器使用該字段驗證網站是否合法;

O:

Organization,kube-apiserver 從證書中提取該字段作為請求用戶所屬的組(Group);

生成 CA 證書和私鑰

cd /opt/ssl
cfssl gencert -initca csr.json | cfssljson -bare ca

CA 有關證書列表如下:

    [root@k8s-master ssl]# tree
    .
    ├── ca.csr
    ├── ca-key.pem
    ├── ca.pem
    ├── config.json
    └── csr.json

創建 etcd 證書配置,生成 etcd 證書和私鑰

在 /opt/ssl 下添加文件 etcd-csr.json,內容如下

{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "192.168.110.100",
    "192.168.110.101",
    "192.168.110.102"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "etcd",
      "OU": "Etcd Security"
    }
  ]
}

生成 etcd 證書和密鑰

cd /opt/ssl
cfssl gencert -ca=/opt/ssl/ca.pem \
-ca-key=/opt/ssl/ca-key.pem \
-config=/opt/ssl/config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd

etcd 有關證書證書列表如下

ls etcd*
etcd.csr  etcd-csr.json  etcd-key.pem  etcd.pem

將證書分別傳到各個節點並設置權限

chmod 644 /opt/ssl/*

在三台上都安裝 etcd

tar -xvf etcd-v3.3.4-linux-amd64.tar.gz
cd etcd-v3.3.4-linux-amd64
cp mv etcd* /opt/platform/etcd/

分別添加 etcd 配置

vim /opt/platform/etcd/etcd.conf
# [member]
ETCD_NAME="etcd1" #不同機器需要做修改 與下面集群配置相對應
ETCD_DATA_DIR="/data/etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.110.100:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.110.100:2379,http://127.0.0.1:2379"
     
# [cluster]
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.110.100:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.110.100:2380"
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.110.100:2380,etcd2=https://192.168.110.101:2380,etcd3=https://192.168.110.102:2380"
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_ENABLE_V2="true"

配置說明

ETCD_NAME:

etcd 集群中的節點名,這里可以隨意,可區分且不重復就行。

ETCD_LISTEN_PEER_URLS:

監聽的用於節點之間通信的 URL,可監聽多個,集群內部將通過這些 URL 進行數據交互(如選舉、數據同步等)。

ETCD_LISTEN_CLIENT_URLS:

監聽的用於客戶端通信的 URL,同樣可以監聽多個。

ETCD_ADVERTISE_CLIENT_URLS:

建議使用的客戶端通信 URL,該值用於 etcd 代理或 etcd 成員與 etcd 節點通信。

ETCD_INITIAL_ADVERTISE_PEER_URLS:

建議用於節點之間通信的 URL,節點間將以該值進行通信。

ETCD_INITIAL_CLUSTER:

也就是集群中所有的 initial--advertise-peer-urls 的合集。

ETCD_INITIAL_CLUSTER_STATE:

新建集群的標志。

ETCD_INITIAL_CLUSTER_TOKEN:

節點的 token 值,設置該值后集群將生成唯一 ID,並為每個節點也生成唯一 ID,當使用相同配置文件再啟動一個集群時,只要該 token 值不一樣,etcd 集群就不會相互影響。

flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API,為了兼容flannel,將默認開啟v2版本,故配置文件中設置 ETCD_ENABLE_V2="true"

添加系統服務

vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/opt/platform/etcd/etcd.conf
ExecStart=/usr/bin/etcd \
--cert-file=/opt/ssl/etcd.pem \
--key-file=/opt/ssl/etcd-key.pem \
--peer-cert-file=/opt/ssl/etcd.pem \
--peer-key-file=/opt/ssl/etcd-key.pem \
--trusted-ca-file=/opt/ssl/ca.pem \
--peer-trusted-ca-file=/opt/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

創建 data 目錄,然后啟動 etcd 服務

mkdir -p /opt/platform/etcd/data && chown etcd:etcd -R /opt/platform/etcd && chmod 755 /opt/platform/etcd/data
systemctl enable etcd.service && systemctl start etcd.service

etcd 3.4注意事項

ETCD3.4版本ETCDCTL_API=3 etcdctl 和 etcd --enable-v2=false 成為了默認配置,如要使用v2版本,執行etcdctl時候需要設置ETCDCTL_API環境變量,例如:ETCDCTL_API=2 etcdctl
ETCD3.4版本會自動讀取環境變量的參數,所以EnvironmentFile文件中有的參數,不需要再次在ExecStart啟動參數中添加,二選一,如同時配置,會觸發以下類似報錯“etcd: conflicting environment variable "ETCD_NAME" is shadowed by corresponding command-line flag (either unset environment variable or disable flag)”
flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API

驗證 etcd 集群狀態

[root@localhost data]# etcdctl --endpoints=https://192.168.110.100:2379 --cacert="/opt/ssl/ca.pem" --cert="/opt/ssl/etcd.pem" --key="/opt/ssl/etcd-key.pem" endpoint health
https://192.168.110.100:2379 is healthy: successfully committed proposal: took = 16.533873ms
[root@localhost data]# etcdctl --endpoints=https://192.168.110.101:2379 --cacert="/opt/ssl/ca.pem" --cert="/opt/ssl/etcd.pem" --key="/opt/ssl/etcd-key.pem" endpoint health
https://192.168.110.101:2379 is healthy: successfully committed proposal: took = 24.19221ms
[root@localhost data]# etcdctl --endpoints=https://192.168.110.102:2379 --cacert="/opt/ssl/ca.pem" --cert="/opt/ssl/etcd.pem" --key="/opt/ssl/etcd-key.pem" endpoint health
https://192.168.110.102:2379 is healthy: successfully committed proposal: took = 20.12311ms

查看 etcd 集群成員

etcdctl --endpoints=https://192.168.110.100:2379 --cacert="/opt/ssl/ca.pem" --cert="/opt/ssl/etcd.pem" --key="/opt/ssl/etcd-key.pem" member list
3e49d4614347212d, started, etcd1, https://192.168.110.100:2380, https://192.168.110.100:2379, false
8d2730b8d7d6bbb3, started, etcd3, https://192.168.110.102:2380, https://192.168.110.102:2379, false
f7edfa2ae51ff5e8, started, etcd2, https://192.168.110.101:2380, https://192.168.110.101:2379, false


免責聲明!

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



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