一、配置文件詳解
創(chuàng)建Pod nginx樣例
apiVersion: v1 # api文檔版本
kind: Pod # 資源對(duì)象類(lèi)型,Pod, Deployment,StatefulSet
metadata: # Pod相關(guān)的元數(shù)據(jù),用于描述Pod的數(shù)據(jù)
name: nginx-demo # Pod的名稱(chēng)
labels: # 定義Pod的標(biāo)簽
type: app # 自定義lable標(biāo)簽,名稱(chēng)為tyoe,值為app
test: 1.0.0 # 自定義lable標(biāo)簽,描述Pod版本號(hào)
namespace: 'default' # 命名空間的配置
spec: # 期望Pod按照這里的描述進(jìn)行創(chuàng)建
containers: # Pod中的容器描述
- name: nginx # 容器名稱(chēng)
image: arm64v8/nginx:latest # 指定容器的鏡像
imagePullPolicy: IfNotPresent # 鏡像拉取策略,Always, Never, IfNotPresent
command: # 指定容器啟動(dòng)時(shí)執(zhí)行的命令
- nginx
- -g
- 'daemon off;' # nginx -g daemon off;
workingDir: /usr/share/nginx/html # 定義容器啟動(dòng)后默認(rèn)的目錄
ports:
- name: http # 端口名稱(chēng)
containerPort: 80 # 容器內(nèi)需要暴露的端口
protocol: TCP # 描述該端口是基于哪種協(xié)議通信的
env: # 環(huán)境變量
- name: JVM_OPTS # 環(huán)境變量名稱(chēng)
value: '-Xms120m -Xmx128m' # 環(huán)境變量的值
resources:
requests: # 最少需要多少資源
cpu: 100m # 限制cpu最多使用0.1個(gè)核心
memory: 128Mi # 限制內(nèi)存最少使用128兆
limits: # 最多可以用多少資源
cpu: 200m # 限制cpu最多使用0.2個(gè)核心
memory: 256Mi # 限制最多使用256兆
restartPolicy: OnFailure # pod重啟策略,Always,OnFailure,Never,默認(rèn)值為Always, OnFailure 只有pod非零推出碼終止時(shí),kubelet才會(huì)重啟改容器,容器正常>結(jié)束的退出碼為0
K8S 的資源清單
參數(shù)名 | 類(lèi)型 | 字段說(shuō)明 |
---|---|---|
apiVersion | String | K8S APl 的版本,可以用 kubectl api versions 命令查詢(xún) |
kind | String | yam 文件定義的資源類(lèi)型和角色 |
metadata | Object | 元數(shù)據(jù)對(duì)象,下面是它的屬性 |
metadata.name | String | 元數(shù)據(jù)對(duì)象的名字,比如 pod 的名字 |
metadata.namespace | String | 元數(shù)據(jù)對(duì)象的命名空間 |
Spec | Object | 詳細(xì)定義對(duì)象 |
spec.containers[] | list | 定義 Spec 對(duì)象的容器列表 |
spec.containers[].name | String | 為列表中的某個(gè)容器定義名稱(chēng) |
spec.containers[].image | String | 為列表中的某個(gè)容器定義需要的鏡像名稱(chēng) |
spec.containers[].imagePullPolicy | string | 定義鏡像拉取策略,有 Always、Never、IfNotPresent 三個(gè)值可選 - Always(默認(rèn)):意思是每次都嘗試重新拉取鏡像 - Never:表示僅適用本地鏡像 - IfNotPresent:如果本地有鏡像就使用本地鏡像,沒(méi)有就拉取在線(xiàn)鏡像。 |
spec.containers[].command[] | list | 指定容器啟動(dòng)命令,因?yàn)槭菙?shù)組可以指定多個(gè),不指定則使用鏡像打包時(shí)使用的啟動(dòng)命令。 |
spec.containers[].args[] | list | 指定容器啟動(dòng)命令參數(shù),因?yàn)槭菙?shù)組可以指定多個(gè)。 |
spec.containers[].workingDir | string | 指定容器的工作目錄 |
spec.containers[].volumeMounts[] | list | 指定容器內(nèi)部的存儲(chǔ)卷配置 |
spec.containers[].volumeMounts[].name | string | 指定可以被容器掛載的存儲(chǔ)卷的名稱(chēng) |
spec.containers[].volumeMounts[].mountPath | string | 指定可以被容器掛載的存儲(chǔ)卷的路徑 |
spec.containers[].volumeMounts[].readOnly | string | 設(shè)置存儲(chǔ)卷路徑的讀寫(xiě)模式,ture 或者 false,默認(rèn)是讀寫(xiě)模式 |
spec.containers[].ports[] | list | 指定容器需要用到的端口列表 |
spec.containers[].ports[].name | string | 指定端口的名稱(chēng) |
spec.containers[].ports[].containerPort | string | 指定容器需要監(jiān)聽(tīng)的端口號(hào) |
spec.containers[].ports[].hostPort | string | 指定容器所在主機(jī)需要監(jiān)聽(tīng)的端口號(hào),默認(rèn)跟上面 containerPort 相同,注意設(shè)置了 hostPort 同一臺(tái)主機(jī)無(wú)法啟動(dòng)該容器的相同副本(因?yàn)橹鳈C(jī)的端口號(hào)不能相同,這樣會(huì)沖突) |
spec.containers[].ports[].protocol | string | 指定端口協(xié)議,支持 TCP 和 UDP,默認(rèn)值為 TCP |
spec.containers[].env[] | list | 指定容器運(yùn)行前需設(shè)置的環(huán)境變量列表 |
spec.containers[].env[].name | string | 指定環(huán)境變量名稱(chēng) |
spec.containers[].env[].value | string | 指定環(huán)境變量值 |
spec.containers[].resources | Object | 指定資源限制和資源請(qǐng)求的值(這里開(kāi)始就是設(shè)置容器的資源上限) |
spec.containers[].resources.limits | Object | 指定設(shè)置容器運(yùn)行時(shí)資源的運(yùn)行上限 |
spec.containers[].resources.limits.cpu | string | 指定 CPU 的限制,單位為 Core 數(shù),將用于 docker run –cpu-shares 參數(shù) |
spec.containers[].resources.limits.memory | string | 指定 mem 內(nèi)存的限制,單位為 MIB、GiB |
spec.containers[].resources.requests | Object | 指定容器啟動(dòng)和調(diào)度時(shí)的限制設(shè)置 |
spec.containers[].resources.requests.cpu | string | CPU請(qǐng)求,單位為core數(shù),容器啟動(dòng)時(shí)初始化可用數(shù)量 |
spec.containers[].resources.requests.memory | string | 內(nèi)存請(qǐng)求,單位為MIB、GiB,容器啟動(dòng)的初始化可用數(shù)量 |
spec.restartPolicy | string | 定義 pod 的重啟策略,可選值為 Always、OnFailure、Never,默認(rèn)值為 Always。 - Always:pod 一旦終止運(yùn)行,則無(wú)論容器是如何終止的,kubelet 服務(wù)都將重啟它。 - OnFailure:只有 pod 以非零退出碼終止時(shí),kubelet 才會(huì)重啟該容器。如果容器正常結(jié)束(退出碼為0),則 kubectl 將不會(huì)重啟它。 - Never:Pod 終止后,kubelet 將退出碼報(bào)告給 master,不會(huì)重啟該 pod |
spec.nodeSelector | Object | 定義 Node 的 label 過(guò)濾標(biāo)簽,以 key:value 格式指定 |
spec.imagePullSecrets | Object | 定義 pull 鏡像時(shí)使用 secret 名稱(chēng),以 name:secretkey 格式指定 |
spec.hostNetwork | Boolean | 定義是否使用主機(jī)網(wǎng)絡(luò)模式,默認(rèn)值為 false。設(shè)置 true 表示使用宿主機(jī)網(wǎng)絡(luò),不使用 docker 網(wǎng)橋,同時(shí)設(shè)置了 true將無(wú)法在同一臺(tái)宿主機(jī)上啟動(dòng)第二個(gè)副本 |
常用命令:
刪除pod
kubectl delete po nginx-demo
創(chuàng)建pod
kubectl create -f nginx-demo.yaml
查看pod
kubectl get po
實(shí)時(shí)查看pod(動(dòng)態(tài))
kubectl get po -w
查看pod詳細(xì)信息
kubectl get po -o wide
查看pod構(gòu)建詳細(xì)信息
kubectl describe po nginx-demo
查看路由
route -n
二、探針
為什么需要存活探針和就緒探針
上面的配置文件中,通過(guò)配置restartPolicy字段來(lái)對(duì)容器退出后執(zhí)行3種不同的重啟策略,但這并不能解決我們所有的問(wèn)題,比如容器中的Java應(yīng)用程序拋出OutOfMemoryErrors,但JVM進(jìn)程會(huì)一致存在,容器并沒(méi)有退出,再比如,Java停止響應(yīng)或死鎖,容器也沒(méi)有終止等等,這時(shí)如果有一種機(jī)制來(lái)告訴kubernetes來(lái)重啟容器那就最好了,在k8s中,提供了一種存活探針的機(jī)制來(lái)實(shí)現(xiàn)上訴的問(wèn)題。
- livenessProbe,叫做存活探針,是為了檢測(cè)容器是否正在運(yùn)行,是否活著;
- readinessProbe,叫做就緒探針,是為了檢測(cè)容器是否準(zhǔn)備就緒,是否能接受客戶(hù)端請(qǐng)求;
- startupProbe,叫做啟動(dòng)探針,用于判斷容器進(jìn)程是否已經(jīng)啟動(dòng)。
關(guān)于探針看這篇文章,寫(xiě)的太好了??
pod健康檢查之容器的存活探針、就緒探針
1、StartupProbe啟動(dòng)探針
k8s 1.16 版本新增的探針,用于判斷應(yīng)用程序是否已經(jīng)啟動(dòng)了。
當(dāng)配置了 startupProbe 后,會(huì)先禁用其他探針,直到 startupProbe 成功后,其他探針才會(huì)繼續(xù)。
作用:由于有時(shí)候不能準(zhǔn)確預(yù)估應(yīng)用一定是多長(zhǎng)時(shí)間啟動(dòng)成功,因此配置另外兩種方式不方便配置初始化時(shí)長(zhǎng)來(lái)檢測(cè),而配置了 statupProbe 后,只有在應(yīng)用啟動(dòng)成功了,才會(huì)執(zhí)行另外兩種探針,可以更加方便的結(jié)合使用另外兩種探針使用。
startupProbe: #啟動(dòng)探針配置
httpGet: # 探測(cè)方式,基于http請(qǐng)求探測(cè)
path: /api/startup # http請(qǐng)求路徑
port: 80 # 請(qǐng)求端口
2、LivenessProbe就緒探針
用于探測(cè)容器中的應(yīng)用是否運(yùn)行,如果探測(cè)失敗,kubelet 會(huì)根據(jù)配置的重啟策略進(jìn)行重啟,若沒(méi)有配置,默認(rèn)就認(rèn)為容器啟動(dòng)成功,不會(huì)執(zhí)行重啟策略。
livenessProbe: #就緒探針配置
httpGet: # 探測(cè)方式,基于http請(qǐng)求探測(cè)
path: /health # http請(qǐng)求路徑
port: 8080 # 請(qǐng)求端口
scheme: HTTP
initialDelaySeconds: 60 # 初始延時(shí),表示容器啟動(dòng)60秒后才開(kāi)始探測(cè)
failureThreshold: 5 # 失敗多少次才算真正失敗
periodSeconds: 10 # 間隔時(shí)間
successThreshold: 1 # 多少次檢測(cè)成功才算成功
timeoutSeconds: 5 # 請(qǐng)求的超時(shí)時(shí)間
3、ReadinessProbe存活探針
用于探測(cè)容器內(nèi)的程序是否健康,它的返回值如果返回 success,那么就認(rèn)為該容器已經(jīng)完全啟動(dòng),并且該容器是可以接收外部流量的。
readinessProbe: # 存活探針配置
httpGet:
path: /ready
port: 8181
scheme: HTTP
failureThreshold: 3 # 錯(cuò)誤次數(shù)
periodSeconds: 10 # 間隔時(shí)間
successThreshold: 1 # 多少次檢測(cè)成功才算成功
timeoutSeconds: 1 # 請(qǐng)求的超時(shí)時(shí)間
4、三種探測(cè)方式
# 1.ExecAction
# 在容器內(nèi)部執(zhí)行一個(gè)命令,如果返回值為 0,則任務(wù)容器時(shí)健康的。
livenessProbe:
exec:
command:
- cat
- /health
# 2.TCPSocketAction
# 通過(guò) tcp 連接監(jiān)測(cè)容器內(nèi)端口是否開(kāi)放,如果開(kāi)放則證明該容器健康
livenessProbe:
tcpSocket:
port: 80
# 3.HTTPGetAction
# 生產(chǎn)環(huán)境用的較多的方式,發(fā)送 HTTP 請(qǐng)求到容器內(nèi)的應(yīng)用程序,如果接口返回的狀態(tài)碼在 200~400 之間,則認(rèn)為容器健康。
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
httpHeaders:
- name: xxx
value: xxx
5、探針的附加參數(shù)配置
initialDelaySeconds: 60 # 初始化時(shí)間
timeoutSeconds: 2 # 超時(shí)時(shí)間
periodSeconds: 5 # 監(jiān)測(cè)間隔時(shí)間
successThreshold: 1 # 檢查 1 次成功就表示成功
failureThreshold: 2 # 監(jiān)測(cè)失敗 2 次就表示失敗
注意:定義存活探針時(shí),一定要設(shè)置initialDelaySeconds屬性,該屬性為初始延時(shí),如果不設(shè)置,默認(rèn)容器啟動(dòng)時(shí)探針就開(kāi)始探測(cè)了,這樣可能會(huì)存在應(yīng)用程序還未啟動(dòng)就緒,就會(huì)導(dǎo)致探針檢測(cè)失敗,k8s就會(huì)根據(jù)pod重啟策略殺掉容器然后再重新創(chuàng)建容器的莫名其妙的問(wèn)題。
在生產(chǎn)環(huán)境中,一定要定義一個(gè)存活探針。
三、Pod生命周期
生命周期閱讀這篇文章??
pod生命周期以及探針介紹
Pod 退出流程(刪除操作)
- Endpoint 刪除 pod 的 ip 地址
- Pod 變成 Terminating 狀態(tài)
- 執(zhí)行 preStop 的指令
PreStop 的應(yīng)用文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-672580.html
- 注冊(cè)中心下線(xiàn)
- 數(shù)據(jù)清理
- 數(shù)據(jù)銷(xiāo)毀
下一篇:(三)k8s實(shí)戰(zhàn)-資源調(diào)度文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-672580.html
到了這里,關(guān)于(二)k8s實(shí)戰(zhàn)-深入Pod詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!