天天看點

kubernetes(六) 基于kubeadm建構高可用k8s叢集基于kubeadm建構高可用k8s叢集

github位址: https://github.com/kubernetes/kubernetes/

官方網站: kubernets.io

pod使用接口技術

CNI: container network interface

CSI: container storage interface

CRI: container runtime interface

CVI: container volume interface

pod:k8s中運作容器的最小單元

k8s如果向替換CRI的話(替換容器技術),隻需要講POD使用相關的容器技術(docker,podman)封裝即可

service: 實作了從主控端外層通路k8s内部不同的容器的通路方式,還實作了pod的動态發現;是以可以說Service是k8s内部的負載均衡器

實作方式: 早期是iptable,在1.11之後支援ipvs(輪訓算法)

replicationcontroller/deployment: 已廢棄,POD控制器; 通過環境檢測,保證pod的正常運作

master: 主節點

kube-apiserver: https://k8smeetup.github.io/docs/admin/kube-apiserver/

為api對象驗證并配置資料,包括pods,services,APIserver提供Restful操作和到叢集共享狀态的前端,所有其它元件通過apiserver進行互動

kube-scheduler:https://k8smeetup.github.io/docs/admin/kube-scheduler/

具有豐富的資源政策,能夠感覺拓撲變化,支援特定負載的功能元件,它對叢集的可用性,性能表現以及容量都影響巨大,scheduler需要考慮獨立的和集體的資源需求,服務品質需求,硬體、軟體,政策限制,親和與反親和規範,資料位置嗎内部負載接口,截止時間等等,如有特定的負載需求可以通過apiserver暴露出來

kube-controller-manager: https://k8smeetup.github.io/docs/admin/kube-controller-manager/

作為叢集内部的控制中心,負責叢集内部的Node,Pod副本,服務端點,命名空間,服務賬号,資源配額的管理,當某個Node意外當機時,controller-manager會及時發現并執行自動修複,確定叢集始終處于預期的工作狀态

Node節點

kube-proxy: https://k8smeetup.github.io/docs/admin/kube-proxy/

維護node節點上的網絡規則,實作使用者通路請求的轉發,其實就是轉發給service,需要管理者指定service和NodePort的對應關系

Kubernetes 網絡代理運作在 node 上。它反映了 node 上 Kubernetes API 中定義的服務,并可以通過一組後端進行簡單的 TCP、UDP 流轉發或循環模式(round robin))的 TCP、UDP 轉發。目前,服務的叢集 IP 和端口是通過 Docker-links 相容的環境變量發現的,這些環境變量指定了服務代碼打開的端口。有一個可選的 addon 為這些叢集 IP 提供叢集 DNS。使用者必須使用 apiserver API 建立一個服務來配置代理。

kubelet: https://k8smeetup.github.io/docs/admin/kubelet/

kubelet 是運作在每個節點上的主要的“節點代理”,它按照 PodSpec 中的描述工作。 PodSpec 是用來描述一個 pod 的 YAML 或者 JSON 對象。kubelet 通過各種機制(主要通過 apiserver )擷取一組 PodSpec 并保證在這些 PodSpec 中描述的容器健康運作。kubelet 不管理不是由 Kubernetes 建立的容器。

除了來自 apiserver 的 PodSpec ,還有 3 種方式可以将容器清單提供給 kubelet 。

檔案:在指令行指定的一個路徑,在這個路徑下的檔案将被周期性的監視更新,預設監視周期是 20 秒并可以通過參數配置。

HTTP端點:在指令行指定的一個HTTP端點,該端點每 20 秒被檢查一次并且可以通過參數配置檢查周期。

HTTP服務:kubelet 還可以監聽 HTTP 服務并響應一個簡單的 API 來建立一個新的清單

ETCD: 存儲所有叢集資料

元件官網參考: https://kubernetes.io/zh/docs/concepts/overview/components/

角色

主機名

ip位址

軟體

master-1

centos7-node1

192.168.56.11

docker,kube-comtroller-manager,kube-apiserver,kube-schduler

master-2

centos7-node2

192.168.56.12

master-3

centos7-node3

192.168.56.13

ha-1

centos7-node4

192.168.56.14

haproxy,keepalived

ha-2

centos7-node5

192.168.56.15

harbor-1

centos7-node6

192.168.56.16

docker,docker-compose,harbor

node-1

centos7-node7

192.168.56.17

kubelet,kube-proxy

node-2

centos7-node8

192.168.56.18

伺服器使用centos7.6以及以上,配置阿裡雲倉庫

關閉防火牆&selinux&swap

自動更新時間

設定主機名&hosts解析

系統參數優化(ip位址轉發)

開啟ipvs

重新開機伺服器

基礎docker安裝

harbor

建立baseimages鏡像倉庫

haproxy&keepalived

master節點安裝

開啟 master指令補全

通過配置檔案初始化master

安裝網絡插件flannel

建立kubernetes的流程: https://k8smeetup.github.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-workflow

使用2.0.0-rc6版本

通路任意主機的https://192.168.56.12:30002 即可

擷取通路token即可登陸

更新時間: 業務低峰期

更新方式

ansible

kubeadm

更新步驟

在所有master節點進行更新,更新管理斷服務kube-controller-manager,kube-apiserver,kube-scheduler,kube-proxy

檢查可更新的軟體版本

所有master節點都安裝1.17.4的kubeadm

更新master節點的kubectl,kubelet

更新node節點

驗證更新結果

參考用例: https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/

Nginx用例

haproxy和keepalived配置

需要新增一個VIP(LB)

将LB映射到haproxy對應的nodeport上

tomcat配置

測試通路 http://192.168.56.11:8080/app/

在harbor建立linux公開倉庫

準備dockerfile

業務pod建立

nginx代理請求到tomcat