k8s中所有的內(nèi)容都抽象為資源昆汹, 資源實(shí)例化之后辆苔,叫做對(duì)象线椰。
一芝囤、對(duì)象類型介紹:
工作負(fù)載型資源對(duì)象(workload):POD,ReplicaSet禽炬,Deployment饵筑,StatefulSet极景,DaemonSet暑塑,Job吼句,Cronjob ...
服務(wù)發(fā)現(xiàn)及均衡資源對(duì)象:Service,Ingress ...
配置與存儲(chǔ)資源對(duì)象:Volume(存儲(chǔ)卷)事格,CSI(容器存儲(chǔ)接口,可以擴(kuò)展各種各樣的第三方存儲(chǔ)卷)惕艳,ConfigMap,Secret分蓖,DownwardAPI
集群級(jí)資源:Namespace尔艇,Node尔许,Role么鹤,ClusterRole,RoleBinding味廊,ClusterRoleBinding
元數(shù)據(jù)型資源:HPA蒸甜,PodTemplate,LimitRange
二余佛、資源清單
1柠新、查看資源清單:
kubectl get pod name -o yaml
2、資源清單簡(jiǎn)介:
Apiserver僅接收J(rèn)SON格式的資源定義(一般使用yaml格式提供配置清單apiserver可自動(dòng)將其轉(zhuǎn)為json格式辉巡,而后再提交)恨憎,大部分資源的配置清單都由五個(gè)一級(jí)字段組成:
- apiVersion: group/apiversion
如果沒有給定group名稱,那么默認(rèn)為croe郊楣,可以使用kubectl api-versions 獲取當(dāng)前k8s版本上所有的apiVersion版本信息(每個(gè)版本可能不同)
查看:
kubectl api-versions
kind:資源類別
metadata:資源元數(shù)據(jù)
name:(metadata中的name字段在同一類型中必須是唯一的)
namespace:命名空間
labels:標(biāo)簽(鍵值數(shù)據(jù))
annotations:資源注解spec:資源期望的狀態(tài)
status:當(dāng)前狀態(tài)憔恳,該字段由k8s集群維護(hù),用戶不能對(duì)其進(jìn)行修改净蚤。
其中spec重點(diǎn)介紹一下:
spec.containers.name : pod的名稱钥组,必須字段,名稱唯一且對(duì)象創(chuàng)建后不可以被修改
spec.containers.image :鏡像倉(cāng)庫(kù)的路徑/鏡像的名稱( 鏡像的標(biāo)簽 )
spec.containers.image.imagePullPolicy :鏡像下載策略( Always:總是去倉(cāng)庫(kù)下載今瀑;Never:從不去倉(cāng)庫(kù)下載程梦;IfNotPresent:如果本地沒有就
去倉(cāng)庫(kù)下載点把。默認(rèn)是"IfNotPresent" 但是,如果鏡像的標(biāo)簽是latest屿附,則總會(huì)是"Always郎逃,并且對(duì)象一旦被創(chuàng)建,這個(gè)字段不允許被改變)
spec.containers.ports:容器公開的端口列表挺份。在這里公開端口可以為系統(tǒng)提供關(guān)于容器使用的網(wǎng)絡(luò)連接的額外信息衣厘,但主要是提供信息。在這
里不指定端口不會(huì)阻止該端口被公開压恒。任何監(jiān)聽容器內(nèi)默認(rèn)的“0.0.0.0”地址的端口都可以從網(wǎng)絡(luò)訪問
spec.containers.ports.containerPort:暴露的端口影暴,此端口僅是額外的信息,對(duì)端口是否被暴露沒有影響
spec.containers.ports.hostPort:主機(jī)上公開的端口
spec.containers.ports.protocol:端口的協(xié)議
spec.containers.ports.hostIP:指定要綁定的主機(jī)
spec.containers.command:運(yùn)行的程序探赫,類似于docker中的entrypiont,并且這里的命令不會(huì)運(yùn)行在shell中型宙,如果沒有這個(gè)字段docker鏡像會(huì)
運(yùn)行自己entrypiont中的指令
spec.containers.args:向docker鏡像中傳遞參數(shù) 如果定義了這個(gè)字段,docker鏡像中cmd命令不會(huì)被執(zhí)行伦吠,如果引用變量使
用$(VAR_NAME)格式引用妆兑,如果想使用命令引用的的方式,需要使用$$(VAR_NAME)方式來引用
spec.containers.volumeMounts.mountPath:可以被容器掛載的存儲(chǔ)卷的路徑毛仪,路徑不能包含':' 符號(hào)
spec.containers.volumeMounts.subPath:可以被容器掛載的存儲(chǔ)卷的路徑搁嗓,并且不會(huì)覆蓋掛載點(diǎn)中的文件
spec.containers.volumeMounts.readOnly:是否只讀,默認(rèn)為false
spec.containers.resources.limits:資源限制
spec.containers.resources.limits.cpu :CPU 上限箱靴, 可以短暫超過腺逛, 容器也不會(huì)被停止
spec.containers.resources.limits.memory:內(nèi)存上限, 不可以超過衡怀; 如果超過棍矛, 容器可能會(huì)被終止或調(diào)度到其他資源充足的機(jī)器上
spec.containers.resources.requests:資源需求
spec.containers.resources.requests.cpu:CPU 請(qǐng)求, 也是調(diào)度 CPU 資源的依據(jù)抛杨, 可以超過
spec.containers.resources.requests.memory:內(nèi)存請(qǐng)求够委, 也是調(diào)度內(nèi)存資源的依據(jù), 可以超過怖现; 但如果超過茁帽, 容器可能會(huì)在 Node
內(nèi)存不足時(shí)清理。
spec.nodeSelector:指定對(duì)象的調(diào)度節(jié)點(diǎn),節(jié)點(diǎn)必須存在屈嗤。
spec.restartPolicy:容器的重啟策略潘拨。有三種Always(只要退出就重啟),OnFailure(狀態(tài)為錯(cuò)誤時(shí)重啟)恢共,Never(從不重啟)战秋,kubelet重新啟動(dòng)的已退出容器將以指數(shù)退避延遲(10秒,20秒讨韭,40秒......)重新啟動(dòng)脂信,上限為五分鐘癣蟋,并在成功執(zhí)行十分鐘后重置
3、創(chuàng)建資源配置清單:
通過資源配置清單創(chuàng)建POD
kubectl create -f /test-list/lyq-pod-test.yaml
獲取pod信息:
對(duì)與配置清單創(chuàng)建的POD我們可以這樣進(jìn)行刪除
kubectl delete -f /test-list/lyq-pod-test.yaml
4狰闪、錯(cuò)誤處理
有時(shí)創(chuàng)建的Pod可能會(huì)出現(xiàn)問題:
這時(shí)疯搅,我們可以使用 kubectl logs name,來查詢問題原因
如果我們需要進(jìn)入pod進(jìn)行排錯(cuò)埋泵,我們可以使用(比如進(jìn)入nginx)
kubectl exec -it lyq-pod-test -c nginx -- bin/sh
三幔欧、POD標(biāo)簽
我們可以使用命令給Pod資源打上標(biāo)簽,方便使用:Kubectl label pods pod名字 標(biāo)簽
如:
kubectl label pods lyq-pod release=canary
通過標(biāo)簽我們可以是實(shí)現(xiàn)對(duì)POD資源的查詢:
1丽声、kubectl get pods -l release=canary 查詢r(jià)elease標(biāo)簽等于canary的Pod
2礁蔗、kubectl get pods -l release,app 查詢有release標(biāo)簽和app標(biāo)簽的Pod
3、kubectl get pods -l “release in (canary,beta,alpha)” 查詢r(jià)elease標(biāo)簽等于"canary"或"beta"或"alpha"的Pod
4雁社、kubectl get pods -l “release notin (canary,beta,alpha)” 查詢r(jià)elease標(biāo)簽不為"canary"或"beta"或"alpha"的Pod
四浴井、POD的生命周期中的重要行為及常見狀態(tài)
Pod的生命周期中主要有以下兩個(gè)比較重要的行為:
1、使用初始化容器完成初始化
2霉撵、容器探測(cè)(liveness:探測(cè)容器是否處于存活狀態(tài)磺浙;readiness:探測(cè)容器中程序是否能正常提供服務(wù))
探針的類型主要分為以下兩種:
1、存活性探針:針對(duì)liveness
2徒坡、就緒性探針:針對(duì)readiness
存活性探針:
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
spec:
containers:
- name: liveness-httpget-pod
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 2
periodSeconds: 5
就緒性探針:
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
spec:
containers:
- name: readiness-httpget-pod
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 2
periodSeconds: 5
常見的POD狀態(tài):
Pending: 掛起(POD已創(chuàng)建但是沒有適合運(yùn)行的節(jié)點(diǎn))
Running:運(yùn)行中
Failed:失敗
參考資料:
《每天5分鐘玩轉(zhuǎn)Kubernetes》
《黑馬k8s集群技術(shù)》