二進制高可用基本配置
二進制系統和核心更新
二進制基本元件安裝
二進制生成證書詳解
二進制高可用及etcd配置
二進制K8s元件配置
二進制使用Bootstrapping自動頒發證書
二進制Node節點及Calico配置
k8s高可用架構解析,高可用Kubernetes叢集規劃,設定靜态ip,請參考上一篇文章
配置所有節點hosts檔案(發送鍵輸到入所有會話)
host節點主要是控制節點使用,控制節點下載下傳一些檔案,然後通過sskey傳到其他的節點上面
CentOS 7安裝yum源如下:
必備工具安裝
所有節點關閉firewalld 、dnsmasq、selinux(CentOS7需要關閉NetworkManager,CentOS8不需要)
所有節點關閉swap分區,fstab注釋swap
所有節點同步時間
安裝ntpdate
所有節點同步時間。時間同步配置如下:
檢查時間
加入到crontab
所有節點配置limit:
Master01節點(取消發送鍵輸到入所有會話)免密鑰登入其他節點,安裝過程中生成配置檔案和證書均在Master01上操作,叢集管理也在Master01上操作,阿裡雲或者AWS上需要單獨一台kubectl伺服器。密鑰配置如下:
Master01配置免密碼登入其他節點
所有節點安裝基本工具(發送鍵輸到入所有會話)
Master01下載下傳安裝檔案(取消發送鍵輸到入所有會話)
無法下載下傳的可以通過本地拉取壓縮再上傳到伺服器
yum安裝zip
解壓檔案
所有節點(發送鍵輸到入所有會話)更新系統并重新開機,此處更新沒有更新核心,下節會單獨更新核心:
CentOS7 需要更新核心至4.18+,本地更新的版本為4.19
在master01節點(取消發送鍵輸入到所有會話)下載下傳核心:
從master01節點傳到其他節點:
所有節點安裝核心(發送鍵輸到入所有會話)
所有節點更改核心啟動順序
檢查預設核心是不是4.19
所有節點重新開機,然後檢查核心是不是4.19
所有節點安裝ipvsadm(實作負載均衡):
所有節點配置ipvs子產品,在核心4.19+版本nf_conntrack_ipv4已經改為nf_conntrack, 4.18以下使用nf_conntrack_ipv4即可:
然後執行
檢查是否加載(需要重新開機後才可以加載):
開啟一些k8s叢集中必須的核心參數,所有節點配置k8s核心:
net.ipv4.ip_forward 不打開的話跨主機通訊不了
所有節點配置完核心後,重新開機伺服器,保證重新開機後核心依舊加載
Docker安裝
K8s及etcd安裝
所有節點安裝Docker-ce 19.03(官方推薦)
由于新版kubelet建議使用systemd,是以可以把docker的CgroupDriver改成systemd
所有節點設定開機自啟動Docker:
Master01(取消發送鍵輸入到所有的會話)下載下傳kubernetes安裝包
通路官網擷取最新版本:https://github.com/kubernetes/kubernetes
進入CHANGELOG目錄,點選 CHANGELOG-1.20.md,再點選 Server Binaries,可以看到目前最新的是1.20.9,點選 kubernetes-server-linux-amd64.tar.gz 進行下載下傳,如果有更新的版本需要下載下傳最新的 1.20.x 版本
如果下載下傳不了可以通過本地下載下傳再上傳到伺服器
下載下傳etcd安裝包(3.4.13是官方推薦版本,已經經過驗證)
二進制的安裝其實解壓之後就安裝完成了
解壓kubernetes安裝檔案
解壓etcd安裝檔案
版本檢視
将元件發送到其他節點
所有節點建立/opt/cni/bin目錄(發送鍵輸入到所有的會話)
檢視分支(取消發送鍵輸入到所有的會話)
Master01切換到1.20.x分支(其他版本可以切換到其他分支)
etcd證書
k8s元件證書
二進制安裝最關鍵步驟,一步錯誤全盤皆輸,一定要注意每個步驟都要是正确的
Master01下載下傳生成證書工具
所有Master節點建立etcd證書目錄(發送鍵輸入到所有的會話,取消node節點)
所有節點建立kubernetes相關目錄(發送鍵輸入到所有的會話)
Master01節點生成etcd證書(取消發送鍵輸入到所有的會話)
生成證書的CSR檔案:證書簽名請求檔案,配置了一些域名、公司、機關
檢視生成的key
頒發證書
檢視生成證書
生成内容
将證書複制到其他節點
Master01生成kubernetes證書
生成apiserver的用戶端證書
10.96.0.是k8s service的網段,如果說需要更改k8s service網段,那就需要更改10.96.0.1,如果不是高可用叢集,192.168.232.236為Master01的IP
檢視生成的證書
生成apiserver的聚合證書。Requestheader-client-xxx requestheader-allowwd-xxx:aggerator
生成 controller-manage 的證書
生成 scheduler 的證書
生成admin的證書
我們用同樣的指令生成了 admin.kubeconfig,scheduler.kubeconfig,controller-manager.kubeconfig,它們之間是如何區分的?
檢視 admin-csr.json
我們生成的證書會定義一個使用者 admin,它是屬于 system:masters 這個組,k8s 安裝的時候會有一個 clusterrole,它是一個叢集角色,相當于一個配置,它有着叢集最高的管理權限,同時會建立一個 clusterrolebinding,它會把 admin 綁到 system:masters 這個組上,然後這個組上的所有使用者都會有這個叢集的權限
建立ServiceAccount Key -> secret
ServiceAccount 是 k8s 一種認證方式,建立 ServiceAccount 的時候會建立一個與之綁定的 secret,這個 secret 會生成一個 token
發送證書至其他節點
檢視證書檔案(一共23個檔案)
檢視證書過期時間(expiry 過期時間100年)
Etcd配置
高可用配置
etcd生産環境中一定要啟動奇數個節點,不然容易産生腦裂
etcd配置大緻相同,注意修改每個Master節點的etcd配置的主機名和IP位址
注意三個節點的配置是不同的
Master01
Master02
Master03
所有Master節點建立etcd service并啟動(發送鍵輸入到所有的會話,取消node節點)
所有Master節點建立etcd的證書目錄
檢視etcd狀态
狀态
高可用配置(注意:如果不是高可用叢集,haproxy和keepalived無需安裝)
如果在雲上安裝也無需執行此章節的步驟,可以直接使用雲上的lb,比如阿裡雲slb,騰訊雲elb等
公有雲要用公有雲自帶的負載均衡,比如阿裡雲的SLB,騰訊雲的ELB,用來替代haproxy和keepalived,因為公有雲大部分都是不支援keepalived的,另外如果用阿裡雲的話,kubectl控制端不能放在master節點,推薦使用騰訊雲,因為阿裡雲的slb有回環的問題,也就是slb代理的伺服器不能反向通路SLB,但是騰訊雲修複了這個問題。
Slb -> haproxy -> apiserver
所有Master節點安裝keepalived和haproxy
所有Master配置HAProxy,配置一樣(删除預設配置 ggdG 回車)
keepalived
所有Master節點配置KeepAlived,配置不一樣,注意區分
注意每個節點的IP和網卡(interface參數),檢視網卡(ens33)并修改配置檔案
如果公司有其他 keepalived ,注意 virtual_router_id 51 不能重複,它是一個廣播
Master01 keepalived(删除預設配置 ggdG 回車)
Master02 keepalived(删除預設配置 ggdG 回車)
Master03 keepalived(删除預設配置 ggdG 回車)
所有master節點健康檢查配置(發送鍵輸入到所有的會話,取消node節點)
所有master節點啟動haproxy和keepalived
它會有一個選主的過程,然後綁定,這就是 VIP 的作用,它會在三個主節點之間選擇一個進行綁定,當這個節點出現問題的時候,VIP 會綁定到其他節點
檢視 192.168.232.236 綁定情況
VIP測試
重要:如果安裝了keepalived和haproxy,需要測試keepalived是否是正常的
如果ping不通且telnet沒有出現 ],則認為VIP不可以,不可在繼續往下執行,需要排查keepalived的問題,比如防火牆和selinux,haproxy和keepalived的狀态,監聽端口等
所有節點檢視防火牆狀态必須為disable和inactive
所有節點檢視selinux狀态,必須為disable:getenforce
master節點檢視haproxy和keepalived狀态:
master節點檢視監聽端口:
Apiserver
ControllerManager
Scheduler
所有節點建立相關目錄(發送鍵輸入到所有的會話)
所有Master節點建立kube-apiserver service,# 注意,如果不是高可用叢集,192.168.232.236改為master01的位址
Master01配置(取消發送鍵輸入到所有的會話)
注意k8s service網段為10.96.0.0/12,該網段不能和主控端的網段、Pod網段的重複,請按需修改
Master02配置
Master03配置
所有Master節點開啟kube-apiserver(發送鍵輸入到所有的會話,取消node節點)
檢測kube-server狀态
所有Master節點配置kube-controller-manager service
注意k8s Pod網段為172.16.0.0/12,該網段不能和主控端的網段、k8s Service網段的重複,請按需修改
所有Master節點啟動kube-controller-manager
檢視啟動狀态
所有Master節點配置kube-scheduler service
啟動
它可以給 node 節點自動頒發證書,也就是給 keepalived 頒發證書
為什麼這個證書不是手動管理?因為 k8s 主節點可能是固定的,建立好之後一直就是那幾台,但是 node 節點可能變化比較多,如果添加,删除,故障維護節點的時候手動添加會比較麻煩,keepalived 證書和主機名是有綁定的,而我們的主機名又是不一樣的,是以需要有一種機制自動頒發 keepalived 發來的證書請求
在Master01建立bootstrap(取消發送鍵輸入到所有的會話)
注意,如果不是高可用叢集,192.168.232.236:8443改為master01的位址,8443改為apiserver的端口,預設是6443
bootstrap-kubelet.kubeconfig 是一個 keepalived 用來向 apiserver 申請證書的檔案
注意:如果要修改bootstrap.secret.yaml的token-id和token-secret,需要保證 c8ad9c 字元串一緻的,并且位數是一樣的。還要保證上個指令的黃色字型:c8ad9c.2e4d610cf3e7426e與你修改的字元串要一緻
建立配置檔案,缺乏此檔案無法執行 kubectl get node(The connection to the server localhost:8080 was refused),需要将證書複制過來
kubectl 指令隻需要一個節點擁有就可以,這是控制節點,不可以讓每個節點都擁有,這樣非常危險,可以把他放到叢集之外的任何一個節點都可以,并不一定是我們的 k8s 節點,任何一台伺服器與 k8s 相通即可,需要把這個檔案複制過去,就可以通路到我們這個叢集
建立 bootstrap
複制證書
Kubelet配置
kube-proxy配置
node節點使用自動頒發證書的形式配置
Master01節點複制證書至Node節點
所有節點配置kubelet service
所有節點配置kubelet service的配置檔案
建立kubelet的配置檔案
注意:如果更改了k8s的service網段,需要更改kubelet-conf.yml 的clusterDNS:配置,改成k8s Service網段的第十個位址,比如10.96.0.10
啟動所有節點kubelet
檢視系統日志
顯示隻有如下資訊為正常,因為Calico還沒安裝
檢視叢集狀态
叢集狀态NotReady,因為Calico還沒安裝
在Master01執行(取消發送鍵輸入到所有的會話)
如果更改了叢集Pod的網段,需要更改kube-proxy/kube-proxy.conf的clusterCIDR: 172.16.0.0/12參數為pod的網段。
在master01将kube-proxy的systemd Service檔案發送到其他節點
所有節點啟動kube-proxy(發送鍵輸入到所有的會話)
檢視狀态
如果出現如下報錯需要調整一下配置檔案
删除kube-proxy
修改配置
再次執行建立
檢視日志
啟動成功
在master01執行(取消發送鍵輸入到所有的會話)
檢視容器狀态
容器狀态
如果容器狀态異常可以使用kubectl describe 或者logs檢視容器的日志
http://www.kubeasy.com/
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。
歡迎轉載、使用、重新釋出,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。