k8s高可用架構解析
Kubeadm基本環境配置
Kubeadm系統及核心更新
Kubeadm基本元件安裝
Kubeadm高可用元件安裝
Kubeadm叢集初始化
高可用Master及Token過期處理
Kubeadm Node及Calico節點配置
Dashboard&Metrics Server安裝

Etcd Cluster:鍵值資料庫,存放k8s的資料,比如我們建立的資源,所做的變更
Master:控制節點,控制整個叢集
Node:主要用來跑pod和容器
Kube-APIServer:它是整個k8s的控制大腦,所有的流量都會經過APIServer
ControllerManager:叢集的控制器
Scheduler:叢集的排程器,控制pod排程到哪一個node節點
Load Balancer:負載均衡,一般使用nginx + keepalived,或者keepalived + haproxy,如果有硬體資源如f5,就不需要Load Balancer,通過虛拟IP連接配接
Kubeadm 是官方推薦的安裝方式,但是生産環境推薦使用二進制的方式安裝
Kubeadm 證書的有效期是一年,因為官方建議運作一年的過程中必須要更新一次
主機名
IP位址
說明
k8s-master01 ~ 03
192.168.232.128 ~ 130
master節點 * 3
k8s-master-lb
192.168.232.236
keepalived虛拟IP
k8s-node01 ~ 02
192.168.232.131 ~ 132
worker節點 * 2
配置資訊
備注
Pod網段
172.168.0.0/12
Service網段
10.96.0.0/12
VIP(虛拟IP)不要和公司内網IP重複,首先去ping一下,不通才可用。VIP需要和主機在同一個區域網路内
公有雲上搭建VIP是公有雲的負載均衡的IP,比如阿裡雲的内網SLB的位址,騰訊雲内網ELB的位址
環境搭建
靜态ip設定
節點配置
不要使用帶中文的伺服器和克隆的虛拟機
安裝虛拟機:https://www.cnblogs.com/mr-xiong/p/12468280.html
下載下傳centos-7鏡像:https://zhuanlan.zhihu.com/p/104118123
三台master節點,兩台node節點,每台虛拟機配置設定2核2G,存儲使用20G硬碟
安裝完成後啟動并通過Xshell 7連接配接五台虛拟機
Xshell 7下載下傳位址:https://downloadly.net/2020/15/4832/03/xmanager/01/?#/4832-netsaran-122140071106.html
使用Xshell 7可以同時發送指令到所有會話,菜單欄--工具--發送鍵輸入到所有會話
通過 VMware 菜單欄編輯,虛拟網絡編輯器檢視子網位址,192.168.232.0
打開目錄
修改檔案 ifcfg-ens33
重新開機網絡服務
檢視目前IP位址
根據叢集規劃分别設定五台虛拟機靜态ip,設定完成後使用 Xshell 7 連接配接到五台虛拟機
Xshell 7 切換tab快捷鍵:ctrl + tab
所有節點配置hosts,修改/etc/hosts如下:
CentOS 7安裝yum源如下:
必備工具安裝
所有節點關閉防火牆、selinux、dnsmasq、swap。伺服器配置如下:
檢視config檔案,SELINUX被設為disabled
關閉swap分區
注釋後重新開機伺服器,swap分區就不會再打開
安裝ntpdate,保證五台伺服器時間一緻,雲伺服器不需要
所有節點同步時間。時間同步配置如下:
所有節點配置limit:
設定limit永久生效
取消發送鍵輸入到所有會話
Master01節點免密鑰登入其他節點,安裝過程中生成配置檔案和證書均在Master01上操作,叢集管理也在Master01上操作,阿裡雲或者AWS上需要單獨一台kubectl伺服器。密鑰配置如下:
下載下傳安裝所有的源碼檔案:
無法下載下傳的可以通過本地拉取壓縮再上傳到伺服器
yum安裝zip
解壓檔案
所有節點(發送鍵輸入到所有會話)更新系統并重新開機,此處更新沒有更新核心,下節會單獨更新核心:
推薦centos7,因為CentOS8在2021年停止維護,而centos7到2024年才停止維護
重新開機完成之後,檢視版本(CentOS Linux release 7.9.2009 (Core))
檢視核心版本
核心3.10版本使用docker會有一些bug,需要更新
CentOS7 需要更新核心至4.18+,本地更新的版本為4.19
在master01節點(取消發送鍵輸入到所有會話)下載下傳核心:
從master01節點傳到其他節點:
所有節點(發送鍵輸入到所有會話)安裝核心
所有節點更改核心啟動順序,因為預設是3.10的
檢查預設核心是不是4.19
所有節點重新開機,然後檢查核心是不是4.19
所有節點安裝ipvsadm:
所有節點配置ipvs子產品,在核心4.19+版本nf_conntrack_ipv4已經改為nf_conntrack, 4.18以下使用nf_conntrack_ipv4即可:
加載配置
開啟一些k8s叢集中必須的核心參數,所有節點配置k8s核心:
所有節點配置完核心後,重新開機伺服器,保證重新開機後核心依舊加載
檢查是否加載
所有節點安裝Docker-ce 19.03,不需要太新,這是官方已經經過驗證的版本
由于新版kubelet建議使用systemd,是以可以把docker的CgroupDriver改成systemd
所有節點設定開機自啟動Docker:
檢視docker版本(Server Version: 19.03.15,Cgroup Driver: systemd)
檢視k8s最新版本(取消發送鍵輸入到所有會話):
最新版本是1.21.2-0,但是推薦小版本大于5才使用,是以安裝1.20版本
所有節點(發送鍵輸入到所有會話)安裝最新版本kubeadm:
預設配置的pause鏡像使用gcr.io倉庫,國内可能無法通路,是以這裡配置Kubelet使用阿裡雲的pause鏡像:
設定Kubelet開機自啟動:
如果不是高可用叢集,haproxy和keepalived無需安裝
公有雲要用公有雲自帶的負載均衡,比如阿裡雲的SLB,騰訊雲的ELB,用來替代haproxy和keepalived,因為公有雲大部分都是不支援keepalived的
如果用阿裡雲的話,kubectl控制端不能放在master節點,因為阿裡雲的slb有回環的問題,也就是slb代理的伺服器不能反向通路SLB,推薦使用騰訊雲,騰訊雲修複了這個問題。
所有Master節點(node節點取消發送鍵輸入到所有會話)通過yum安裝HAProxy和KeepAlived:
所有Master節點配置HAProxy(詳細配置參考HAProxy文檔,所有Master節點的HAProxy配置相同):
删除所有内容
添加以下内容,注意首行global是否複制完整
所有Master節點配置KeepAlived,配置不一樣,注意每個節點的IP和網卡(interface參數)
檢視網卡名稱(ens33)
如果網卡名稱不是ens33,不要把配置檔案中的網卡配置替換
Master01節點的配置:
添加以下内容,注意首行是否複制完整
Master02節點的配置:
Master03節點的配置:
所有master節點(發送鍵輸入到所有會話,取消node節點)配置KeepAlived健康檢查檔案:
我們通過KeepAlived虛拟出來一個VIP,VIP會配置到一個master節點上面,它會通過haproxy暴露的16443的端口反向代理到我們的三個master節點上面,是以我們可以通過VIP的位址加上16443通路到我們的API server
健康檢查會檢查haproxy的狀态,三次失敗就會将KeepAlived停掉,停掉之後KeepAlived會跳到其他的節點
添權重限
啟動haproxy
檢視端口(16443)
啟動keepalived
檢視系統日志(Sending gratuitous ARP on ens33 for 192.168.232.236)
檢視ip
可以看到192.168.232.236綁定到了master01,其他兩個節點是沒有的
測試VIP
如果ping不通且telnet沒有出現 ] ,則認為VIP不可以,不可在繼續往下執行,需要排查keepalived的問題
比如防火牆和selinux,haproxy和keepalived的狀态,監聽端口等
所有節點檢視防火牆狀态必須為disable和inactive:systemctl status firewalld
所有節點檢視selinux狀态,必須為disable:getenforce
master節點檢視haproxy和keepalived狀态:systemctl status keepalived haproxy
master節點檢視監聽端口:netstat -lntp
官方初始化文檔:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
在生産環境中有些配置需要修改,因為使用預設的配置可能會導緻網段沖突,是以我們使用配置檔案的形式初始化
發送鍵輸入到所有會話
Master01節點建立 kubeadm-config.yaml 配置檔案如下:
Master01:(# 注意,如果不是高可用叢集,192.168.232.236:16443改為master01的位址,16443改為apiserver的端口,預設是6443,注意更改v1.18.5自己伺服器kubeadm的版本:kubeadm version)
以下檔案内容,主控端網段、podSubnet網段、serviceSubnet網段不能重複,具體看前面的高可用Kubernetes叢集規劃
更新kubeadm檔案
檢視kubeadm版本(GitVersion:"v1.20.8")
将配置檔案中的 kubernetesVersion: v1.20.0 改為一緻的 kubernetesVersion: v1.20.8
node節點取消發送鍵輸入到所有會話
将new.yaml檔案複制到其他master節點,之後所有Master節點提前下載下傳鏡像,可以節省初始化時間:
因為配置了阿裡雲鏡像(imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers),是以下載下傳速度比預設使用的gcr鏡像快,國内通路不了gcr鏡像
因為配置了token過期時間(ttl: 24h0m0s),是以可能出現今天生成token,明天加入不了叢集的問題
同時master節點為我們配置了一個污點(taints),這個污點可以讓我們的mater不部署容器
criSocket就是通過哪一個socket連接配接我們的docker,dockershim在k8s 1.20版本廢棄,官方不維護,後期可能有人會維護,也可以改成其他cri的runtime
Master01節點(取消發送鍵輸入到所有會話)初始化,初始化以後會在/etc/kubernetes目錄下生成對應的證書和配置檔案,之後其他Master節點加入Master01即可:
kubeadm 的配置管理是通過 pod 管理的,所有的元件都是通過容器啟動的,通過 /etc/kubernetes/manifests 目錄下面的 yaml 檔案啟動,這就是 kubelet 生命周期管理的目錄,在這裡面配置一個 pod 的 yaml 檔案,它就會為你管理 pod 的生命周期
進入到該目錄中
可以看到以下檔案
kubeadm 與二進制安裝不一樣的地方在于它的配置管理都在 yaml 檔案中,可以編輯檔案檢視,二進制是一個單獨的server檔案,如果更改了配置,千萬不要手動讓它生效,kubelet 會自動幫我們加載配置,重新開機容器
如果初始化失敗,重置後再次初始化,指令如下:
初始化成功以後,會産生Token值,用于其他節點加入時使用,是以要記錄下初始化成功生成的token值(令牌值):
Master01節點配置環境變量,用于通路Kubernetes叢集:
管理叢集的指令 kubectl 隻需要在一個節點上面有就可以,這個節點可以是 k8s 節點,也可以不是,它就是通過 admin.conf 檔案和 k8s 通訊的,檔案中定義了一個變量 KUBECONFIG,指定了檔案的位址,然後我們就可以操作我們的叢集了
檢視節點狀态:
可以看到它添加了一個規則 control-plane
檢視server:
可以看到以下的server
采用初始化安裝方式,所有的系統元件均以容器的方式運作并且在kube-system命名空間内,生産環境建議建立一個namespaces
此時可以檢視Pod狀态:
可以看到以下的pod
注意:以下步驟是上述init指令産生的Token過期了才需要執行以下步驟,如果沒有過期不需要執行
Token過期後生成新的token:
Master需要生成--certificate-key
Token沒有過期直接執行Join
初始化master02加入叢集
在master01檢視其他節點
可以看到master02節點
嘗試重新生成token
替換參數,初始化master03加入叢集
可以在master01檢視新生成的token
這就是新生成的token
檢視token内容:
可以看到過期時間(這是通過base64加密的):
解密一下:
可以看到解密後的時間
Node節點上主要部署公司的一些業務應用,生産環境中不建議Master節點部署系統元件之外的其他Pod,測試環境可以允許Master節點部署Pod以節省系統資源。
初始化node01,node02加入叢集(與master相比,不需要control-plane)
所有節點初始化完成後,檢視叢集狀态
可以看到所有節點
以下步驟隻在master01執行
如果是本地下載下傳上傳的話需要現在本地切換分支再上傳
修改calico-etcd.yaml的以下位置:
修改etcd的節點
使用預設配置
把 etcd_key 放到 secret 裡面,secret 會挂載到 calico 容器的 pod 裡面,挂載的名稱就是 ETCD_CA,這樣 calico 就能找到證書,就可以連接配接到 etcd,就可以把 pod 資訊存儲到 etcd 裡面
修改 pod 網段
注意下面的這個步驟是把calico-etcd.yaml檔案裡面的CALICO_IPV4POOL_CIDR下的網段改成自己的Pod網段,也就是把192.168.x.x/16改成自己的叢集網段,并打開注釋,是以更改的時候請確定這個步驟的這個網段沒有被統一替換掉,如果被替換掉了,還請改回來:
檢查檔案:
可以看到 etcd-key 已經導入進來,它就是把證書 /etc/kubernetes/pki/etcd/ca.crt 讀取出來,再經過 base64 加密,再填到這個位置
安裝 calico
檢視容器狀态
成功運作
目前用的是阿裡雲的鏡像,生産環境需要推薦使用自己的鏡像倉庫,這樣速度更快
在新版的Kubernetes中系統資源的采集均使用Metrics-server,可以通過Metrics采集節點和Pod的記憶體、磁盤、CPU和網絡的使用率。
github 位址:https://github.com/kubernetes-sigs/metrics-server
檢視yaml檔案配置
添加了證書,不然可能導緻擷取不到度量名額
鏡像位址也修改為阿裡雲
将Master01節點的front-proxy-ca.crt複制到所有Node節點
安裝metrics server
檢視狀态
顯示CPU狀态,記憶體使用量
Dashboard用于展示叢集中的各類資源,同時也可以通過Dashboard實時檢視Pod的日志和在容器中執行一些指令等。
github 位址:https://github.com/kubernetes/dashboard
可以看到隻修改了鏡像位址
注意:所有的鏡像包括caclico, coredns, etcd等等都要放到自己公司内部的鏡像倉庫,這樣釋出、更新、故障恢複的速度更快
安裝
如果需要通路最新版本可以通路官方github擷取連接配接,但是沒必要安裝最新
建立管理者使用者vim admin.yaml
應用
在谷歌浏覽器(Chrome)啟動檔案中加入啟動參數,用于解決無法通路Dashboard的問題
右鍵--屬性--快捷方式--目标
更改dashboard的svc為NodePort:
将ClusterIP更改為NodePort(如果已經為NodePort忽略此步驟)
檢視端口号:
端口号為10.99.156.65
檢視容器是否啟動完成
根據自己的執行個體端口号,通過任意安裝了kube-proxy的主控端或者VIP的IP+端口即可通路到dashboard:
通路Dashboard:https://192.168.232.236:32272(請更改32272為自己的端口),選擇登入方式為令牌(即token方式)
也可以通過主控端的ip通路:https://192.168.232.128:32272
檢視端口占用
占用情況
可以看到 NodePort 所做的事情就是在主控端上啟動一個端口号 32272,這個端口号會對應到 dashboard,每一台伺服器都會啟動這個端口,都可以通路到 dashboard
檢視token值:
得到token值:
将token值輸入到令牌後,單擊登入即可通路Dashboard
切換 namespace 到 kube-system
将Kube-proxy改為ipvs模式,因為在初始化叢集的時候注釋了ipvs配置,是以需要自行修改一下:
在master01節點執行
搜尋定位到mode
修改為 ipvs
儲存退出:shift + z + z
更新 Kube-Proxy 的 Pod:
檢視 pod 滾動更新
可以看到新起的是在 master03
在 master03 驗證 Kube-Proxy 模式,接着可以在所有伺服器驗證一下
kubeadm安裝的叢集,證書有效期預設是一年。master節點的kube-apiserver、kube-scheduler、kube-controller-manager、etcd都是以容器運作的。可以通過kubectl get po -n kube-system檢視。
kubelet的配置檔案在/etc/sysconfig/kubelet和/var/lib/kubelet/config.yaml,修改後需要重新開機kubelet程序
其他元件的配置檔案在/etc/kubernetes/manifests目錄下,比如kube-apiserver.yaml,該yaml檔案更改後,kubelet會自動重新整理配置,也就是會重新開機pod。不能再次建立該檔案
kube-proxy的配置在kube-system命名空間下的configmap中,可以通過
進行更改,更改完成後,可以通過patch重新開機kube-proxy
Kubeadm安裝後,master節點預設不允許部署pod,會占用資源,在學習過程中可以通過以下方式打開:
檢視Taints:
可以看到三個污點
删除Taint:
http://www.kubeasy.com/
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。
歡迎轉載、使用、重新釋出,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。