硬核技能k8s初体验
,
Kubernetes 是一個(gè)軟件系統(tǒng),使你在數(shù)以萬(wàn)計(jì)的電腦節(jié)點(diǎn)上運(yùn)行軟件時(shí)就像所有節(jié)點(diǎn)是以單個(gè)大節(jié)點(diǎn)一樣, 它將底層基礎(chǔ)設(shè)施抽象,這樣做同時(shí)簡(jiǎn)化了應(yīng)用開發(fā)、部署,以及對(duì)開發(fā)和運(yùn)維團(tuán)隊(duì)的管理。
Kubernetes集群架構(gòu)
Kubernetes集群由很多節(jié)點(diǎn)組成,分為兩大類:
主節(jié)點(diǎn) 承載Kubernetes控制和管理整個(gè)集群系統(tǒng)的控制面板
工作節(jié)點(diǎn) 運(yùn)行實(shí)際部署的應(yīng)用
控制面板
控制集群并使它工作,包含多個(gè)組件(組件單節(jié)點(diǎn)或通過(guò)副本分別部署到多個(gè)主節(jié)點(diǎn)以確保高可用)
Kubernetes Api Server:客戶端Kubectl、控制面板其他組件和worker節(jié)點(diǎn)都需要和它通信
Scheduler: 調(diào)度應(yīng)用
Controller Manager: 執(zhí)行集群級(jí)別功能,如復(fù)制組件、持續(xù)跟蹤工作節(jié)點(diǎn)、處理節(jié)點(diǎn)失敗等
etcd:可靠的分布式數(shù)據(jù)庫(kù)存儲(chǔ),能持久化集群配置
工作節(jié)點(diǎn)
運(yùn)行容器化應(yīng)用的機(jī)器,運(yùn)行、監(jiān)控、管理應(yīng)用服務(wù)的任務(wù)由下組件完成:
Docker、rtk或其他容器類型
Kubelet與API Server通信,并管理它所在節(jié)點(diǎn)容器
Kube-Proxy:負(fù)責(zé)組件之間負(fù)載均衡網(wǎng)絡(luò)流量
MiniKube環(huán)境& 核心概念
本處window10+Hyper-V搭建minikube本地集群
這臺(tái)虛擬機(jī)既作為master,又作為worker,Kubectl從集群外部發(fā)起管理和控制。
# 因國(guó)內(nèi)極差的網(wǎng)絡(luò)環(huán)境,建議使用阿里云的鏡像地址: minikube start --image-mirror-country=cn --image-repository=http://registry.aliyuncs.com/google_containers --registry-mirror=https://aq32bn7a.mirror.aliyuncs.com以管理員權(quán)限執(zhí)行CMD命令:
kubectl: 發(fā)送Restful api 控制Kubernetes集群管理器
Minikube是一個(gè)CLI工具,配置、管理(已針對(duì)開發(fā)流程優(yōu)化)的單節(jié)點(diǎn)Kubernetes集群
列舉4個(gè)核心概念
1. API
Kubernetes API作為聲明式配置方案的基石,API文檔中定義了API端點(diǎn)、資源,kubectl命令行工具可操作API對(duì)象,對(duì)象的序列化對(duì)象存儲(chǔ)在etcd中,各組件也是通過(guò)API交互。
2. k8s對(duì)象
Kubernetes對(duì)象代表系統(tǒng)中持久化的實(shí)體,下面的實(shí)體都作為對(duì)象:
哪些容器化應(yīng)用正在運(yùn)行
這些應(yīng)用程序可用的資源
與這些應(yīng)用程序有關(guān)的行為&策略:重新啟動(dòng)策略、升級(jí)和容錯(cuò)
Kubernetes對(duì)象是期望狀態(tài),創(chuàng)建對(duì)象之后,你就通知了K8s你希望集群這樣運(yùn)作。
大多數(shù)K8s對(duì)象由spec和status組成:
spec:[由你]提供資源的特征描述
status: [系統(tǒng)自行控制] 描述對(duì)象當(dāng)前狀態(tài),由K8s系統(tǒng)組件設(shè)置和更新,K8s控制面板持續(xù)管理對(duì)象的實(shí)際狀態(tài)去匹配你設(shè)定的期望狀態(tài)
當(dāng)你創(chuàng)建k8s對(duì)象, 你需要提供對(duì)象spec來(lái)描述預(yù)期狀態(tài)。當(dāng)使用k8s API(或者kubectl),在API請(qǐng)求的body包含json信息;大多數(shù)時(shí)給kubectl提供.yaml文件來(lái)代替json,kubectl會(huì)將yaml文件中信息轉(zhuǎn)換為json再發(fā)起API請(qǐng)求。
下面的kubia-rs.yaml文件:ReplicaSet對(duì)象啟動(dòng)3個(gè)nodejs應(yīng)用, [spec]定義了此次ReplicaSet的規(guī)格
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 # 對(duì)于ReplicaSet啰嗦兩句:新一代的ReplicationController; 通常不會(huì)直接創(chuàng)建ReplicaSet,而是在創(chuàng)建更高級(jí)的Deployment資源時(shí)自動(dòng)創(chuàng)建它們。3. Pod
Kubernetes Pod是創(chuàng)建/部署k8s對(duì)象中最小最簡(jiǎn)單的單元:
由于不能將多個(gè)進(jìn)程聚集在一個(gè)單獨(dú)容器,需要另外一種高級(jí)結(jié)構(gòu)將容器綁定在一起,作為一個(gè)單元管理,這就是Pod背后根本原理,?一個(gè)pod中容器共享相同ip和端口空間。
4. Controller
k8s控制器是一個(gè)control loop(監(jiān)控集群狀態(tài),在被需要時(shí)或主動(dòng)請(qǐng)求時(shí)更新集群),每個(gè)控制器都試圖將當(dāng)前集群狀態(tài)移動(dòng)到期望狀態(tài)。
在機(jī)器人和自動(dòng)化,control loop是一個(gè)非終止回路,用于調(diào)節(jié)系統(tǒng)狀態(tài),例如房間的空調(diào)。
控制器自身可以執(zhí)行操作,但一般情況下,控制器會(huì)將引起連鎖反應(yīng)的消息發(fā)往api server.
Kubernetes內(nèi)置了一些控制器: ReplicaSet、Deployment、StatefulSets、DaemonSet、Job...
# k8s deployment檢查容器健康狀態(tài)、保證容器數(shù)量、還具備部署相關(guān)的特性, deployment是管理和縮放容器的推薦控制器 kubectl create deployment hello-kubia --iamge=luksa/kubia這4個(gè)概念連起來(lái)就是:K8s已經(jīng)定義了API元數(shù)據(jù),Controller調(diào)度K8s系統(tǒng)到指定的預(yù)期狀態(tài)(這個(gè)預(yù)期狀態(tài)以K8s對(duì)象體現(xiàn)),在落地形式上以創(chuàng)建/調(diào)度Pod來(lái)承載應(yīng)用。? ? (此4個(gè)概念還不包含NetWork相關(guān))
開啟Kubernetes之旅
創(chuàng)建3實(shí)例nodejs應(yīng)用
使用上面的K8s對(duì)象定義文件:kubia-rs.yaml文件:
注意:Pod控制器中使用標(biāo)簽選擇器來(lái)指定哪些Pod屬于同一組(服務(wù)也使用同樣機(jī)制)。
以上有多個(gè)Pod,創(chuàng)建服務(wù)對(duì)后端Pod形成負(fù)載均衡
[集群內(nèi)訪問(wèn)]:ClusterIP ??
[提供集群外訪問(wèn)]:
nodeport:把service的port 映射到集群節(jié)點(diǎn)的一個(gè)端口上
LoadBalancer:負(fù)載均衡器會(huì)單獨(dú)分配一個(gè)ip地址并監(jiān)聽后端服務(wù)的指定端口,請(qǐng)求的流量會(huì)通過(guò)指定的端口轉(zhuǎn)發(fā)到后端對(duì)應(yīng)的服務(wù)。
Ingress (minikube addons先啟用ingress,智能路由)
4種網(wǎng)絡(luò)方式的yaml代碼如下:請(qǐng)通過(guò)kubectl create ?-f ?*file*.yaml命令生成對(duì)應(yīng)的服務(wù)(ingress不是服務(wù))
LoadBalancer是服務(wù)暴露到集群外或者公網(wǎng)上的標(biāo)準(zhǔn)方式;
Ingress 這個(gè)服務(wù)類型跟我們前面的三種服務(wù)類型不一樣,它實(shí)際上不是一種服務(wù)類型,而是類似一種集群服務(wù)入口的存在,它可以基于你配置的不同路徑或者子域名把流量路由到對(duì)應(yīng)的后端服務(wù),更像是一個(gè)“智能路由”服務(wù)。
訪問(wèn)3 Pod實(shí)例的nodejs應(yīng)用
ClusterIP 只能在集群內(nèi)訪問(wèn),minikube ssh 進(jìn)入集群,或者Hyper-V進(jìn)入VM后:curl 10.100.166.197訪問(wèn)
nodePort、Loadbalancer 需要使用minikube獲取本地集群url
ingress 是復(fù)雜網(wǎng)絡(luò)應(yīng)用的常規(guī)做法
(1) hosts文件添加host到IP地址的映射
(2) 通過(guò)ingress路由訪問(wèn)pod
上面輸出差異體現(xiàn)了隨機(jī)Pod(即使連接來(lái)自同一個(gè)客戶端),SessionAffinity親和力屬性(ClientIP)可讓特定客戶端所有請(qǐng)求都指向一個(gè)Pod。
旅行總結(jié)
本文從K8s全局架構(gòu)講起,力求先在你頭腦中構(gòu)筑宏觀思維導(dǎo)圖;
提出核心概念幫助全流程理解;
通過(guò)一個(gè)常見(jiàn)的多實(shí)例nodejs應(yīng)用來(lái)實(shí)踐k8s核心功能。
https://github.com/zaozaoniao/k8s-example.git
使用Docker-Compose搭建高可用redis哨兵集群
誰(shuí)說(shuō)docker-compose不能水平擴(kuò)展容器、服務(wù)多實(shí)例?
基于docker-compose的Gitlab CI/CD實(shí)踐&排坑指南
實(shí)例解讀Docker Swarm
關(guān)注我們
更多干貨及潮流技術(shù)
請(qǐng)關(guān)注Dotnet Plus公眾號(hào)
▲
▲
“閱讀全文,體驗(yàn)更佳”
總結(jié)
以上是生活随笔為你收集整理的硬核技能k8s初体验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用c# .net core开发国标gb
- 下一篇: 在远程 CSM 课程中体验线上工作坊