kubeadm方式安裝k8s集群-v1.23.17

彭大帅 2024-07-07 02:22 13次浏览 0 条评论 taohigo.com

O、致謝

感謝寬哥的介紹和分享,讓我逐漸入門k8s,幫助我打開瞭雲原生領域的大門,著有《再也不踩坑的kubernetes實戰指南》、《雲原生Kubernetes全棧架構師實戰》。如果大傢有興趣的話,可以多多瞭解一下寬哥。

感謝k8s官網資料的無私分享。

一、前言

本文主要介紹一下kubeadm方式安裝k8s集群。同時在此之前淺談一下k8s高可用架構,介紹一下各組件作用。

聲明:以下過程都是本人自己親自部署驗證!

二、k8s高可用架構

2.1 k8s高可用架構圖

k8s高可用架構圖

k8s分為Master節點和Node節點,Master節點是控制節點,Node節點是工作節點。其中,Master節點包含kube-apiserver、kube-scheduler、kube-controller-manager、etcd、kubelet、kube-proxy;Node節點包含kubelet、kube-proxy。

關於Master節點和Node節點介紹如下:

1.Master節點-控制節點

指容器編排層,它暴露 API 和接口來定義、 部署容器和管理容器的生命周期。管理集群中的工作節點和 Pod。在生產環境中,控制平面通常跨多臺計算機運行, 一個集群通常運行多個節點,提供容錯性和高可用性。

2.Node節點-工作節點

托管 Pod,而 Pod 就是作為應用負載的組件,是可以在 Kubernetes 中創建和管理的、最小的可部署的計算單元。每個集群至少有一個工作節點。

下面根據Kubernetes 組件進行介紹:

1.Master組件

(1)kube-apiserver

API 服務器是 Kubernetes 控制平面的組件, 該組件負責公開瞭 Kubernetes API,負責處理接受請求的工作。 API 服務器是 Kubernetes 控制平面的前端。

Kubernetes API 服務器的主要實現是 kube-apiserver。 kube-apiserver 設計上考慮瞭水平擴縮,也就是說,它可通過部署多個實例來進行擴縮。 你可以運行 kube-apiserver 的多個實例,並在這些實例之間平衡流量。

(2)etcd

一致且高可用的鍵值存儲,用作 Kubernetes 所有集群數據的後臺數據庫。一般可以安裝在Master節點上,如果資源充足,也可安裝到單獨的服務器上。

(3)kube-scheduler

kube-scheduler 是控制平面的組件, 負責監視新創建的、未指定運行節點node的 Pods, 並選擇節點來讓 Pod 在上面運行。

調度決策考慮的因素包括單個 Pod 及 Pods 集合的資源需求、軟硬件及策略約束、 親和性及反親和性規范、數據位置、工作負載間的幹擾及最後時限。

(4)kube-controller-manager

kube-controller-manager 是控制平面的組件, 負責運行控制器進程。

從邏輯上講, 每個控制器都是一個單獨的進程, 但是為瞭降低復雜性,它們都被編譯到同一個可執行文件,並在同一個進程中運行。

這些控制器包括:

  • 節點控制器(Node Controller):負責在節點出現故障時進行通知和響應
  • 任務控制器(Job Controller):監測代表一次性任務的 Job 對象,然後創建 Pods 來運行這些任務直至完成
  • 端點分片控制器(EndpointSlice controller):填充端點分片(EndpointSlice)對象(以提供 Service 和 Pod 之間的鏈接)。
  • 服務賬號控制器(ServiceAccount controller):為新的命名空間創建默認的服務賬號(ServiceAccount)

(5)kubelet

kubelet 會在集群中每個節點(node)上運行。 它保證容器containers都運行在 Pod 中。這裡之所以放在Master節點組件裡面,客觀上說Master也屬於node。

kubelet 接收一組通過各類機制提供給它的 PodSpecs, 確保這些 PodSpecs 中描述的容器處於運行狀態且健康。 kubelet 不會管理不是由 Kubernetes 創建的容器。

(6)kube-proxy

kube-proxy是集群中每個節點(node)上所運行的網絡代理, 實現 Kubernetes 服務(Service)概念的一部分。

kube-proxy 維護節點上的一些網絡規則, 這些網絡規則會允許從集群內部或外部的網絡會話與 Pod 進行網絡通信。

如果操作系統提供瞭可用的數據包過濾層,則 kube-proxy 會通過它來實現網絡規則。 否則,kube-proxy 僅做流量轉發。

2.Node組件

(1)kubelet

kubelet 會在集群中每個節點(node)上運行。 它保證容器containers都運行在 Pod 中。這裡之所以放在Master節點組件裡面,客觀上說Master也屬於node。

kubelet 接收一組通過各類機制提供給它的 PodSpecs, 確保這些 PodSpecs 中描述的容器處於運行狀態且健康。 kubelet 不會管理不是由 Kubernetes 創建的容器。

(2)kube-proxy

kube-proxy是集群中每個節點(node)上所運行的網絡代理, 實現 Kubernetes 服務(Service)概念的一部分。

kube-proxy 維護節點上的一些網絡規則, 這些網絡規則會允許從集群內部或外部的網絡會話與 Pod 進行網絡通信。

如果操作系統提供瞭可用的數據包過濾層,則 kube-proxy 會通過它來實現網絡規則。 否則,kube-proxy 僅做流量轉發。

2.2 k8s高可用架構分析

這裡負載均衡采用KeepAlived和HAProxy實現高可用,當然瞭,你也可以使用公有雲的負載均衡和F5實現高可用。當采用KeepAlived和HAProxy實現高可用時,會虛擬出一個VIP,用於組件之間的交互。

當kube-scheduler、kube-controller-manager、kubelet、kube-proxy組件想訪問kube-apiserver時,必須要經過負載均衡再進行訪問kube-apiserver,從而實現瞭高可用。

針對etcd組件,隻有kube-apiserver組件才能與其進行交互,kube-scheduler、kube-controller-manager、kubelet、kube-proxy組件不能直接與etcd組件進行交互。

三、k8s集群安裝方式對比

一般我們可以使用兩種方式來安裝k8s集群:Kubeadm方式和二進制方式。

關於二者區別說明如下:

1.安裝方式不同:使用 kubeadm 創建的 Kubernetes 集群是使用預先打包好的二進制文件安裝的,而使用二進制安裝則需要手動下載和安裝二進制文件。

2.部署步驟不同:使用 kubeadm 部署 Kubernetes 集群可以更加自動化,且容易維護,而使用二進制安裝則需要手動配置一些組件,需要更多的部署步驟。

3.可維護性不同:使用 kubeadm 部署的 Kubernetes 集群可以使用 kubeadm 工具進行維護,如升級和添加節點,更加方便,而使用二進制安裝則需要手動管理和維護。

4.社區支持不同:kubeadm 是 Kubernetes 的官方工具,有更好的社區支持,可以獲得更多的文檔和幫助,而使用二進制安裝則需要更多的自學和實踐。

四、kubeadm高可用安裝k8s集群

官網參考:利用 kubeadm 創建高可用集群

4.1 安裝及優化

4.1.1 基本環境配置

1.環境介紹

(1)高可用Kubernetes集群規劃

主機名 IP地址 說明
k8s-master01 192.168.1.31/24 master節點
k8s-master02 192.168.1.32/24 master節點
k8s-master03 192.168.1.33/24 master節點
k8s-node01 192.168.1.34/24 node節點
k8s-node02 192.168.1.35/24 node節點
k8s-master-vip 192.168.1.38/24 keepalived虛擬IP

(2)網段規劃

網段名稱 網段劃分
宿主機網段 192.168.1.0/24
Pod網段 172.16.0.0/12
Service網段 10.0.0.0/16

(3)虛擬機規劃

采用三Master兩Node,4核4G+磁盤40G+40G

2.配置信息

配置信息 備註
系統版本 Centos7.9
Docker版本 20.10x
Kubeadm版本 v1.23.17

$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ docker --version
Docker version 20.10.21, build baeda1f
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.17", GitCommit:"953be8927218ec8067e1af2641e540238ffd7576", GitTreeState:"clean", BuildDate:"2023-02-22T13:33:14Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"}