那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

前言:本篇謹獻給 那些年我們踩過的K8S坑

最新在整理K8S 這塊的基礎知識,有幸寫了點教程發出來,和大夥一起學習交流

一共分為幾個片段,小編會定期更新發出

K8S 二進位制部署

ansible 批次部署K8S ,新增工作節點

K8S pod , service, 儲存

K8S 安全框架,證書

K8S 彈性伸縮

K8S 叢集網路

基於jenkins 釋出k8s 微服務專案

EFK 日誌系統收集K8s中日誌

Prometheus 監控 for k8s, Grafana 展示 k8s 監控圖

SpringCloud 微服務容器化遷移

期待完善這些內容與小夥伴們一起學習探討

本期,我分享的是 k8s二進位制部署之Etcd,包含Etcd 叢集部署,Etcd 資料備份&快照恢復

在部署之前,我會貼出 此次我分享的K8S 這塊的基礎環境

軟體環境:

軟體

版本

作業系統

CentOS7。6_x64

Docker

19。03。9-CE

Kubernetes

1。18。5

etcd

3。4。9

伺服器資源規劃:

角色

IP 地址

元件

機器配置

k8s-node1

1。1。1。20

kubelet, kube-proxy, docker

4c8G100g

k8s-node2

1。1。1。22

kubelet, kube-proxy, docker

4c8G100g

k8s-node3

1。1。1。24

kubelet,kube-proxy,docker

4c8G100g

etcd1

1。1。1。28

etcd

4c8G100g

k8s-master,k8s-node-4,etcd2

1。1。1。30

kube-apiserver,kube-controller-manager,kube-scheduler

kubelet,kube-proxy,docker

etcd

4c8G100g

單master拓撲圖:

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

單master

涉及到的軟體包:

下載連結: https://pan。baidu。com/s/1jou9A-0qXo4E8KVexz_SzA

提取碼:

私聊小編,回覆 K8S

一、作業系統初始化配置:

# 關閉防火牆systemctl stop firewalldsystemctl disable firewalld# 關閉selinuxsed -i ‘s/enforcing/disabled/’ /etc/selinux/config # 永久setenforce 0 # 臨時# 關閉swapswapoff -a # 臨時sed -ri ‘s/。*swap。*/#&/’ /etc/fstab # 永久# 根據規劃設定主機名hostnamectl set-hostname # 在master新增hostscat >> /etc/hosts << EOF#node節點1。1。1。20 node11。1。1。22 node21。1。1。24 node3#etcd節點1。1。1。28 etcd11。1。1。30 etcd2#master節點1。1。1。30 masterEOF# 將橋接的IPv4流量傳遞到iptables的鏈cat > /etc/sysctl。d/k8s。conf << EOFnet。bridge。bridge-nf-call-ip6tables = 1net。bridge。bridge-nf-call-iptables = 1EOFsysctl ——system # 生效#安裝常用的軟體yum install vim nc wget lrzsz telnet net-tools epel-release bind-utils tree cifs-utils ntpdate iptables* -y#解除安裝不需要的軟體yum remove mariadb* firewalld*# 時間同步ntpdate time。windows。com#修改所有使用者的最大檔案數cat >> /etc/security/limits。conf <> /etc/security/limits。conf <

二、部署etcd叢集

Etcd 是一個分散式鍵值儲存系統,Kubernetes使用Etcd進行資料儲存,所以先準備一個Etcd資料庫,為解決Etcd單點故障,應採用叢集方式部署,這裡使用2臺組建叢集,實際生產中建議部署單數叢集,比如 3臺,5 臺……。

etcd叢集節點

IP地址

專案部署路徑

etcd1

1。1。1。28

/opt/etcd

etcd2

1。1。1。30

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

2。1 使用cfssl 自簽證書

使用cfssl:R1。2 證書籤發工具,

需要三個軟體: cfssl ,cfssl-json ,cfssl-certinfo

下載 cfssl 工具到

1。1。1。30 master

上的/usr/local/bin/ 目錄下,以後簽發證書的操作都在master 上進行

[root@master1 ~]# curl -L https://pkg。cfssl。org/R1。2/cfssl_linux-amd64 -o /usr/local/bin/cfsslbrbr[root@master1 ~]# curl -L https://pkg。cfssl。org/R1。2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljsonbrbr[root@master1 ~]# curl -L https://pkg。cfssl。org/R1。2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfobrbr[root@master1 ~]# chmod +x /usr/local/bin/cfssl*

1。1。1。30 master

上 建立etcd證書目錄:

[root@master1 ~]# mkdir /cert/etcd -p [root@master1 ~]# cd /cert/etcd

(1)、首先自建一個本地CA,生成ca證書, 準備配置檔案:

[root@manager etcd]# vim ca-csr。json {“CN”: “etcd CA”,“key”: {“algo”: “rsa”,“size”: 2048},“names”: [{“C”: “CN”,“L”: “Nanjing”,“ST”: “Nanjing”} ] }

#設定證書過期時間10年

[root@manager etcd]# vim ca-config。json { “signing”: { “default”: { “expiry”: “87600h” }, “profiles”: { “www”: { “expiry”: “87600h”, “usages”: [ “signing”, “key encipherment”, “server auth”, “client auth” ] } } }}

#執行命令生成ca檔案

[root@master1 etcd]# cfssl gencert -initca ca-csr。json | cfssljson -bare ca

生成了 ca。csr ca-key。pem ca。pem

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

(2)、簽發etcd 證書

#建立etcd 證書請求檔案,修改請求檔案中hosts欄位包含所有etcd節點IP;

配置需要頒發證書的資訊,域名、地區等

[root@master etcd]# cat server-csr。json {“CN”: “etcd”,“hosts”: [“1。1。1。28”,“1。1。1。30”,“1。1。1。40”,“1。1。1。42”,“1。1。1。44”,“1。1。1。46”],“key”: {“algo”: “rsa”,“size”: 2048},“names”: [{“C”: “CN”,“L”: “Nanjing”,“ST”: “Nanjing”} ] }

注:上述檔案hosts欄位中IP為所有etcd節點的叢集內部通訊IP,一個都不能少!為了方便後期擴容可以多寫幾個預留的IP。

#根據請求檔案頒發證書

[root@master1 etcd]# cfssl gencert -ca=ca。pem -ca-key=ca-key。pem -config=ca-config。json -profile=www server-csr。json | cfssljson -bare server2020/07/09 15:19:25 [INFO] generate received request2020/07/09 15:19:25 [INFO] received CSR2020/07/09 15:19:25 [INFO] generating key: rsa-20482020/07/09 15:19:25 [INFO] encoded CSR2020/07/09 15:19:25 [INFO] signed certificate with serial number 6744137238889279650272032222247478045048064901902020/07/09 15:19:25 [WARNING] This certificate lacks a “hosts” field。 This makes it unsuitable forwebsites。 For more information see the Baseline Requirements for the Issuance and Managementof Publicly-Trusted Certificates, v。1。1。6, from the CA/Browser Forum (https://cabforum。org);specifically, section 10。2。3 (“Information Requirements”)。[root@master1 etcd]# lsca-config。json ca。csr ca-csr。json ca-key。pem ca。pem server。csr server-csr。json server-key。pem server。pem

生成了 server。csr server-csr。json server-key。pem

(相當於key)

server。pem

(相當於crt)

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

#檢查

[root@master1 etcd]# ls *pemca-key。pem ca。pem server-key。pem server。pem

2。2 下載etcd 軟體包

V3。4。9

https://github。com/etcd-io/etcd/releases/download/v3。4。9/etcd-v3。4。9-linux-amd64。tar。gz

2。3 安裝etcd,建立工作目錄

以下在節點在etcd1【1。1。1。28】上操作,為簡化操作,待會將節點etcd1生成的所有檔案複製到 etcd2【1。1。1。30】上

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

mkdir /opt/etcd/{bin,cfg,ssl} -ptar zxvf etcd-v3。4。9-linux-amd64。tar。gzmv etcd-v3。4。9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/

2. 建立etcd配置檔案

[root@etcd1 cfg]# cat etcd。conf #[Member] 註釋就是註釋,不是配置檔案定義的內容ETCD_NAME=“etcd-1”ETCD_DATA_DIR=“/var/lib/etcd/default。etcd”ETCD_LISTEN_PEER_URLS=“https://1。1。1。28:2380”ETCD_LISTEN_CLIENT_URLS=“https://1。1。1。28:2379”##[Clustering] 註釋就是註釋,不是配置檔案定義的內容ETCD_INITIAL_ADVERTISE_PEER_URLS=“https://1。1。1。28:2380”ETCD_ADVERTISE_CLIENT_URLS=“https://1。1。1。28:2379”ETCD_INITIAL_CLUSTER=“etcd-1=https://1。1。1。28:2380,etcd-2=https://1。1。1。30:2380”ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”ETCD_INITIAL_CLUSTER_STATE=“new”

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服務

[root@etcd1 cfg]# vim /usr/lib/systemd/system/etcd。service [Unit]Description=Etcd ServerAfter=network。targetAfter=network-online。targetWants=network-online。target[Service]Type=notifyEnvironmentFile=/opt/etcd/cfg/etcd。confExecStart=/opt/etcd/bin/etcd \ ——cert-file=/opt/etcd/ssl/server。pem \ ——key-file=/opt/etcd/ssl/server-key。pem \ ——peer-cert-file=/opt/etcd/ssl/server。pem \ ——peer-key-file=/opt/etcd/ssl/server-key。pem \ ——trusted-ca-file=/opt/etcd/ssl/ca。pem \ ——peer-trusted-ca-file=/opt/etcd/ssl/ca。pemRestart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user。target

4. 複製剛才在master1 上/cert/etcd 中生成的證書

[root@master etcd]# scp /crt/etcd/ca*pem server*pem etcd1:/opt/etcd/ssl/

5. 啟動並設定開機啟動

systemctl daemon-reloadsystemctl start etcdstemctl enable etcd

6. 將上面etcd1 上所有生成的檔案複製到etcd2【1.1.1.30】上

scp -r /opt/etcd/ etcd2:/opt/scp /usr/lib/systemd/system/etcd。service etcd2:/usr/lib/systemd/system/

etcd2【1.1.1.30】上

修改etcd。conf配置檔案中的節點名稱和當前伺服器IP

[root@master cfg]# vim etcd。conf #[Member]ETCD_NAME=“etcd-2”#節點名稱,注意不能相同ETCD_DATA_DIR=“/var/lib/etcd/default。etcd”#etcd叢集之間通訊ETCD_LISTEN_PEER_URLS=“https://1。1。1。30:2380” #etcd與外部客戶端之間通訊ETCD_LISTEN_CLIENT_URLS=“https://1。1。1。30:2379”#[Clustering]ETCD_INITIAL_ADVERTISE_PEER_URLS=“https://1。1。1。30:2380”ETCD_ADVERTISE_CLIENT_URLS=“https://1。1。1。30:2379”#etcd叢集叢集列表ETCD_INITIAL_CLUSTER=“etcd-1=https://1。1。1。28:2380,etcd-2=https://1。1。1。30:2380”#etcd叢集名稱ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”ETCD_INITIAL_CLUSTER_STATE=“new”

7、etcd2 上啟動並設定開機啟動

systemctl daemon-reloadsystemctl start etcdsystemctl enable etcd

8、檢視etcd叢集狀態

[root@master etcd]# /opt/etcd/bin/etcdctl ——cacert=/opt/etcd/ssl/ca。pem ——cert=/opt/etcd/ssl/server。pem ——key=/opt/etcd/ssl/server-key。pem ——endpoints=“https://1。1。1。28:2379,https://1。1。1。30:2379” endpoint healthhttps://1。1。1。28:2379 is healthy: successfully committed proposal: took = 17。119749mshttps://1。1。1。30:2379 is healthy: successfully committed proposal: took = 18。545429ms

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

三、Etcd 備份與恢復

etcd資料備份和恢復時要注意使用的API介面,分為2和3兩個版本。

這裡我使用的是ETCD 3

先來談談為什麼要備份,首先我etcd 是部署的2節點的叢集 ,按理說 已經算上是高可用了吧大家都知道etcd 是 k8s 叢集 中配置儲存中心,與api-server 進行互相通訊,任何寫入的操作最終的資料都落地到etcd 中,可見etcd 在k8s 叢集中的重要性。但是 一些隊友 在k8s 中人為的一些誤操作 還是要對etcd 的資料進行備份,提高資料安全性

環境:

k8s 叢集 二進位制部署

etcd版本:     v3。4。9etcd1              1。1。1。28etcd2              1。1。1。30

3。1 備份

#在每個節點上都建立備份目錄

[root@master-1 ~]#mkdir  /opt/etcd/bak

#在etcd-1 節點上 使用命令備份

#ETCDCTL_API=3 使用的etcd api 介面版本為3版本

#/opt/etcd/bak/snap。db 備份的快照儲存的位置

#指定etcd 公鑰私鑰,以及ca證書

[root@master-1 bin]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot save /opt/etcd/bak/snap。db \——endpoints=https://1。1。1。28:2379 \——cacert=/opt/etcd/ssl/ca。pem \——cert=/opt/etcd/ssl/server。pem \——key=/opt/etcd/ssl/server-key。pem

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

#檢視備份的快照

[root@etcd1 ~]# ll /opt/etcd/bak/total 2840-rw————- 1 root root 2904096 Jul 26 14:35 snap。db[root@etcd1 ~]# du -sh /opt/etcd/bak/2。8M /opt/etcd/bak/

#檢視快照狀態

[root@etcd1 ~]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot status /opt/etcd/bak/snap。db 2584e00c, 4099502, 1534, 2。9 MB

#把備份的資料,複製一份到etcd2 上,用來快照恢復

[root@etcd1 ~]#  scp -rp /opt/etcd/bak root@1。1。1。30:/opt/etcd

3。2 模擬故障 + 快照恢復

3.2.1 模擬故障

#看看下當前deployment控制器和 pod

[root@master ~]# kubectl get pods,deploymentNAME READY STATUS RESTARTS AGEpod/web-5dcb957ccc-mnlsq 1/1 Running 0 14dpod/web-5dcb957ccc-tl7fm 1/1 Running 0 14dNAME READY UP-TO-DATE AVAILABLE AGEdeployment。apps/web 2/2 2 2 14d

#刪除deployments控制器

[root@master ~]# kubectl delete deployments。apps webdeployment。apps “web” deleted

#再檢視下當前POD,發現預設名稱空間下已經沒有Pod 存在了

[root@master ~]# kubectl get pods,deploymentNo resources found in default namespace。

3.2.2 快照恢復

1、在每個節點上停止kube-apiserver和etcd

# 注意: 停止的 方式有所不同:

如果是kubeadm 部署的話,需要刪除 etcd , Kube-apiserver 的 yaml 檔案才行,如果只是刪除deployment 控制器的話是沒有用的

如果是 二進位制 部署的話,只需要在master 節點上 停止 kube-apiserver 程序,在各etcd 節點 停止 etcd 程序即可

#我這裡是 二進位制部署 的 k8s 叢集

master節點:

[root@master-1 bak]# systemctl stop kube-apiserver

etcd 各節點:

[root@master-1 bak]# systemctl stop etcd

2、刪除個節點 etcd 資料目錄(最好直接備份走從命名)

[root@master-1 bak]# mv /var/lib/etcd/default。etcd /var/lib/etcd/default。etcd-2021-0726-bak

3、在每個節點上恢復

(注意etcd節點名稱,以及IP地址,以及cluster-token,每個人的環境都不一樣)

#別忘了指定備份的快照

Etcd1:

[root@etcd1 ~]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot restore /opt/etcd/bak/snap。db \> ——name etcd-1 \> ——initial-cluster=“etcd-1=https://1。1。1。28:2380,etcd-2=https://1。1。1。30:2380” \> ——initial-cluster-token=etcd-cluster \> ——initial-advertise-peer-urls=https://1。1。1。28:2380 \> ——data-dir=/var/lib/etcd/default。etcd{“level”:“info”,“ts”:1627282348。6668184,“caller”:“snapshot/v3_snapshot。go:296”,“msg”:“restoring snapshot”,“path”:“/opt/etcd/bak/snap。db”,“wal-dir”:“/var/lib/etcd/default。etcd/member/wal”,“data-dir”:“/var/lib/etcd/default。etcd”,“snap-dir”:“/var/lib/etcd/default。etcd/member/snap”}{“level”:“info”,“ts”:1627282348。7638705,“caller”:“mvcc/kvstore。go:380”,“msg”:“restored last compact revision”,“meta-bucket-name”:“meta”,“meta-bucket-name-key”:“finishedCompactRev”,“restored-compact-revision”:4098223}{“level”:“info”,“ts”:1627282348。7978258,“caller”:“membership/cluster。go:392”,“msg”:“added member”,“cluster-id”:“dc76f537f56989d7”,“local-member-id”:“0”,“added-peer-id”:“4a514157b56e2ed0”,“added-peer-peer-urls”:[“https://1。1。1。30:2380”]}{“level”:“info”,“ts”:1627282348。7979114,“caller”:“membership/cluster。go:392”,“msg”:“added member”,“cluster-id”:“dc76f537f56989d7”,“local-member-id”:“0”,“added-peer-id”:“a8bdbbc86e3e09cf”,“added-peer-peer-urls”:[“https://1。1。1。28:2380”]}{“level”:“info”,“ts”:1627282348。8819501,“caller”:“snapshot/v3_snapshot。go:309”,“msg”:“restored snapshot”,“path”:“/opt/etcd/bak/snap。db”,“wal-dir”:“/var/lib/etcd/default。etcd/member/wal”,“data-dir”:“/var/lib/etcd/default。etcd”,“snap-dir”:“/var/lib/etcd/default。etcd/member/snap”}

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

Etcd2:

[root@master bak]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot restore /opt/etcd/bak/snap。db \> ——name etcd-2 \> ——initial-cluster=“etcd-1=https://1。1。1。28:2380,etcd-2=https://1。1。1。30:2380” \> ——initial-cluster-token=etcd-cluster \> ——initial-advertise-peer-urls=https://1。1。1。30:2380 \> ——data-dir=/var/lib/etcd/default。etcd{“level”:“info”,“ts”:1627282555。1442761,“caller”:“snapshot/v3_snapshot。go:296”,“msg”:“restoring snapshot”,“path”:“/opt/etcd/bak/snap。db”,“wal-dir”:“/var/lib/etcd/default。etcd/member/wal”,“data-dir”:“/var/lib/etcd/default。etcd”,“snap-dir”:“/var/lib/etcd/default。etcd/member/snap”}{“level”:“info”,“ts”:1627282555。4099832,“caller”:“mvcc/kvstore。go:380”,“msg”:“restored last compact revision”,“meta-bucket-name”:“meta”,“meta-bucket-name-key”:“finishedCompactRev”,“restored-compact-revision”:4098223}{“level”:“info”,“ts”:1627282555。5169249,“caller”:“membership/cluster。go:392”,“msg”:“added member”,“cluster-id”:“dc76f537f56989d7”,“local-member-id”:“0”,“added-peer-id”:“4a514157b56e2ed0”,“added-peer-peer-urls”:[“https://1。1。1。30:2380”]}{“level”:“info”,“ts”:1627282555。517036,“caller”:“membership/cluster。go:392”,“msg”:“added member”,“cluster-id”:“dc76f537f56989d7”,“local-member-id”:“0”,“added-peer-id”:“a8bdbbc86e3e09cf”,“added-peer-peer-urls”:[“https://1。1。1。28:2380”]}{“level”:“info”,“ts”:1627282555。642511,“caller”:“snapshot/v3_snapshot。go:309”,“msg”:“restored snapshot”,“path”:“/opt/etcd/bak/snap。db”,“wal-dir”:“/var/lib/etcd/default。etcd/member/wal”,“data-dir”:“/var/lib/etcd/default。etcd”,“snap-dir”:“/var/lib/etcd/default。etcd/member/snap”}

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

#分別啟動 api-server 和 etcd各節點

master節點:

[root@master-1 bak]# systemctl start kube-apiserver

etcd 節點

[root@etcd1 ~]# systemctl start etcd

#驗證資料是否還原:

[root@master bak]# kubectl get pods,deploymentNAME READY STATUS RESTARTS AGEpod/web-5dcb957ccc-mnlsq 1/1 Running 0 14dpod/web-5dcb957ccc-tl7fm 1/1 Running 0 14dNAME READY UP-TO-DATE AVAILABLE AGEdeployment。apps/web 2/2 2 2 14d

可以看到被刪除的POD 已經恢復回來了

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

另外 小編再給大家分享一個Etcd 的定時備份指令碼:

[root@master-1 /]# vim /opt/etcd/back_etcd。sh#!/bin/bashset -eexec >> /var/log/backup_etcd。logDate=`date +%Y-%m-%d-%H-%M`EtcdEndpoints=“https://1。1。1。30:2379”EtcdCmd=“/opt/etcd/bin/etcdctl”BackupDir=“/opt/etcd/bak”BackupFile=“snapshot。db。$Date”cacertfile=“/opt/etcd/ssl/ca。pem”certfile=“/opt/etcd/ssl/server。pem”keyfile=“/opt/etcd/ssl/server-key。pem”echo “`date` backup etcd。。。”export ETCDCTL_API=3$EtcdCmd snapshot save $BackupDir/$BackupFile ——endpoints=$EtcdEndpoints ——cacert=$cacertfile ——cert=$certfile ——key=$keyfileecho “`date` backup done!”

效果如圖所示

那些年我們踩過的坑,K8s二進位制部署之Etcd (1)

最後小編再羅嗦幾句

Etcd備份的節點最好不是單一的,雖然是叢集,但也怕哪天突然一個節點沒有備份,等日後要恢復的時候就傻眼了; 所有最好是 備份 >= 2 個節點, 且 要給備份的檔案

做實時的監控 [別平時在備份,等到需要的時候發現備份的都是錯誤的!!!]