文章來源於Dotnet Plus,作者小碼甲
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從集群外部發起管理和控制。
<code>
/<code>
以管理員權限執行CMD命令:
kubectl: 發送Restful api 控制Kubernetes集群管理器
Minikube是一個CLI工具,配置、管理(已針對開發流程優化)的單節點Kubernetes集群
列舉4個核心概念
1. API
Kubernetes API作為<code>聲明式配置方案/<code>的基石,API文檔中定義了API端點、資源,kubectl命令行工具可操作API對象,對象的序列化對象存儲在etcd中,各組件也是通過API交互。
2. k8s對象
Kubernetes對象代表系統中持久化的實體,下面的實體都作為對象:
哪些容器化應用正在運行
這些應用程序可用的資源
與這些應用程序有關的行為&策略:重新啟動策略、升級和容錯
Kubernetes對象是<code>期望狀態/<code>,創建對象之後,你就通知了K8s你希望集群這樣運作。
大多數K8s對象由spec和status組成:
spec:[由你]提供資源的特徵描述
status: [系統自行控制] 描述對象當前狀態,由K8s系統組件設置和更新,K8s控制面板持續管理對象的實際狀態去匹配你設定的期望狀態
當你創建k8s對象, 你需要提供對象spec來描述預期狀態。當使用k8s API(或者kubectl),在API請求的body包含json信息;大多數時給kubectl提供.yaml文件來代替json,kubectl會將yaml文件中信息轉換為json再發起API請求。
下面的<code>kubia-rs.yaml文件/<code>:ReplicaSet對象啟動3個nodejs應用, [spec]定義了此次ReplicaSet的規格
<code>apiVersion
: apps/v1
kind
:ReplicaSet
metadata
:name
:kubia-rs
spec
:replicas
:3
s
elector
:matchLabels
:app
:kubia
template
:metadata
:labels
:
app
:kubia
spec
:containers
:
-name
:kubia
image
: luksa/kubia
ports
:
-containerPort
:8080
# 對於ReplicaSet囉嗦兩句:新一代的ReplicationController; 通常不會直接創建ReplicaSet
,而是在創建更高級的Deployment
資源時自動創建它們。
/<code>
3. Pod
Kubernetes Pod是創建/部署k8s對象中最小最簡單的單元:
由於不能將多個進程聚集在一個單獨容器,需要另外一種高級結構將容器綁定在一起,作為一個單元管理,這就是Pod背後根本原理, 一個pod中容器共享相同ip和端口空間。
4. Controller
k8s控制器是一個<code>control loop/<code>(監控集群狀態,在被需要時或主動請求時更新集群),每個控制器都試圖<code>將當前集群狀態移動到期望狀態/<code>。
在機器人和自動化,<code>control loop/<code>是一個非終止迴路,用於調節系統狀態,例如房間的空調。
控制器自身可以執行操作,但一般情況下,控制器會將引起連鎖反應的消息發往api server.
Kubernetes內置了一些控制器: ReplicaSet、Deployment、StatefulSets、DaemonSet、Job...
<code># k8s deployment檢查容器健康狀態、保證容器數量、還具備部署相關的特性, deployment是管理和縮放容器的推薦控制器
kubectlcreate
deployment hello-kubia
/<code>
這4個概念連起來就是:K8s已經定義了API元數據,Controller調度K8s系統到指定的預期狀態(這個預期狀態以K8s對象體現),在落地形式上以創建/調度Pod來承載應用。 (此4個概念還不包含NetWork相關)
開啟Kubernetes之旅
創建3實例nodejs應用
使用上面的K8s對象定義文件:kubia-rs.yaml文件:
<code>\>
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
/<code>
注意:Pod控制器中使用<code>標籤選擇器/<code>來指定哪些Pod屬於同一組(服務也使用同樣機制)。
-
以上有多個Pod,創建服務對後端Pod形成負載均衡
[集群內訪問]:ClusterIP
[提供集群外訪問]:
nodeport:把service的port 映射到集群節點的一個端口上
LoadBalancer:負載均衡器會單獨分配一個ip地址並監聽後端服務的指定端口,請求的流量會通過指定的端口轉發到後端對應的服務。
Ingress (minikube addons先啟用ingress,智能路由)
4種網絡方式的yaml代碼如下:請通過kubectl create -f *file*.yaml命令生成對應的服務(ingress不是服務)
LoadBalancer是服務暴露到集群外或者公網上的標準方式;
Ingress 這個服務類型跟我們前面的三種服務類型不一樣,<code>它實際上不是一種服務類型/<code>,而是類似一種集群服務入口的存在,它可以基於你配置的不同路徑或者子域名把流量路由到對應的後端服務,更像是一個“智能路由”服務。
訪問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
閱讀更多
- 使用Docker-Compose搭建高可用redis哨兵集群
- 誰說docker-compose不能水平擴展容器、服務多實例?
基於docker-compose的Gitlab CI/CD實踐&排坑指南
- 實例解讀Docker Swarm
關注我們
更多幹貨及潮流技術
層出不窮的新技術對程序員來說既是挑戰也是機遇,固守自己的一畝三分地遲早落於他人,是時候跳出來看看行業內的發展新趨勢,參與2020 DAMS中國數據智能管理峰會是個不錯的選擇,其中前沿技術議題包括:
《當5G遇上金融,看電信甜橙金融如何創新?》中國電信甜橙金融技術創新中心總經理 張小虎
《智能製造的數字化基礎的設計與演進》長城汽車集團雲計算總監 張小斌
《平安銀行“傳統+互聯網”混合CMDB及運營中臺實踐》平安銀行運營開發負責人 徐大蔚
《中信銀行的DevOps實踐》中信銀行DevOps實施牽頭人 李紅濤
8月7日,一起在上海洞悉技術發展新趨勢,逆襲碼農人生吧!