硬核技能k8s初体验
,
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: 3selector:matchLabels:app: kubiatemplate:metadata:labels:app: kubiaspec:containers:- name: kubiaimage: luksa/kubiaports:- 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應用
使用上面的K8s對象定義文件:kubia-rs.yaml文件:
注意: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搭建高可用redis哨兵集群
誰說docker-compose不能水平擴展容器、服務多實例?
基于docker-compose的Gitlab CI/CD實踐&排坑指南
實例解讀Docker Swarm
關注我們
更多干貨及潮流技術
請關注Dotnet Plus公眾號
▲
▲
“閱讀全文,體驗更佳”
總結
以上是生活随笔為你收集整理的硬核技能k8s初体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用c# .net core开发国标gb
- 下一篇: 在远程 CSM 课程中体验线上工作坊