2020年必須掌握的硬核技能k8s

有態度的小碼甲發表於2020-04-28

Kubernetes 是一個軟體系統,使你在數以萬計的電腦節點上執行軟體時就像 所有節點是以單個大節點一樣, 它將底層基礎設施抽象,這樣做同時簡化了應用開發、部署,以及對開發和運維團隊的管理。

Kubernetes叢集架構

Kubernetes叢集由很多節點組成,分為兩大類:

  • 主節點 承載Kubernetes控制和管理整個叢集系統的控制皮膚
  • 工作節點 執行實際部署的應用

控制皮膚

控制叢集並使它工作,包含多個元件(元件單節點或通過副本分別部署到多個主節點以確保高可用)

  • Kubernetes Api Server: 客戶端Kubectl、控制皮膚其他元件和worker節點都需要和它通訊
  • Scheduler: 排程應用
  • Controller Manager: 執行叢集級別功能,如複製元件、持續跟蹤工作節點、處理節點失敗等
  • etcd:可靠的分散式資料庫儲存,能持久化叢集配置

工作節點

執行容器化應用的機器,執行、監控、管理應用服務的任務由下元件完成:

  • Docker、rtk或其他容器型別
  • Kubelet與API Server通訊,並管理它所在節點容器
  • Kube-Proxy:負責元件之間負載均衡網路流量

MiniKube環境& 核心概念

本處window10+Hyper-V搭建minikube本地叢集

這臺虛擬機器既作為master,又作為worker,Kubectl從叢集外部發起管理和控制。

# 因國內極差的網路環境,建議使用阿里雲的映象地址:
minikube start --image-mirror-country=cn --image-repository=http://registry.aliyuncs.com/google_containers  --registry-mirror=https://aq32bn7a.mirror.aliyuncs.com

以管理員許可權執行CMD命令:

  • kubectl: 傳送Restful api 控制Kubernetes叢集管理器
  • Minikube是一個CLI工具,配置、管理(已針對開發流程優化)的單節點Kubernetes叢集

列舉4個核心概念

1. API

Kubernetes API作為宣告式配置方案的基石,API文件中定義了API端點、資源,kubectl命令列工具可操作API物件,物件的序列化物件儲存在etcd中,各元件也是通過API互動。

2. k8s物件

Kubernetes物件代表系統中持久化的實體,下面的實體都作為物件:

  • 哪些容器化應用正在執行
  • 這些應用程式可用的資源
  • 與這些應用程式有關的行為&策略:重新啟動策略、升級和容錯

Kubernetes物件是期望狀態,建立物件之後,你就通知了K8s你希望叢集這樣運作。
大多數K8s物件由spec和status組成:

  • spec:[由你]提供資源的特徵描述
  • status: [系統自行控制] 描述物件當前狀態,由K8s系統元件設定和更新,K8s控制皮膚持續管理物件的實際狀態去匹配你設定的期望狀態

當你建立k8s物件, 你需要提供物件spec來描述預期狀態。 當使用k8s API(或者kubectl),在API請求的body包含json資訊;大多數時給kubectl提供.yaml檔案來代替json,kubectl會將yaml檔案中資訊轉換為json再發起API請求。

下面的kubia-rs.yaml檔案:ReplicaSet物件啟動3個nodejs應用, [spec]定義了此次ReplicaSet的規格

apiVersion: apps/v1
kind: ReplicaSet
metadata: 
 name: kubia-rs
spec:
 replicas: 3
 selector: 
   matchLabels:
     app: kubia
 template:
   metadata: 
     labels: 
       app: kubia
   spec:
     containers:
     - name: kubia
       image: luksa/kubia
       ports:
       - containerPort: 8080
#  對於ReplicaSet囉嗦兩句: 新一代的ReplicationController; 通常不會直接建立ReplicaSet,而是在建立更高階的Deployment資源時自動建立它們。 

3. Pod

Kubernetes Pod是建立/部署k8s物件中最小最簡單的單元:
由於不能將多個程式聚集在一個單獨容器,需要另外一種高階結構將容器繫結在一起,作為一個單元管理,這就是Pod背後根本原理, 一個pod中容器共享相同ip和埠空間。

4. Controller

k8s控制器是一個control loop(監控叢集狀態,在被需要時或主動請求時更新叢集),每個控制器都試圖將當前叢集狀態移動到期望狀態

在機器人和自動化,control loop是一個非終止迴路,用於調節系統狀態,例如房間的空調。
控制器自身可以執行操作,但一般情況下,控制器會將引起連鎖反應的訊息發往api server.

Kubernetes內建了一些控制器: ReplicaSet、Deployment、StatefulSets、DaemonSet、Job...

# k8s deployment檢查容器健康狀態、保證容器數量、還具備部署相關的特性, deployment是管理和縮放容器的推薦控制器
kubectl  create  deployment  hello-kubia  --iamge=luksa/kubia

這4個概念連起來就是:
K8s已經定義了API後設資料,Controller排程K8s系統到指定的 預期狀態(這個預期狀態以K8s物件提現),在落地形式上以建立/排程Pod來承載應用。 (此4個概念還不包含NetWork相關)

開啟Kubernetes之旅

建立3例項nodejs應用,

  1. 使用上面的K8s物件定義檔案: kubia-rs.yaml檔案:
\> kubectl  create  -f  kubia-rs.yaml

\> kubectl get pod --show-labels=true
NAME             READY   STATUS    RESTARTS   AGE     LABELS
kubia-rs-96ncq   1/1     Running   0          3m40s   app=kubia
kubia-rs-h5ppz   1/1     Running   0          3m41s   app=kubia
kubia-rs-x5578   1/1     Running   0          3m40s   app=kubia

注意:Pod控制器中使用標籤選擇器來指定哪些Pod屬於同一組(服務也使用同樣機制)。

  1. 以上有多個Pod,建立服務對後端Pod形成負載均衡

[叢集內訪問]: ClusterIP
[提供叢集外訪問]

  • nodeport: 把 service 的 port 對映到叢集節點的一個埠上
  • LoadBalancer:負載均衡器會單獨分配一個ip地址並監聽後端服務的指定埠,請求的流量會通過指定的埠轉發到後端對應的服務。
  • Ingress (minikube addons先啟用ingress,智慧路由)

4種網路方式的yaml程式碼如下:請通過kubectl create -f ...ymal命令生成對應的服務(ingress不是服務)

LoadBalancer是服務暴露到叢集外或者公網上的標準方式;
Ingress 這個服務型別跟我們前面的三種服務型別不一樣,它實際上不是一種服務型別,而是類似一種叢集服務入口的存在,它可以基於你配置的不同路徑或者子域名把流量路由到對應的後端服務,更像是一個“智慧路由”服務。

  1. 訪問3 Pod例項的nodejs應用
  • ClusterIP 只能在叢集內訪問,minikube ssh 進入叢集,或者Hyper-V進入VM: curl 10.100.166.197訪問
  • nodePort、Loadbalancer 需要使用minikube獲取本地叢集url
  • ingress 是複雜網路應用的常規做法
    (1) hosts檔案新增host到IP地址的對映
    (2) 通過ingress路由訪問pod

上面輸出差異體現了隨機Pod(即使連線來自同一個客戶端),SessionAffinity親和力屬性值(ClientIP)可讓單子一客戶端請求都指向一個Pod。

總結

本文從K8s全域性架構講起,力求先在你頭腦中構築巨集觀思維導圖;
提出核心概念幫助全流程理解;
通過一個常見的多例項nodejs應用來實踐k8s核心功能。
本文的所有程式碼:https://github.com/zaozaoniao/k8s-example.git

相關文章