由於頭條篇幅有限,分上下兩部分呈現給大家,大家關注頭號可以在查到完整的技術文檔哈。
技能目標:
· 瞭解k8s api基本對象
· 掌握k8s組件工作原理
· 學會部署k8s集群
7.1 案例分析
7.1.1 案例概述
隨著Docker技術的發展和廣泛流行,雲原生應用和容器調度管理系統也成為IT領域大熱的詞彙。事實上,在Docker技術火爆之前,雲原生應用的思想已經由雲計算技術的領導者和分佈式系統架構的推廣者廣泛傳播。例如早在2011年Heroku的工程師提出了雲原生應用的12要素,只不過以虛擬機技術作為雲原生應用的基礎實施。由於虛擬機鏡像大、鏡像標準不統一以及打包流程和工具不統一,導致了業界無法廣泛接受的雲原生應用標準,限制了雲原生應用的流行。而Docker的出現正好解決了這些限制雲原生應用構建、交付和運行的瓶頸,使得構建雲原生應用成為了使用Docker的開發者自然而然的選擇。
Kubernetes是為生產環境而設計的容器調度管理系統,對於負載均衡、服務發現、高可用、滾動升級、自動伸縮等容器雲平臺的功能要求有原生支持。由於Kubernetes在K和s間有8個字母,因此常簡稱k8s。事實上,隨著對k8s系統架構與設計理念的瞭解深入,會發現K8s系統正是處處為運行雲原生應用而設計考慮;同時,隨著對k8s系統使用的加深和推廣,也會有越來越多有關雲原生應用的設計模式產生出來,使得基於k8s系統設計和開發生產級的複雜雲原生應用變得像啟動一個單機版容器服務那樣簡單易用。
7.1.2 案例前置知識點
1. k8s是什麼
Kubernetes是一個開源的Docker容器編排系統,它可以調度計算集群的節點,動態管理上面的作業,保證它們按用戶期望的狀態運行。通過使用「labels」和「pods」的概念,Kubernetes將應用按邏輯單元進行分組,方便管理和服務發現。
k8s主要用於自動化部署、擴展和管理容器應用,提供了資源調度、部署管理、服務發現、擴容縮容、監控等一整套功能。2015年7月,Kubernetes v1.0正式發佈,截止到目前最新穩定版本是v1.9。
2. 為什麼要用Kubernetes
使用Kubernetes的理由有很多,最基本的一個理由就是:IT是新技術驅動行業。
Docker這個新興的容器化技術當前已經被很多公司所採用,其從單機走向集群已成必然,而云計算的蓬勃發展正在加速這一進程。Kubernetes作為當前唯一被業界廣泛認可和看好的Docker分佈式系統解決方案。可以預見,在未來幾年內,會有大量的新系統選擇它,不管是運行在企業本地服務器上還是被託管到公有云上。
使用Kubernetes又會收穫哪些好處呢?
首先,使用Kubernetes就是在全面擁抱微服務架構。微服務架構的核心就是將一個巨大的單體應用分解為很多小的互相連接的微服務,一個微服務背後可能有多個實例副本在支撐,副本的數量可能會隨著系統的負荷變化而進行調整,內嵌的負載均衡器在k8s平臺中有多個實例副本在支撐,副本的數量可能會隨著系統的負荷變化而進行調整,內嵌的負載均衡器k8s平臺中發揮了重要的作用。微服務架構使得每個服務都可以由專門的開發團隊來開發,開發者可以自由選擇開發技術,這對於大規模團隊來說很有價值。另外,每個微服務獨立開發、升級、擴展,使得系統具備很高的穩定性和快速迭代進化能力。
其次,Kubernetes系統架構具備了超強的橫向擴容能力。對於互聯網公司來說,用戶規模就等價於資產,誰擁有更多的用戶,誰就能在競爭中勝出,因此超強的橫向擴容能力是互聯網業務系統的關鍵指標之一。不用修改代碼,一個Kubernetes集群即可從只包含幾個Node的小集群平滑擴展到擁有成百上千Noder大規模集群,利用Kubernetes提供的工具,甚至可以在線完成集群的擴容。只要微服務設計的得好,結合硬件或者公有云資源的線性增加,系統就能夠承受大量用戶併發訪問所帶來的壓力。
3. Kubernetes基本概念和術語
Kubernetes中的大部分概念如Node、Pod、Replication Controller、Server、Deploymeng、Job、DaemonSet等都可以看作一種資源對象,幾乎所有的資源對象都可以通過Kubernetes提供的kubectl工具執行增、刪、改、查等操作,並將其保存在etcd中持久化存儲。從這個角度來看,Kubernets其實是一個高度自動化的資源控制系統,它通過跟蹤對比etcd存儲裡保存的資源期望狀態與當前環境中的實際資源狀態的差異來實現自動控制和自動糾錯的高級功能。
1) Master
Kubernetes裡的Master指的是集群控制節點,每個Kubernetes集群裡需要有一個Master節點來負責整個集群的管理的控制,基本上Kubernetes所有的控制命令進是發給Master,Master負責具體的執行過程,後面所有執行的命令基本都是在Master節點上運行的。Master節點通常會佔據一個獨立的X86服務器,一個主要的原因是它太重要了,它是整個集群的大腦,如果它宕機或者不可用,那麼所有的控制命令都將失效。
Master節點上運行著以下一組關鍵進程:
· Kube-apiserver:提供了HTTP Rest接口的關鍵服務進程,是Kubernetes裡所有資源的增、刪、改、查等操作的唯一入口,也是集群控制入口進程。
· Kube-controller-manager:是Kubernetes裡所有資源對象的自動化控制中心,可以理解為資源對象的管家。
· Kube-scheduler:負責資源調度的進程,相當於公交公司的調度室。
其實Master節點上往往還啟動了一個etcd server進程,因為Kubernetes裡的所有資源對象的數據全部是保存在etcd中的。
2) Node
除了Master、Kubernetes集群中的其他機器被稱為Node節點,在較早的版本中也被稱為Minion。與Master一樣,Node節點可以是一臺物理主機,也可以是一臺虛擬機。Node節點才是Kubernetes集群中的工作負載節點,每個Node都會被Master分配一些負載。當某個Node宕機時,其上的工作負載會被Master自動轉移到其他節點上去。
每個Node節點都運行著以下一組關鍵進程:
· Kubelet:負責Pod對應的容器的創建、啟停等任務,同時與Master節點密切協作,實現集群管理的基本功能。
· Kube-proxy:實現Kubernetes Service的通信與負載均衡機制的重要組件。
圖7.1是k8s組件邏輯圖。
圖7.1 k8s組件邏輯圖
· Docker Engine:Docker引擎,負責本機的容器創建和管理工作。
Node節點可以在運行期間動態增加到Kubernetes集群中,前提是這個節點上已經正確安裝、配置和啟動了上述關鍵進程。在默認情況下,kubelet會向Master註冊自己,這也是Kubernetes推薦的Node管理方式。一旦Node被納入集群管理範圍,kubelet進程就會定向Master節點彙報自身的情況,例如操作系統、Docker版本、機器的CPU和內存情況,以及之前有哪些Pod在運行等,這樣Master可以獲知每個Node的資源使用情況,並實現高效負載均衡資源調度策略。而某一個Node超過指定時間不上報信息時,會被Master判定為失聰的狀態,被標記為不可用,隨後Master會觸發節點轉移進程。
3) Pod
Pod是最小部署單元,一個Pod有一個或多個容器組成,Pod中容器共享存儲和網絡,在同一臺Docker主機上運行。每個Pod都有一個特殊的被稱為"根容器"的Pause容器。Pause容器對應的鏡像屬於Kubernetes平臺的一部分,除了Pause容器,每個Pod還包含一個或多個緊密相關的用戶業務容器。
4) Lable
Lable是Kubernetes系統中另外一個核心概念。一個Label是一個key-value的鍵值對,其中key與value由用戶自己指定。Label可以附加到各種資源對象上,例如Node、Pode、Service、RC等。一個資源對象可以定義任意數量的Label,同一個Label也可以被添加到任意數量的資源對象中,也可以在對象創建後動態添加或者刪除。
另外可以通過給指定的資源對象捆綁一個或多個不同的Label來實現多緯度的資源分組管理功能,以便於靈活、方便地進行資源分配、調度、配置、部署等管理工作。Label標籤,給某個資源對象定義一個Label,就相當於給它打了一個標籤,隨後可以通過Label selector 標籤選擇器查詢和篩選擁有某些Label的資源對象,Kubernetes通過這種方式實現了類似SQL的簡單又通用的對象查詢機制。
5) 複製控制器(Replication Controller ,RC)
RC是Kubernetes集群中最早的保證Pod高可用的API對象。通過監控運行中的Pod來保證集群中運行指定數目的Pod副本。指定的數目可以是多個也可以是1個;如果少於指定數目,RC就會啟動運行新的Pod副本。如果多於指定數目,RC就會殺死多餘的Pod副本。即使在指定數目為1的情況下,通過RC運行Pod也比直接運行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有1個Pod在運行。RC是K8s較早期的技術概念,只適用於長期伺服型的業務類型,比如控制小機器人提供高可用的Web服務。
6) Deployment控制器
部署表示用戶對K8s集群的一次更新操作。部署是一個比RS應用模式更廣的API對象,可以是創建一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是創建一個新的RS,然後逐漸將新RS中副本數增加到理想狀態,將舊RS中的副本數減小到0的複合操作;這樣一個複合操作用一個RS是不太好描述的,需要用一個更通用的Deployment來描述。以k8s的發展方向,未來對所有長期服務型的的業務的管理,都會通過Deployment來管理。
7) 服務 Service
RC和Deployment只是保證了支撐服務的微服務Pod的數量,但是沒有解決如何訪問這些服務的問題。一個Pod只是一個運行服務的實例,隨時可能在一個節點上停止,在另一個節點以一個新的IP地址啟動一個新的Pod,因此不能以確定的IP地址和端口號提供服務。要穩定地提供服務,需要服務發現和負載均衡能力。服務發現完成的工作,是針對客戶端訪問的服務,找到對應的的後端服務實例。
在K8s集群中,客戶端需要訪問的服務就是Service對象。每個Service會對應一個集群內部有效的虛擬IP,集群內部通過虛擬IP訪問一個服務。在K8s集群中微服務的負載均衡是由Kube-proxy實現的。Kube-proxy是K8s集群內部的負載均衡器。它是一個分佈式代理服務器,在K8s的每個節點上都會運行一個Kube-proxy組件;這一設計體現了它的伸縮性優勢,需要訪問服務的節點越多,提供負載均衡能力的Kube-proxy就越多,高可用節點也隨之增多。與之相比,平時在服務器端做個反向代理做負載均衡,還要進一步解決反向代理的負載均衡和高可用問題。
8) Job計劃任務
Job是Kubernetes用來控制批處理型任務的API對象。批處理業務與長期服務業務的主要區別是批處理業務的運行有頭有尾,而長期伺服業務在用戶不停止的情況下永遠運行。根據用戶的設置,Job管理的Pod把任務成功完成就自動退出了。成功完成的標誌根據不同的spec.completions策略而不同:單Pod型任務有一個Pod成功就標誌完成;定數成功型任務保證有N個任務全部成功;工作隊列型任務根據應用確認的全局成功而標誌成功。
9) DaemonSet
後臺支撐型服務的核心關注點在Kubernetes集群中的節點(物理機或虛擬機),DaemonSet確保所有或某些節點運行同一個Pod,要保證每個節點上都有一個此類Pod運行。節點可能是所有集群節點也可能是通過nodeSelector選定的一些特定節點。典型的後臺支撐型服務包括,存儲,日誌和監控等在每個節點上支持K8s集群運行的服務。
4. 小結
上述這些組件是Kubernetes系統的核心組件,共同構成了Kubernetes系統的框架和計算模型。通過對它們進行靈活配置用戶就可以快速、方便地對容器集群進行配置和管理。除了本章所介紹的核心組件外,在Kubernetes系統中還有很多輔助的資源對象,例如LimitRange、ResouceQuota。另外,一些系統內部使用的對象等具體可以參考Kubernetes的Api文檔。
7.1.3 案例環境
1. 本案例實驗環境
本案例環境如表7-1所示。
表7-1 k8s系統環境
2. 主機角色分配
本案例環境角色分配如表7-2所示。
表7-2 Docker角色分配
3. 案例拓撲
Kubernetes集群是由分佈式存儲(etcd)、服務節點(Node)和控制節點(Master)構成的。所有的集群狀態都保存在etcd中,Master節點上則運行集群的管理控制模塊。Node節點是真正運行應用容器的主機節點,在每個Node節點上都會運行一個Kubelet代理,控制該節點上的容器、鏡像和存儲卷等。具體架構圖如7.2所示:
圖7.2 Kubernetes拓撲圖
4. 案例需求
1)部署etcd服務集群
2)部署flannel網絡跨主機通信網絡
3)部署k8s集群
5.案例實現思路
1)準備k8s系統環境
2)創建自籤的TLS通信加密證書
3)部署etcd集群
4)部署flannel網絡
5)部署k8s master組件
6)部署k8s node 組件
7)查看自動簽發證書,驗證k8s集群部署成功
7.1.4 問題分析
絕大部分使用k8s的人都會使用kubedns做服務發現和service domain的解析。kubedns會建立長連接即時檢查service的變化,一旦發現有service被創建,會根據service的類型,在數據庫中構建service domain 到指定的CNAME或IP(cluster-IP)的映射,作為對該service domain 的dns解析結果。
7.2 案例實施
7.2.1 k8s系統環境準備
1. 修改主機名
[root@localhost ~]# hostnamectl set-hostname k8s-master //192.168.168.91
[root@localhost ~]# hostnamectl set-hostname k8s-node1 //192.168.168.92
[root@localhost ~]# hostnamectl set-hostname k8s-node2 //192.168.168.93
2. 修改hosts對應主機名
[root@k8s-master ~]# vi /etc/hosts //每臺機器都需要執行
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.168.91 k8s-master
192.168.168.92 k8s-node1
192.168.168.93 k8s-node2
3. 添加外網dns解析地址
注意:要根據自己的網絡環境選擇合適的dns。
[root@k8s-master ~]# vi /etc/resolv.conf //每臺機器都需要執行
nameserver 202.106.0.20
4. 安裝必要的依賴軟件(k8s創建容器的時候需要生成iptables規則)
//每臺機器都需要執行,master可以不安裝docker
[root@k8s-master ~]# yum -y install iptable* wget telnet lsof vim
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@k8s-master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@k8s-master ~]# yum -y install docker-ce
[root@k8s-master ~]# systemctl restart docker
[root@k8s-master ~]# cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
EOF
5. 把默認的firewalld防火牆換成iptables
[root@k8s-master ~]# systemctl stop firewalld //每臺機器都需要執行
[root@k8s-master ~]# systemctl start iptables
[root@k8s-master ~]# iptables -F
[root@k8s-master ~]# iptables -I INPUT -s 192.168.168.0/24 -j ACCEPT
6. 檢查確認這三臺機器時間是否同步
7.2.2 k8s集群部署-自籤TLS通信加密證書
Kubernetes系統的各組件需要使用TLS證書對通信進行加密,本案例使用CloudFlare的PKI工具集cfssl來生成Certificate Authority和其他證書。
1.創建證書存放位置並安裝證書生成工具
[root@k8s-master ~]# mkdir –p /root/software/ssl
[root@k8s-master ~]# cd /root/software/ssl/
[root@k8s-master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@k8s-master ssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@k8s-master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@k8s-master ssl]# chmod +x * //下載完後,加上執行權限
[root@k8s-master ssl]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
[root@k8s-master ssl]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@k8s-master ssl]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
[root@k8s-master ssl]# cfssl --help
Usage:
Available commands:
bundle
ocsprefresh
print-defaults
version
genkey
gencert
ocspsign
serve
gencrl
selfsign
scan
info
revoke
certinfo
sign
ocspdump
ocspserve
Top-level flags:
-allow_verification_with_non_compliant_keys
Allow a SignatureVerifier to use keys which are technically non-compliant with RFC6962.
-loglevel int
Log level (0 = DEBUG, 5 = FATAL) (default 1)
2. 拷貝證書生成腳本
[root@k8s-master ssl]# cat > ca-config.json < { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF [root@k8s-master ssl]# cat > ca-csr.json < { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing", "O": "k8s", "OU": "System" } ] } EOF //引入剛才創建的證書籤名文件導入到json中,生成ca證書 [root@k8s-master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 2018/05/17 09:42:36 [INFO] generating a new CA key and certificate from CSR 2018/05/17 09:42:36 [INFO] generate received request 2018/05/17 09:42:36 [INFO] received CSR 2018/05/17 09:42:36 [INFO] generating key: rsa-2048 2018/05/17 09:42:37 [INFO] encoded CSR 2018/05/17 09:42:37 [INFO] signed certificate with serial number 5977604747865604906008868091874540878101817576 [root@k8s-master ssl]# cat > server-csr.json < { "CN": "kubernetes", "hosts": [ "127.0.0.1", "192.168.168.91", "192.168.168.92", "192.168.168.93", "10.10.10.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF //引用剛才配置文件,生成server證書 [root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server 2018/05/17 09:48:38 [INFO] generate received request 2018/05/17 09:48:38 [INFO] received CSR 2018/05/17 09:48:38 [INFO] generating key: rsa-2048 2018/05/17 09:48:38 [INFO] encoded CSR 2018/05/17 09:48:38 [INFO] signed certificate with serial number 524139292034260252183231282762952629821338832583 2018/05/17 09:48:38 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). [root@k8s-master ssl]# cat > admin-csr.json < { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF //計算節點訪問控制節點api通信所以使用的證書,通過攜帶證書訪問集群 [root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin 2018/05/17 09:50:23 [INFO] generate received request 2018/05/17 09:50:23 [INFO] received CSR 2018/05/17 09:50:23 [INFO] generating key: rsa-2048 2018/05/17 09:50:23 [INFO] encoded CSR 2018/05/17 09:50:23 [INFO] signed certificate with serial number 174743345194288503588728187075883698358392239997 2018/05/17 09:50:23 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). //admin 證書是用於管理員訪問集群的證書 [root@k8s-master ssl]# cat > kube-proxy-csr.json < { "CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF [root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy 2018/07/20 10:16:05 [INFO] generate received request 2018/07/20 10:16:05 [INFO] received CSR 2018/07/20 10:16:05 [INFO] generating key: rsa-2048 2018/07/20 10:16:05 [INFO] encoded CSR 2018/07/20 10:16:05 [INFO] signed certificate with serial number 461289686710155214110401691358255422210193728113 2018/07/20 10:16:05 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). [root@k8s-master ssl]# ls | grep -v pem | xargs -i rm {} //刪除證書以外的json文件,只保留pem證書 7.2.3 k8s集群部署-Etcd集群 1.創建etcd配置文件目錄 [root@k8s-master ssl]# mkdir /opt/kubernetes [root@k8s-master ssl]# mkdir /opt/kubernetes/{bin,cfg,ssl} 2.解壓etcd軟件包並拷貝二進制bin文件 [root@k8s-master ~]# tar zxf etcd-v3.2.12-linux-amd64.tar.gz [root@k8s-master ~]# cd etcd-v3.2.12-linux-amd64/ [root@k8s-master etcd-v3.2.12-linux-amd64]# mv etcd /opt/kubernetes/bin/ [root@k8s-master etcd-v3.2.12-linux-amd64]# mv etcdctl /opt/kubernetes/bin/ 3.配置etcd集群 1)部署k8s-master主etcd節點 //創建etcd配置文件 [root@k8s-master etcd-v3.2.12-linux-amd64]# vim /opt/kubernetes/cfg/etcd #[Member] ETCD_NAME="etcd01" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.168.91:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.168.91:2379" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.168.91:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.168.91:2379" ETCD_INITIAL_CLUSTER="etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" //創建腳本配置文件 [root@k8s-master etcd-v3.2.12-linux-amd64]# 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/kubernetes/cfg/etcd ExecStart=/opt/kubernetes/bin/etcd \\ --name=${ETCD_NAME} \\ --data-dir=${ETCD_DATA_DIR} \\ --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \\ --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \\ --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \\ --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \\ --initial-cluster=${ETCD_INITIAL_CLUSTER} \\ --initial-cluster-token=${ETCD_INITIAL_CLUSTER} \\ --initial-cluster-state=new \\ --cert-file=/opt/kubernetes/ssl/server.pem \\ --key-file=/opt/kubernetes/ssl/server-key.pem \\ --peer-cert-file=/opt/kubernetes/ssl/server.pem \\ --peer-key-file=/opt/kubernetes/ssl/server-key.pem \\ --trusted-ca-file=/opt/kubernetes/ssl/ca.pem \\ --peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target //拷貝etcd啟動所依賴的證書 [root@k8s-master etcd-v3.2.12-linux-amd64]# cd /root/software [root@k8s-master software]# cp ssl/server*pem ssl/ca*.pem /opt/kubernetes/ssl/ //啟動etcd主節點,主節點啟動會卡頓,直接ctrl +c 終止即可 [root@k8s-master software]# systemctl start etcd [root@k8s-master software]# systemctl enable etcd Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service. //查看etcd啟動結果 [root@k8s-master software]# ps -ef | grep etcd root 30447 1 1 10:18 ? 00:00:00 /opt/kubernetes/bin/etcd --name=etcd01 --data-dir=/var/lib/etcd/default.etcd --listen-peer-urls=https://192.168.168.91:2380 --listen-client-urls=https://192.168.168.91:2379,http://127.0.0.1:2379 --advertise-client-urls=https://192.168.168.91:2379 --initial-advertise-peer-urls=https://192.168.168.91:2380 --initial-cluster=etcd01=https://192.168.168.91:2380etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380 --initial-cluster-token=etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380 --initial-cluster-state=new --cert-file=/opt/kubernetes/ssl/server.pem --key-file=/opt/kubernetes/ssl/server-key.pem --peer-cert-file=/opt/kubernetes/ssl/server.pem --peer-key-file=/opt/kubernetes/ssl/server-key.pem --trusted-ca-file=/opt/kubernetes/ssl/ca.pem --peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem root 30471 29612 0 10:18 pts/4 00:00:00 grep --color=auto etcd 2)部署k8s-node1、k8s-node2 etcd從節點 //拷貝etcd配置文件到計算節點主機,然後修改對應的主機ip [root@k8s-master ~]# rsync -avcz /opt/kubernetes/* 192.168.168.92:/opt/kubernetes/ [root@k8s-node1 ~]# vim /opt/kubernetes/cfg/etcd #[Member] ETCD_NAME="etcd02" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.168.92:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.168.92:2379" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.168.92:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.168.92:2379" ETCD_INITIAL_CLUSTER="etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" [root@k8s-master ~]# rsync -avcz /opt/kubernetes/* 192.168.168.93:/opt/kubernetes/ [root@k8s-node2 ~]# vim /opt/kubernetes/cfg/etcd
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.168.93:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.168.93:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.168.93:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.168.93:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
//拷貝啟動腳本文件
[root@k8s-master ~]# scp /usr/lib/systemd/system/etcd.service 192.168.168.92:/usr/lib/systemd/system/
[root@k8s-master ~]# scp /usr/lib/systemd/system/etcd.service 192.168.168.93:/usr/lib/systemd/system/
//啟動node節點etcd
[root@k8s-node1 ~]# systemctl start etcd
[root@k8s-node2 ~]# systemctl start etcd
//添加etcd命令全局環境變量
[root@k8s-master ~]# vim /etc/profile
PATH=$PATH:/opt/kubernetes/bin
[root@k8s-master ~]# source /etc/profile
//查看etcd集群部署狀況
[root@k8s-master ssl]# cd /root/software/ssl/
[root@k8s-master ssl]# etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.168.91:2379,https://192.168.168.92:2379,https://192.168.168.93:2379" cluster-health
member d98aeda9406262e is healthy: got healthy result from https://192.168.168.93:2379
member 4fd8139c55484b86 is healthy: got healthy result from https://192.168.168.91:2379
member 846eaeba5ec817ba is healthy: got healthy result from https://192.168.168.92:2379
cluster is healthy
至此完成k8s-etcd集群部署。
閱讀更多 運維小周的vlog 的文章