天天看點

Kubernetes全棧架構師(Kubeadm高可用安裝k8s叢集)--學習筆記

k8s高可用架構解析

Kubeadm基本環境配置

Kubeadm系統及核心更新

Kubeadm基本元件安裝

Kubeadm高可用元件安裝

Kubeadm叢集初始化

高可用Master及Token過期處理

Kubeadm Node及Calico節點配置

Dashboard&Metrics Server安裝

Kubernetes全棧架構師(Kubeadm高可用安裝k8s叢集)--學習筆記

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硬碟

Kubernetes全棧架構師(Kubeadm高可用安裝k8s叢集)--學習筆記

安裝完成後啟動并通過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/

Kubernetes全棧架構師(Kubeadm高可用安裝k8s叢集)--學習筆記

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

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