天天看點

Kubernetes全棧架構師(二進制高可用安裝k8s叢集部署篇)--學習筆記

二進制高可用基本配置

二進制系統和核心更新

二進制基本元件安裝

二進制生成證書詳解

二進制高可用及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/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。