天天看點

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

二進制Metrics&Dashboard安裝

二進制高可用叢集可用性驗證

生産環境k8s叢集關鍵性配置

Bootstrapping: Kubelet啟動過程

Bootstrapping: CSR申請和證書頒發原理

Bootstrapping: 證書自動續期原理

安裝CoreDNS

安裝Metrics Server

安裝dashboard

安裝對應版本(推薦)

如果更改了k8s service的網段需要将coredns的serviceIP改成k8s service網段的第十個IP

安裝coredns

安裝最新版CoreDNS(不推薦)

檢視狀态

狀态

強制删除一直處于Terminating的pod

在新版的Kubernetes中系統資源的采集均使用Metrics-server,可以通過Metrics采集節點和Pod的記憶體、磁盤、CPU和網絡的使用率。

安裝metrics server

等待metrics server啟動然後檢視狀态

節點狀态

檢視pod狀态

pod狀态

安裝指定版本dashboard

安裝最新版dashboard

登入dashboard

Dashboard用于展示叢集中的各類資源,同時也可以通過Dashboard實時檢視Pod的日志和在容器中執行一些指令等。

官方GitHub位址:https://github.com/kubernetes/dashboard

可以在官方dashboard檢視到最新版dashboard

建立管理者使用者

執行

在谷歌浏覽器(Chrome)啟動檔案中加入啟動參數,用于解決無法通路Dashboard的問題,因為使用的證書是自簽名(屬性->快捷方式->目标,粘貼到最後)

更改dashboard的svc為NodePort:

修改 type: ClusterIP 為 type:NodePort

修改完成之後會暴露一個端口号,檢視端口号:

端口号

根據自己的執行個體端口号,通過任意安裝了kube-proxy的主控端或者VIP的IP+端口即可通路到dashboard:通路Dashboard:https://192.168.232.236:31874(請更改18282為自己的端口),選擇登入方式為令牌(即token方式)

檢視token值:

token值

安裝busybox

Pod必須能解析Service

Pod必須能解析跨namespace的Service

每個節點都必須要能通路Kubernetes的kubernetes svc 443和kube-dns的service 53

Pod和Pod之前要能通(同namespace能通信、跨namespace能通信、跨機器能通信)

叢集安裝成功後預設的kubernetes server

每個節點都必須要能通路Kubernetes的kubernetes svc 443和kube-dns的service 53(發送鍵輸入到所有的會話)

Pod和Pod之前要能通(同namespace能通信、跨namespace能通信、跨機器能通信)(取消發送鍵輸入到所有的會話)

建立一個帶有三個副本的deployment

docker配置

controller-manager配置

kubelet配置

kubelet-conf.yml

安裝總結

(發送鍵輸入到所有的會話)

更新配置

注釋新版本已經預設配置,設定證書過期時間

(發送鍵輸入到所有的會話,取消node節點)

k8s預設加密方式會被識别為漏洞,需要修改加密方式

kubelet下載下傳鏡像的deadline,避免重複循環加載

檢視日志

驗證

kubeadm

二進制

自動化安裝

安裝需要注意的細節

Master節點安裝不需要寫自動化。

添加Node節點,playbook。

上面的細節配置

生産環境中etcd一定要和系統盤分開,一定要用ssd硬碟。

Docker資料盤也要和系統盤分開,有條件的話可以使用ssd硬碟

Bootstrapping:自動為node節點頒發證書

二進制高可用安裝生成證書的時候,我們為每個k8s元件都生成了一個kubeconfig檔案,比如controller-manager.kubeconfig,配置中儲存了apiserver的一些資訊,以及它去連接配接apiserver的證書

kube-controller-manager.service指定了kubeconfig,元件啟動的時候會通過config檔案去連接配接apiserver進行認證,通訊

kube-controller-manager.service和kube-scheduler.service是我們自己頒發證書,但是kubelet不建議通過這種方式,建議使用TLS BootStrapping,它會自動地為node節點的kubelet頒發證書,那麼它是如何生成的呢?

使用node02節點舉例

當我們配置一個節點的時候,節點上面是沒有kubelet.kubeconfig檔案的,它是通過bootstrap-kubelet.kubeconfig與apiserver進行互動,然後自動申請了一個kubelet.kubeconfig檔案,kubelet啟動的時候如果缺少kubelet.kubeconfig檔案,就會這樣申請

删除kubelet.kubeconfig

檢視kubelet配置檔案

在配置中可以看到指定了bootstrap-kubeconfig檔案

指定了kubeconfig檔案,但是這個檔案是沒有的,kubelet啟動的時候會通過前面描述的方式申請一個新的kubelet.kubeconfig

重新開機kubelet,可以看到生成了kubelet.kubeconfig證書,生成之後就可以和apiserver進行互動

TLS BootStrapping 官方文檔:https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#initialization-process

在一個k8s叢集中,工作節點的元件kubelet和kube-proxy需要連接配接master節點的元件,尤其是apiserver。為了確定連接配接是私有的,強烈建議為每一個用戶端配置一個TLS證書在所有的節點上

kubelet啟動過程

查找kubeconfig檔案,檔案一般位于/etc/kubernetes/kubelet.kubeconfig

從kubeconfig檔案中檢索APIServer的URL和證書

然後去和APIServer進行互動

檢視證書

檢視kubelet.kubeconfig證書有效期:

然後使用OpenSSL即可檢視證書過期時間(100年有效期):

官方文檔:https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#bootstrap-initialization

1、 Kubelet啟動

2、 Kubelet檢視kubelet.kubeconfig檔案,假設沒有這個檔案

3、 Kubelet會檢視本地的bootstrap.kubeconfig

4、 Kubelet讀取bootstrap.kubeconfig檔案,檢索apiserver的url和一個token

5、 Kubelet連結apiserver,使用這個token進行認證

a) Apiserver會識别tokenid,apiserver會檢視該tokenid對于的bootstrap的一個secret

secret就是二進制高可用安裝叢集的時候建立的bootstrap.secret.yaml

如果要修改bootstrap.secret.yaml的token-id和token-secret,需要保證 c8ad9c 字元串一緻的,并且位數是一樣的。還要保證上個指令的黃色字型:c8ad9c.2e4d610cf3e7426e與你修改的字元串要一緻

根據字尾c8ad9c找到token

讀取secret中的内容,得到token-id,token-secret

解密token-id,與配置檔案kubectl config中的token=c8ad9c.2e4d610cf3e7426e的字首一緻

解密token-secret,與配置檔案kubectl config中的token=c8ad9c.2e4d610cf3e7426e的字尾一緻

驗證通過之後才會進入下一步

b) 找個這個secret中的一個字段auth-extra-groups,apiserver把這個token識别成一個username,名稱是system:bootstrap:,屬于system:bootstrappers這個組,這個組具有申請csr的權限,該組的權限綁定在一個叫system:node-bootstrapper的clusterrole

解密auth-extra-groups查詢組名

clusterrole是k8s叢集級别的權限控制,它作用整個k8s叢集

clusterrolebinding是叢集權限的綁定,它可以幫某個clusterrole綁定到一個使用者、組或者seviceaccount

檢視clusterrole

檢視system:node-bootstrapper

檢視clusterrolebinding

可以看到clusterrolebinding把一個名為system:node-bootstrapper的ClusterRole綁定到一個名為system:bootstrappers:default-node-token的Group

檢視Group是否一緻,解密auth-extra-groups查詢組名

c) CSR:相當于一個申請表,可以拿着這個申請表去申請我們的證書。

6、 經過上面的認證,kubelet就有了一個建立和檢索CSR的權限

7、 Kubelet為自己建立一個CSR,名稱為kubernetes.io/kube-apiserver-client-kubelet

8、 CSR被允許有兩種方式:

a) K8s管理者使用kubectl手動的頒發證書

b) 如果配置了相關權限,kube-controller-manager會自動同意。

i. Controller-manager有一個CSRApprovingController。他會校驗kubelet發來的csr的username和group是否有建立csr的權限,而且還要驗證簽發着是否是kubernetes.io/kube-apiserver-client-kubelet

ii. Controller-manager同意CSR請求

9、 CSR被同意後,controller-manager建立kubelet的證書檔案

10、 Controller-manager将證書更新至csr的status字段

11、 Kubelet從apiserver獲驗證書

12、 Kubelet從擷取到的key和證書檔案建立kubelet.kubeconfig

13、 Kubelet啟動完成并正常工作

14、 可選:如果配置了自動續期,kubelet會在證書檔案過期的時候利用之前的kubeconfig檔案去申請一個新的證書,相當于續約。

15、 新的證書被同意或簽發,取決于我們的配置

檢視node-autoapprove-certificate-rotation

檢視名為system:certificates.k8s.io:certificatesigningrequests:selfnodeclient的ClusterRole

a) Kubelet建立的CSR是屬于一個組織:system:nodes

b) CN(比如域名):system:nodes:主機名

http://www.kubeasy.com/

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

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。

歡迎轉載、使用、重新釋出,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。