久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Kubernetes的etcd節點和擴容方法是什么

153次閱讀
沒有評論

共計 10169 個字符,預計需要花費 26 分鐘才能閱讀完成。

這篇文章主要講解了“Kubernetes 的 etcd 節點和擴容方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“Kubernetes 的 etcd 節點和擴容方法是什么”吧!

Kubernetes 使用 kubeadm 安裝默認只有一個 etcd 實例,存在單點故障的風險。提升 Kubernetes 集群可用性的方法包括:1、備份(Kubernetes 探秘—etcd 狀態數據及其備份);2、etcd 節點和實例擴容;3、apiserver 的多節點服務和負載均衡。這里主要實驗 etcd 節點和實例的擴容。

一、etcd 擴容,主要思路

etcd 是一個獨立的服務,在 kubernetes 中使用時將配置參數和數據目錄分別映射到了宿主機目錄,而且使用 hostnetwork 網絡(本主機網絡)。其中,/etc/kubernetes/manifest/etcd.yaml 為啟動參數文件,/etc/kubernetes/pki/etcd 為 https 使用的證書,/var/lib/etcd 為該節點的 etcd 數據文件。

對于已用 kubeadm 安裝的單 Master 節點 Kubernetes 集群,其 etcd 運行實例只有一個。我們希望將其 etcd 實例擴展到多個,以降低單點失效風險。Kubernetes 中 etcd 的擴容的思路如下:

所有節點安裝 kubeadm/kubectl/kubelet,按照獨立 master 節點安裝。

創建 etcd 集群的證書,并復制到各個節點。

在各節點修改 etcd 啟動配置文件,啟動 etcd 實例。有多種方式 (運行結果一樣、管理方式不同):

通過 kubectl 部署,讓 kubernetes 控制啟動。通過 nodeSelector 指定運行的節點。

通過 kubelet 服務來啟動,操作系統通過 systemd 啟動 kubelet 服務。這是 k8s 的標準過程。

通過 docker 的 –restart 參數讓容器自行啟動,由容器服務來進行管理。

把 etcd 作為宿主機服務來直接啟動,不使用 Docker 或者 k8s 管理。

將所有節點 kube-apiserver.yaml 的 etcd 服務指向本地的 etcd 服務實例。

etcd 是分布式的存儲,所有節點的數據將會自動同步,從任何節點訪問都是一樣的。

二、etcd 擴容,實驗步驟第一步:安裝多個節點

準備好安裝 etcd 的節點。我使用 ubuntu 18.04LTS,然后安裝 Docker CE 18.06 和 kubernetes 1.12.3。

我這里的三個節點分別為:

podc01, 10.1.1.201

podc02, 10.1.1.202

podc03, 10.1.1.203

需要提前把 k8s 用到的容器鏡像拉取下來到每一個節點。參考:

Kubernetes 1.12.3 快速升級

Kubernetes 版本鎖定到 1.12.3

多網卡 Ubuntu 服務器安裝 Kubernetes

Ubuntu 18.04 設置多網卡多端口聚合

快速建立 Kubernetes 集群,從零開始

第二步:創建 etcd 證書

本想嘗試復制主節點的 /etc/kubernetes/kpi 和 /etc/kubernetes/manifest 目錄到所有副(mate)節點,啟動后出現各種問題無法正常訪問,提示是 ca 證書問題。最后,準備從頭開始創建自己的證書和部署 yaml 文件。

創建證書使用 cfssl 來創建,需要下載模版文件和修改定義文件,包括 ca 機構、ca-config 配置、ca-key 私鑰、csr 請求、server/peer/client 等證書的配置模版文件等。需要將里面的信息按照自己的環境進行修改。

最后生成 cert-file 證書文件、key-file 公鑰文件和 trusted-ca-file 證書機構文件(因為我們這里用的是自簽名,所以創建自己的證書機構文件)。

這三個文件在 etcd 實例啟動時配置進去(注意:API2 和 API3 的參數名稱有些不同),需要放到每一個節點的相應目錄,并映射到 etcd 容器卷中。

使用 etcdctl 作為服務客戶端訪問時也需要指定相應的參數,其它對端(Peer)etcd 實例也需要使用這些參數來相互訪問、組成集群、同步數據。

1、準備 cfssl 證書工具

mkdir ~/cfssl   cd ~/cfssl
mkdir bin   cd bin
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O cfssljson 
chmod +x {cfssl,cfssljson}
export PATH=$PATH:~/cfssl/bin

可選:為了方便,可以將 path 添加到~/.profile 文件中,或者復制到 /usr/local/bin 目錄。

2、創建證書配置文件

創建證書配置文件目錄:

mkdir -p ~/cfssl/etcd-certs   cd ~/cfssl/etcd-certs

生成證書配置文件放到~/cfssl/etcd-certs 目錄中,文件模版如下:

# ==============================================
# ca-config.json
  signing : {
  default : {
  expiry :  43800h 
 },
  profiles : {
  server : {
  expiry :  43800h ,
  usages : [
  signing ,
  key encipherment ,
  server auth 
 ]
 },
  client : {
  expiry :  43800h ,
  usages : [
  signing ,
  key encipherment ,
  client auth 
 ]
 },
  peer : {
  expiry :  43800h ,
  usages : [
  signing ,
  key encipherment ,
  server auth ,
  client auth 
 ]
 }
 }
 }
# ==============================================
# ca-csr.json
  CN :  My own CA ,
  key : {
  algo :  rsa ,
  size : 2048
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  O :  My Company Name ,
  ST :  San Francisco ,
  OU :  Org Unit 1 ,
  OU :  Org Unit 2 
 }
 ]
# ==============================================
# server.json
  CN :  etcd0 ,
  hosts : [
  127.0.0.1 ,
  0.0.0.0 ,
  10.1.1.201 ,
  10.1.1.202 ,
  10.1.1.203 
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
# ==============================================
# peer1.json #  填本機 IP
  CN :  etcd0 ,
  hosts : [
  10.1.1.201 
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
# ==============================================
# client.json
  CN :  client ,
  hosts : [
  
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
}

3、創建 etcd 集群的證書

操作如下:

cd ~/cfssl/etcd-certs
 
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer peer1.json | cfssljson -bare peer1
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client

查看所產生的證書文件:

ls -l ~/cfssl/etcd-certs

文件包括:

...

第三步:啟動 etcd 多實例

注意:

因為擴容過程中,需要將原來的 etcd 庫刪除,會導致 kubernetes 集群的 master 節點信息丟失,因此在擴容之前,建議使用 etcdctl snapshot 命令進行備份。或者,另建 etcd 節點,將原來的數據傳送過去。

啟動 etcd 實例之前,務必將 /var/lib/etcd 目錄清空,否則一些設置的參數將不會起作用,仍然保留原來的狀態。

注意,etcd 的下面幾個參數只在第一次啟動(初始化)時起作用,包括:

  – –initial-advertise-peer-urls=http://10.1.1.202:2380

  – –initial-cluster=podc02=http://10.1.1.202:2380,podc03=http://10.1.1.203:2380

  – –initial-cluster-token=etcd-cluster

  – –initial-cluster-state=new

如果是添加新節點,先在原來的節點運行 member add xxx。然后 - –initial-cluster-state=existing,再啟動服務。

1、上傳證書文件

將 cfssl/etcd-certs 目錄拷貝到 /etc/kubernetes/pki/etcd-certs 目錄,可以使用 scp 或 sftp 上傳。

2、編輯啟動文件

編輯 /etc/kubernetes/manifests/etcd.yaml 文件,這是 kubelet 啟動 etcd 實例的配置文件。

# /etc/kubernetes/manifests/etcd.yaml
apiVersion: v1
kind: Pod
metadata:
 annotations:
 scheduler.alpha.kubernetes.io/critical-pod:  
 creationTimestamp: null
 labels:
 component: etcd
 tier: control-plane
 name: etcd
 namespace: kube-system
spec:
 containers:
 - command:
 - etcd
 - --advertise-client-urls=https://10.1.1.201:2379
 - --cert-file=/etc/kubernetes/pki/etcd-certs/server.pem
 - --client-cert-auth=true
 - --data-dir=/var/lib/etcd
 - --initial-advertise-peer-urls=https://10.1.1.201:2380
 - --initial-cluster=etcd0=https://10.1.1.201:2380
 - --key-file=/etc/kubernetes/pki/etcd-certs/server-key.pem
 - --listen-client-urls=https://10.1.1.201:2379
 - --listen-peer-urls=https://10.1.1.201:2380
 - --name=etcd1
 - --peer-cert-file=/etc/kubernetes/pki/etcd-certs/peer1.pem
 - --peer-client-cert-auth=true
 - --peer-key-file=/etc/kubernetes/pki/etcd-certs/peer1-key.pem
 - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 - --snapshot-count=10000
 - --trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 image: k8s.gcr.io/etcd-amd64:3.2.18
 imagePullPolicy: IfNotPresent
 #livenessProbe:
 # exec:
 # command:
 # - /bin/sh
 # - -ec
 # - ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.1.201]:2379 --cacert=/etc/kubernetes/pki/etcd-certs/ca.pem
 # --cert=/etc/kubernetes/pki/etcd-certs/client.pem --key=/etc/kubernetes/pki/etcd-certs/client-key.pem
 # get foo
 # failureThreshold: 8
 # initialDelaySeconds: 15
 # timeoutSeconds: 15
 name: etcd
 resources: {}
 volumeMounts:
 - mountPath: /var/lib/etcd
 name: etcd-data
 - mountPath: /etc/kubernetes/pki/etcd
 name: etcd-certs
 hostNetwork: true
 priorityClassName: system-cluster-critical
 volumes:
 - hostPath:
 path: /var/lib/etcd
 type: DirectoryOrCreate
 name: etcd-data
 - hostPath:
 path: /etc/kubernetes/pki/etcd-certs
 type: DirectoryOrCreate
 name: etcd-certs
status: {}

參照上面的模式,在各個副節點修改 etcd 啟動參數 /etc/kubernetes/manifest/etcd.yaml 文件內容。

注意:IP 地址需要修改多個地方,不要遺漏、錯誤。

重啟 kubelet 服務。

sudo systemctl restart kubelet。

檢查 etcd 服務。

ectdctl 連接到實例,etcdctl member list。

最終,多節點的 etcd 實例鏈接為一個集群。

3、驗證運行狀態

進入 etcd 容器執行:

alias etcdv3= ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.1.201]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.pem --cert=/etc/kubernetes/pki/etcd/client.pem --key=/etc/kubernetes/pki/etcd/client-key.pem 
etcdv3 member add etcd1 --peer-urls= https://10.1.1.202:2380

4、增加 etcd 節點

拷貝 etcd1(10.1.1.201) 節點上的證書到 etcd1(10.1.1.202) 節點上,復制 peer1.json 到 etcd2 的 peer2.json,修改 peer2.json。

# peer2.json
  CN :  etcd1 ,
  hosts : [
  10.1.86.202 
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
}

重新生成在 etcd1 上生成 peer1 證書:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer peer1.json | cfssljson -bare peer1

啟動 etcd1,配置文件如下:

# etcd02 etcd.yaml
apiVersion: v1
kind: Pod
metadata:
 annotations:
 scheduler.alpha.kubernetes.io/critical-pod:  
 creationTimestamp: null
 labels:
 component: etcd
 tier: control-plane
 name: etcd
 namespace: kube-system
spec:
 containers:
 - command:
 - etcd
 - --advertise-client-urls=https://10.1.1.202:2379
 - --cert-file=/etc/kubernetes/pki/etcd-certs/server.pem
 - --data-dir=/var/lib/etcd
 - --initial-advertise-peer-urls=https://10.1.1.202:2380
 - --initial-cluster=etcd01=https://10.1.1.201:2380,etcd02=https://10.1.1.202:2380
 - --key-file=/etc/kubernetes/pki/etcd-certs/server-key.pem
 - --listen-client-urls=https://10.1.1.202:2379
 - --listen-peer-urls=https://10.1.1.202:2380
 - --name=etcd02
 - --peer-cert-file=/etc/kubernetes/pki/etcd-certs/peer2.pem
 - --peer-client-cert-auth=true
 - --peer-key-file=/etc/kubernetes/pki/etcd-certs/peer2-key.pem
 - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 - --snapshot-count=10000
 - --trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 - --initial-cluster-state=existing #  千萬別加雙引號,被坑死
 image: k8s.gcr.io/etcd-amd64:3.2.18
 imagePullPolicy: IfNotPresent
 # livenessProbe:
 # exec:
 # command:
 # - /bin/sh
 # - -ec
 # - ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.1.202]:2379 --cacert=/etc/kubernetes/pki/etcd-certs/ca.crt
 # --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd-certs/healthcheck-client.key
 # get foo
 # failureThreshold: 8
 # initialDelaySeconds: 15
 # timeoutSeconds: 15
 name: etcd
 resources: {}
 volumeMounts:
 - mountPath: /var/lib/etcd
 name: etcd-data
 - mountPath: /etc/kubernetes/pki/etcd
 name: etcd-certs
 hostNetwork: true
 priorityClassName: system-cluster-critical
 volumes:
 - hostPath:
 path: /var/lib/etcd
 type: DirectoryOrCreate
 name: etcd-data
 - hostPath:
 path: /etc/kubernetes/pki/etcd-certs
 type: DirectoryOrCreate
 name: etcd-certs
status: {}

進入 etcd 容器執行:

alias etcdv3= ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.86.201]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.pem --cert=/etc/kubernetes/pki/etcd/client.pem --key=/etc/kubernetes/pki/etcd/client-key.pem 
etcdv3 member add etcd1 --peer-urls= https://10.1.1.203:2380

按照以上步驟,增加 etcd03。

5、etcd 集群健康檢查

# etcdctl --endpoints=https://[10.1.1.201]:2379 --ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem --cert-file=/etc/kubernetes/pki/etcd-certs/client.pem --key-file=/etc/kubernetes/pki/etcd-certs/client-key.pem cluster-health
member 5856099674401300 is healthy: got healthy result from https://10.1.86.201:2379
member df99f445ac908d15 is healthy: got healthy result from https://10.1.86.202:2379
cluster is healthy

第四步:修改 apiserver 服務指向

- --etcd-cafile=/etc/kubernetes/pki/etcd-certs/ca.pem
- --etcd-certfile=/etc/kubernetes/pki/etcd-certs/client.pem
- --etcd-keyfile=/etc/kubernetes/pki/etcd-certs/client-key.pem

至此,etcd 已經擴展成多節點的分布式集群,而且各個節點的 kubernetes 都是可以訪問的。

注意:

上面的流程適合剛創建的 k8s 集群。

如果已經有 kubeadm 的多節點集群,可以先創建 node2/node3 的 etcd 集群,然后將 node1 的數據同步過來,再添加 node1 集群,就能保留原來的數據。

參考:Kubernetes 的 etcd 數據查看和遷移

上面所部署的工作節點還只能連接到一個 apiserver,其它副節點的 apiserver 雖然可用但是無法被工作節點連接到。

下一步需要實現多 master 節點的容錯,遇主節點故障時可以轉移訪問其它的副節點。

感謝各位的閱讀,以上就是“Kubernetes 的 etcd 節點和擴容方法是什么”的內容了,經過本文的學習后,相信大家對 Kubernetes 的 etcd 節點和擴容方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計10169字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 射阳县| 宣化县| 龙胜| 元谋县| 纳雍县| 辽宁省| 乳山市| 江孜县| 同心县| 密云县| 得荣县| 康乐县| 宾川县| 漾濞| 木兰县| 中山市| 门源| 会昌县| 文安县| 宜川县| 资源县| 三亚市| 晋宁县| 大埔县| 阿城市| 兴隆县| 通山县| 佛坪县| 临潭县| 通城县| 丰台区| 莆田市| 凤庆县| 寿阳县| 浦城县| 屯门区| 锦州市| 阜平县| 石嘴山市| 蒲江县| 烟台市|