文章來源於Dotnet Plus,作者小碼甲
Kubernetes 是一個軟體系統,使你在數以萬計的電腦節點上運行軟體時就像所有節點是以單個大節點一樣, 它將底層基礎設施抽象,這樣做同時簡化了應用開發、部署,以及對開發和運維團隊的管理。
Kubernetes集群由很多節點組成,分為兩大類:
主節點 承載Kubernetes控制和管理整個集群系統的控制面板
工作節點 運行實際部署的應用
控制集群並使它工作,包含多個組件(組件單節點或通過副本分別部署到多個主節點以確保高可用)
Kubernetes Api Server:客戶端Kubectl、控制面板其他組件和worker節點都需要和它通信
Scheduler: 調度應用
Controller Manager: 執行集群級別功能,如複製組件、持續跟蹤工作節點、處理節點失敗等
etcd:可靠的分布式資料庫存儲,能持久化集群配置
運行容器化應用的機器,運行、監控、管理應用服務的任務由下組件完成:
Docker、rtk或其他容器類型
Kubelet與API Server通信,並管理它所在節點容器
Kube-Proxy:負責組件之間負載均衡網絡流量
本處window10+Hyper-V搭建minikube本地集群
這臺虛擬機既作為master,又作為worker,Kubectl從集群外部發起管理和控制。
對於ReplicaSet囉嗦兩句:新一代的ReplicationController; 通常不會直接創建ReplicaSet,而是在創建更高級的Deployment資源時自動創建它們。
Kubernetes Pod是創建/部署k8s對象中最小最簡單的單元:
由於不能將多個進程聚集在一個單獨容器,需要另外一種高級結構將容器綁定在一起,作為一個單元管理,這就是Pod背後根本原理, 一個pod中容器共享相同ip和埠空間。
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相關)
使用上面的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屬於同一組(服務也使用同樣機制)。
以上有多個Pod,創建服務對後端Pod形成負載均衡
[集群內訪問]:ClusterIP
[提供集群外訪問]:
nodeport:把service的port 映射到集群節點的一個埠上
LoadBalancer:負載均衡器會單獨分配一個ip地址並監聽後端服務的指定埠,請求的流量會通過指定的埠轉發到後端對應的服務。
Ingress (minikube addons先啟用ingress,智能路由)
4種網絡方式的yaml代碼如下:請通過kubectl create -f *file*.yaml命令生成對應的服務(ingress不是服務)
LoadBalancer是服務暴露到集群外或者公網上的標準方式;
Ingress 這個服務類型跟我們前面的三種服務類型不一樣,
它實際上不是一種服務類型
,而是類似一種集群服務入口的存在,它可以基於你配置的不同路徑或者子域名把流量路由到對應的後端服務,更像是一個「智能路由」服務。
訪問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的Gitlab CI/CD實踐&排坑指南
關注我們
更多乾貨及潮流技術
層出不窮的新技術對程式設計師來說既是挑戰也是機遇,固守自己的一畝三分地遲早落於他人,是時候跳出來看看行業內的發展新趨勢,參與2020 DAMS中國數據智能管理峰會是個不錯的選擇,其中前沿技術議題包括:
《當5G遇上金融,看電信甜橙金融如何創新?》中國電信甜橙金融技術創新中心總經理 張小虎
《智能製造的數位化基礎的設計與演進》長城汽車集團雲計算總監 張小斌
《平安銀行「傳統+網際網路」混合CMDB及運營中臺實踐》平安銀行運營開發負責人 徐大蔚
《中信銀行的DevOps實踐》中信銀行DevOps實施牽頭人 李紅濤
8月7日,一起在上海洞悉技術發展新趨勢,逆襲碼農人生吧!