1. 程式人生 > 其它 >二進位制部署k8s叢集之部署Etcd叢集

二進位制部署k8s叢集之部署Etcd叢集

一、Etcd簡介

Etcd 是一個分散式鍵值儲存系統,Kubernetes使用Etcd進行資料儲存,所以先準備一個Etcd資料庫,為解決Etcd單點故障,應採用叢集方式部署,這裡使用3臺組建叢集,可容忍1臺機器故障,當然,你也可以使用5臺組建叢集,可容忍2臺機器故障。

Etcd是go語言編寫。

1.1 環境介紹

節點名稱 IP 角色
k8s-master01 10.154.0.111 etcd-1
k8s-node01 10.154.0.112 etcd-2
k8s-node02 10.154.0.113 etcd-3

注:為了節省機器,這裡與K8s節點機器複用。也可以獨立於k8s叢集之外部署,只要apiserver能連線到就行。

1.2 為什麼要用到證書?

因為etcd叢集使用https通訊,k8s叢集也是使用https通訊的,所以他們都要用到證書。

二、部署Etcd叢集

2.1 使用cfssl工具

cfssl是一個開源的證書管理工具,使用json檔案生成證書,相比openssl更方便使用。

官方下載地址:https://github.com/cloudflare/cfssl/releases

目前最新版本為1.6.1

找任意一臺伺服器操作,這裡用etch-1節點。

#建立資料夾,上傳cfssl工具
mkdir -p ~/tools/cfssl
cd $_

chmod +x *
mv cfssl_1.6.1_linux_amd64 /usr/local/bin/cfssl
mv cfssljson_1.6.1_linux_amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_1.6.1_linux_amd64 /usr/bin/cfssl-certinfo

#如果你上傳的是壓縮包,使用該命令解壓
tar zxvf cfssl.tar.gz

#檢視cfssl版本
cfssl version

cfssl,cfssl-certinfo,cfssljson就是生成證書所需要的三個工具

2.2 生成Etcd證書

cfssl證書生成有四步

  1. 編寫CA配置檔案,包含頒發機構配置資訊,如證書有效期等
  2. 編寫簽名請求檔案,包含申請機構,國家,城市,加密演算法等資訊
  3. 根據簽名請求檔案,生成根證書
  4. 使用根證書,CA配置檔案,簽名請求檔案簽發客戶端證書

1.自簽證書頒發機構(CA)

建立工作目錄:

mkdir -p ~/TLS/{etcd,k8s}
cd ~/TLS/etcd

建立頒發機構配置資訊:

cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
  • expiry:為有效期,預設87600小時,即一年有效期

CA 配置檔案用於配置根證書的使用場景 (profile) 和具體引數 (usage,過期時間、服務端認證、客戶端認證、加密等),後續在簽名其它證書時需要指定特定場景。

建立簽名請求檔案

cat > ca-csr.json << EOF
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "O": "tx",
            "ST": "Beijing"
        }
    ]
}
EOF
  • algo:加密演算法
  • C:國家
  • L:城市
  • O:組織

生成根證書

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

:'
生成檔案介紹
ca.pem :ca的證書
ca.csr :ca的簽名請求
ca-key.pem : ca的私鑰
'

2. 使用自籤CA證書籤發Etcd證書

建立簽名請求檔案

cat > etcd-csr.json << EOF
{
    "CN": "etcd",
    "hosts": [
    "10.154.0.111",
    "10.154.0.112",
    "10.154.0.113"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

檔案包含了所有的etcd叢集機器的ip地址,加密演算法,國家,城市等資訊

為了方便後期擴容可以多寫幾個預留的IP。

簽發客戶端證書

cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=www etcd-csr.json | cfssljson -bare etcd

2.3 下載Etcd

目前最新版本為3.5.1

官方下載地址:https://github.com/etcd-io/etcd/releases/download/v3.5.1/etcd-v3.5.1-linux-amd64.tar.gz

2.4 部署Etcd叢集

以下在etcd-1上操作,為簡化操作,待會將etcd-1生成的所有檔案拷貝到etcd-2和etcd-3

1. 建立工作目錄並解壓二進位制包

mkdir /opt/etcd/{bin,cfg,ssl} -p
tar zxvf etcd-v3.5.1-linux-amd64.tar.gz
mv etcd-v3.5.1-linux-amd64/{etcd,etcdctl} /opt/etcd/bin

2. 建立etcd配置檔案

注意先刪掉註釋再複製到配置檔案中

cat > /opt/etcd/cfg/etcd.conf << EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://10.154.0.111:2380" #叢集元件通訊用的埠
ETCD_LISTEN_CLIENT_URLS="https://10.154.0.111:2379"  #客戶端連線etcd的埠
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.154.0.111:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://10.154.0.111:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://10.154.0.111:2380,etcd-2=https://10.154.0.112:2380,etcd-3=https://10.154.0.113:2380" #叢集中的三個節點的IP
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #TOKEN可以自定義,相當於叢集互相連線需要簡單認證
ETCD_INITIAL_CLUSTER_STATE="new" #new代表加入的新叢集
EOF
  • ETCD_NAME:節點名稱,叢集中唯一

  • ETCD_DATA_DIR:資料目錄

  • ETCD_LISTEN_PEER_URLS:叢集通訊監聽地址

  • ETCD_LISTEN_CLIENT_URLS:客戶端訪問監聽地址

  • ETCD_INITIAL_ADVERTISE_PEER_URLS:叢集通告地址

  • ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址

  • ETCD_INITIAL_CLUSTER:叢集節點地址

  • ETCD_INITIAL_CLUSTER_TOKEN:叢集Token

  • ETCD_INITIAL_CLUSTER_STATE:加入叢集的當前狀態,new是新叢集,existing表示加入已有叢集

3. 配置systemd管理etcd

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

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

[Install]
WantedBy=multi-user.target
EOF

4. 拷貝剛才生成的證書

把剛才生成的證書拷貝到配置檔案中的路徑:

cp ~/TLS/etcd/ca*pem ~/TLS/etcd/etcd*pem /opt/etcd/ssl/

5. 將上面etcd-1所有生成的檔案拷貝到etcd-2和etcd-3

scp -r /opt/etcd/ [email protected]:/opt/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/

scp -r /opt/etcd/ [email protected]:/opt/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/

然後在etcd-2和etcd-3分別修改etcd.conf配置檔案中的節點名稱和當前伺服器IP

注意,配置檔案需要刪除註釋不然啟動服務會報錯

vi /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-1"   # 修改此處,節點2改為etcd-2,節點3改為etcd-3
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://10.154.0.111:2380"   # 修改此處為當前伺服器IP
ETCD_LISTEN_CLIENT_URLS="https://10.154.0.111:2379" # 修改此處為當前伺服器IP

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.154.0.111:2380" # 修改此處為當前伺服器IP
ETCD_ADVERTISE_CLIENT_URLS="https://10.154.0.111:2379" # 修改此處為當前伺服器IP
ETCD_INITIAL_CLUSTER="etcd-1=https://10.154.0.111:2380,etcd-2=https://10.154.0.113:2380,etcd-3=https://10.154.0.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

6. 啟動並設定開機啟動

#重新載入一下service的配置檔案
systemctl daemon-reload 
systemctl start etcd
systemctl enable etcd

注意:因為使用的是叢集,所以至少要保證兩臺節點同時啟動。

如果只啟動一臺etcd伺服器,那麼啟動介面會卡住,檢視日誌會發現該機器正在等待其他叢集啟動

7.如果報錯可以檢視日誌

journalctl -u etcd >error.log
vim error.log

不方便檢視可匯出到檔案再看

8. 檢視叢集狀態

在任意節點執行都可以

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/etcd.pem --key=/opt/etcd/ssl/etcd-key.pem --endpoints="https://10.154.0.111:2379,https://10.154.0.112:2379,https://10.154.0.113:2379" endpoint health

如果輸出上面資訊,就說明叢集部署成功。如果有問題第一步先看日誌:/var/log/messagejournalctl -u etcd

三、參考資料

51CTO課程

B站課程

今天的學習是為了以後的工作更加的輕鬆!