K8s學(xué)習(xí)之Pod的定義及詳細(xì)資源調(diào)用案例
資源管理介紹
- 在kubernetes中,所有的內(nèi)容都抽象為資源,用戶需要通過操作資源來管理kubernetes。
- kubernetes的本質(zhì)上就是一個(gè)集群系統(tǒng),用戶可以在集群中部署各種服務(wù)
- 所謂的部署服務(wù),其實(shí)就是在kubernetes集群中運(yùn)行一個(gè)個(gè)的容器,并將指定的程序跑在容器中。
- kubernetes的最小管理單元是pod而不是容器,只能將容器放在
Pod
中, - kubernetes一般也不會(huì)直接管理Pod,而是通過
Pod控制器
來管理Pod的。 - Pod中服務(wù)的訪問是由kubernetes提供的
Service
資源來實(shí)現(xiàn)。 - Pod中程序數(shù)據(jù)的持久化是由kubernetes提供的各種
存儲(chǔ)系統(tǒng)
來實(shí)現(xiàn)的
資源管理方式
1、命令式對(duì)象管理:直接使用命令去操作kubernetes資源
kubectl run nginx-pod --image=nginx:latest --port=80
2、命令式對(duì)象配置:通過命令配置和配置文件去操作kubernetes資源
kubectl create/patch -f nginx-pod.yaml
3、聲明式對(duì)象配置:通過apply命令和配置文件去操作kubernetes資源
kubectl apply -f nginx-pod.yaml
類型 | 適用環(huán)境 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|---|
命令式對(duì)象管理 | 測(cè)試 | 簡(jiǎn)單 | 只能操作活動(dòng)對(duì)象,無法審計(jì)、跟蹤 |
命令式對(duì)象配置 | 開發(fā) | 可以審計(jì)、跟蹤 | 項(xiàng)目大時(shí),配置文件多,操作麻煩 |
聲明式對(duì)象配置 | 開發(fā) | 支持目錄操作 | 意外情況下難以調(diào)試 |
命令式對(duì)象管理
kubectl是kubernetes集群的命令行工具,通過它能夠?qū)罕旧磉M(jìn)行管理,并能夠在集群上進(jìn)行容器化應(yīng)用的安裝部署
kubectl命令的語法如下:
kubectl [command] [type] [name] [flags]
comand:指定要對(duì)資源執(zhí)行的操作,例如create、get、delete
type:指定資源類型,比如deployment、pod、service
name:指定資源的名稱,名稱大小寫敏感
flags:指定額外的可選參數(shù)
# 查看所有pod kubectl get pod # 查看某個(gè)pod kubectl get pod pod_name # 查看某個(gè)pod,以yaml格式展示結(jié)果 kubectl get pod pod_name -o yaml
資源類型
kubernetes中所有的內(nèi)容都抽象為資源
kubectl api-resources
常用資源類型:
資源分類 | 資源名稱 | 縮寫 | 資源作用 |
---|---|---|---|
集群級(jí)別資源 | nodes | no | 集群組成部分 |
namespaces | ns | 隔離pod | |
pod資源 | pods | po | 裝載容器 |
pod資源控制器 | replicationcontrollers | rc | 控制pod資源 |
replicasets | rs | 控制pod資源 | |
deployments | deploy | 控制pod資源 | |
daemonsets | ds | 控制pod資源 | |
jobs | 控制pod資源 | ||
cronjobs | cj | 控制pod資源 | |
horizontalpodautoscalers | hpa | 控制pod資源 | |
statefulsets | sts | 控制pod資源 | |
服務(wù)發(fā)現(xiàn)資源 | services | svc | 統(tǒng)一pod對(duì)外接口 |
ingress | ing | 統(tǒng)一pod對(duì)外接口 | |
存儲(chǔ)資源 | volumeattachments | 存儲(chǔ) | |
persistentvolumes | pv | 存儲(chǔ) | |
persistentvolumeclaims | pvc | 存儲(chǔ) | |
配置資源 | configmaps | cm | 配置 |
secrets | 配置 |
kubect 常見命令操作:
命令分類 | 命令 | 翻譯 | 作用 |
---|---|---|---|
基本命令 | create | 創(chuàng)建 | 創(chuàng)建一個(gè)資源 |
edit | 編輯 | 編輯一個(gè)資源 | |
get | 獲取 | 獲取一個(gè)資源 | |
patch | 更新 | 更新一個(gè)資源 | |
delete | 刪除 | 刪除一個(gè)資源 | |
explain | 解釋 | 展示文檔資源 | |
運(yùn)行和調(diào)試 | run | 運(yùn)行 | 在集群中運(yùn)行一個(gè)指定的鏡像 |
expose | 暴露 | 暴露資源為service | |
describe | 描述 | 顯示資源內(nèi)部信息 | |
logs | 日志 | 輸出容器在pod中的日志 | |
attach | 纏繞 | 進(jìn)入運(yùn)行中的容器 | |
exec | 執(zhí)行 | 執(zhí)行容器中的命令 | |
cp | 復(fù)制 | 在pod內(nèi)外復(fù)制文件 | |
rollout | 首次展示 | 管理資源的發(fā)布 | |
scale | 規(guī)模 | 擴(kuò)(縮)容pod的數(shù)量 | |
autoscale | 自動(dòng)調(diào)整 | 自動(dòng)擴(kuò)(縮)容pod的數(shù)量 | |
高級(jí)命令 | apply | 應(yīng)用 | 通過文件對(duì)資源進(jìn)行配置 |
label | 標(biāo)簽 | 更新資源上的標(biāo)簽 | |
其它命令 | cluster-info | 集群信息 | 顯示集群信息 |
version | 版本 | 顯示當(dāng)前的server和client版本 |
基本命令
kubectl的詳細(xì)說明地址:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
1、顯示集群版本
[root@k8s-master ~]# kubectl version Client Version: v1.30.0 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 Server Version: v1.30.0
2、顯示集群信息
[root@k8s-master ~]# kubectl cluster-info Kubernetes control plane is running at https://172.25.254.100:6443 CoreDNS is running at https://172.25.254.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
3、創(chuàng)建一個(gè)web控制器,控制器中pod數(shù)量為2
[root@k8s-master ~]# kubectl create deployment web --image nginx --replicas 2
4、查看控制器
[root@k8s-master ~]# kubectl get deployments.apps
5、查看資源幫助
[root@k8s-master ~]# kubectl explain deployment GROUP: apps KIND: Deployment VERSION: v1 ......
6、查看控制器參數(shù)幫助
[root@k8s-master ~]# kubectl explain deployment.spec GROUP: apps KIND: Deployment VERSION: v1
7、編輯控制器配置
[root@k8s-master ~]# kubectl edit deployments.apps web ...... spec: progressDeadlineSeconds: 600 replicas: 3 #運(yùn)行的pod數(shù)量為3個(gè)
8、利用補(bǔ)丁更改控制器配置
[root@k8s-master ~]# kubectl patch deployments.apps web -p '{"spec":{"replicas":4}}' deployment.apps/web patched
9、刪除資源
[root@k8s-master ~]# kubectl delete deployments.apps web deployment.apps "web" deleted
運(yùn)行/調(diào)試命令
1、運(yùn)行pod
[root@k8s-master ~]# kubectl run testpod --image nginx pod/testpod created
2、暴露端口
查看服務(wù):
[root@k8s-master ~]# kubectl get services
暴露端口:
[root@k8s-master ~]# kubectl expose pod testpod --port 80 --target-port 80 service/testpod exposed
測(cè)試:
3、查看資源詳細(xì)信息
[root@k8s-master ~]# kubectl describe pods testpod
4、查看資源日志
[root@k8s-master ~]# kubectl logs pods/testpod
5、運(yùn)行交互pod
[root@k8s-master ~]# kubectl run -it testpod --image busybox #ctrl+pq退出不停止pod #進(jìn)入到已經(jīng)運(yùn)行的容器,且容器有交互環(huán)境 [root@k8s-master ~]# kubectl attach pods/testpod -it
6、在已經(jīng)運(yùn)行的pod中運(yùn)行指定命令
[root@k8s-master ~]# kubectl exec -it pods/nginx /bin/bash
7、復(fù)制文件到pod中
[root@k8s-master ~]# kubectl cp anaconda-ks.cfg nginx:/ [root@k8s-master ~]# kubectl exec -it pods/nginx /bin/bash
8、復(fù)制pod中的文件到本機(jī)
[root@k8s-master ~]# kubectl cp nginx:/anaconda-ks.cfg /root/test #只能復(fù)制文本文件,且復(fù)制源應(yīng)與目標(biāo)源相對(duì)應(yīng),例如文本對(duì)文本,目錄對(duì)目錄
高級(jí)命令示例
1、利用目錄生成yaml模版文件
[root@k8s-master ~]# kubectl create deployment --image nginx web --dry-run=client -o yaml > web.yml
2、利用yaml文件生成資源
[root@k8s-master ~]# vim web.yml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: web name: web spec: replicas: 2 #標(biāo)簽為web的兩個(gè)容器 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - image: nginx name: nginx [root@k8s-master ~]# kubectl apply -f web.yml deployment.apps/web created #生成容器 [root@k8s-master ~]# kubectl get deployments.apps #獲取該控制器下的信息 [root@k8s-master ~]# kubectl delete -f web.yml deployment.apps "webcluster" deleted #刪除該控制器及控制器下的容器
3、管理資源標(biāo)簽
查看其標(biāo)簽:
[root@k8s-master ~]# kubectl apply -f web.yml [root@k8s-master ~]# kubectl get pods --show-labels
更改標(biāo)簽:
[root@k8s-master ~]# kubectl label pods nginx app=webcluster --overwrite
刪除標(biāo)簽:
[root@k8s-master ~]# kubectl label pods nginx app-
當(dāng)容器標(biāo)簽與控制器內(nèi)的設(shè)定數(shù)量不符合時(shí),控制器會(huì)自動(dòng)生成新的容器或刪除多余的容器:
[root@k8s-master ~]# kubectl get pods --show-labels
pod
- Pod是可以創(chuàng)建和管理Kubernetes計(jì)算的最小可部署單元
- 一個(gè)Pod代表著集群中運(yùn)行的一個(gè)進(jìn)程,每個(gè)pod都有一個(gè)唯一的ip。
- 一個(gè)pod類似一個(gè)豌豆莢,包含一個(gè)或多個(gè)容器(通常是docker)
- 多個(gè)容器間共享IPC、Network和UTC namespace。
創(chuàng)建自主式pod (生產(chǎn)不推薦)
優(yōu)點(diǎn):
靈活性高:
- 可以精確控制 Pod 的各種配置參數(shù),包括容器的鏡像、資源限制、環(huán)境變量、命令和參數(shù)等,滿足特定的應(yīng)用需求。
學(xué)習(xí)和調(diào)試方便:
- 對(duì)于學(xué)習(xí) Kubernetes 的原理和機(jī)制非常有幫助,通過手動(dòng)創(chuàng)建 Pod 可以深入了解 Pod 的結(jié)構(gòu)和配置方式。在調(diào)試問題時(shí),可以更直接地觀察和調(diào)整 Pod 的設(shè)置。
適用于特殊場(chǎng)景:
- 在一些特殊情況下,如進(jìn)行一次性任務(wù)、快速驗(yàn)證概念或在資源受限的環(huán)境中進(jìn)行特定配置時(shí),手動(dòng)創(chuàng)建 Pod 可能是一種有效的方式。
缺點(diǎn):
管理復(fù)雜:
- 如果需要管理大量的 Pod,手動(dòng)創(chuàng)建和維護(hù)會(huì)變得非常繁瑣和耗時(shí)。難以實(shí)現(xiàn)自動(dòng)化的擴(kuò)縮容、故障恢復(fù)等操作。
缺乏高級(jí)功能:
- 無法自動(dòng)享受 Kubernetes 提供的高級(jí)功能,如自動(dòng)部署、滾動(dòng)更新、服務(wù)發(fā)現(xiàn)等。這可能導(dǎo)致應(yīng)用的部署和管理效率低下。
可維護(hù)性差:
- 手動(dòng)創(chuàng)建的 Pod 在更新應(yīng)用版本或修改配置時(shí)需要手動(dòng)干預(yù),容易出現(xiàn)錯(cuò)誤,并且難以保證一致性。相比之下,通過聲明式配置或使用 Kubernetes 的部署工具可以更方便地進(jìn)行應(yīng)用的維護(hù)和更新。
#查看所有pods [root@k8s-master ~]# kubectl get pods #建立一個(gè)名為test的pod [root@k8s-master ~]# kubectl run test --image nginx pod/timinglee created #查看所有pod [root@k8s-master ~]# kubectl get pods #顯示pod的較為詳細(xì)的信息 [root@k8s-master ~]# kubectl get pods -o wide
利用控制器管理 pod(推薦)
高可用性和可靠性:
自動(dòng)故障恢復(fù):
如果一個(gè) Pod 失敗或被刪除,控制器會(huì)自動(dòng)創(chuàng)建新的 Pod 來維持期望的副本數(shù)量。確保應(yīng)用始終處于可用狀態(tài),減少因單個(gè) Pod 故障導(dǎo)致的服務(wù)中斷。
健康檢查和自愈:
可以配置控制器對(duì) Pod 進(jìn)行健康檢查(如存活探針和就緒探針)。如果 Pod 不健康,控制器會(huì)采取適當(dāng)?shù)男袆?dòng),如重啟 Pod 或刪除并重新創(chuàng)建它,以保證應(yīng)用的正常運(yùn)行。
可擴(kuò)展性:
輕松擴(kuò)縮容:
可以通過簡(jiǎn)單的命令或配置更改來增加或減少 Pod 的數(shù)量,以滿足不同的工作負(fù)載需求。例如,在高流量期間可以快速擴(kuò)展以處理更多請(qǐng)求,在低流量期間可以縮容以節(jié)省資源。
水平自動(dòng)擴(kuò)縮容(HPA):
可以基于自定義指標(biāo)(如 CPU 利用率、內(nèi)存使用情況或應(yīng)用特定的指標(biāo))自動(dòng)調(diào)整 Pod 的數(shù)量,實(shí)現(xiàn)動(dòng)態(tài)的資源分配和成本優(yōu)化。
版本管理和更新:
滾動(dòng)更新:
對(duì)于 Deployment 等控制器,可以執(zhí)行滾動(dòng)更新來逐步替換舊版本的 Pod 為新版本,確保應(yīng)用在更新過程中始終保持可用??梢钥刂聘碌乃俾屎筒呗?,以減少對(duì)用戶的影響。
回滾:
如果更新出現(xiàn)問題,可以輕松回滾到上一個(gè)穩(wěn)定版本,保證應(yīng)用的穩(wěn)定性和可靠性。
聲明式配置:
簡(jiǎn)潔的配置方式:
使用 YAML 或 JSON 格式的聲明式配置文件來定義應(yīng)用的部署需求。這種方式使得配置易于理解、維護(hù)和版本控制,同時(shí)也方便團(tuán)隊(duì)協(xié)作。
期望狀態(tài)管理:
只需要定義應(yīng)用的期望狀態(tài)(如副本數(shù)量、容器鏡像等),控制器會(huì)自動(dòng)調(diào)整實(shí)際狀態(tài)與期望狀態(tài)保持一致。無需手動(dòng)管理每個(gè) Pod 的創(chuàng)建和刪除,提高了管理效率。
服務(wù)發(fā)現(xiàn)和負(fù)載均衡:
自動(dòng)注冊(cè)和發(fā)現(xiàn):
Kubernetes 中的服務(wù)(Service)可以自動(dòng)發(fā)現(xiàn)由控制器管理的 Pod,并將流量路由到它們。這使得應(yīng)用的服務(wù)發(fā)現(xiàn)和負(fù)載均衡變得簡(jiǎn)單和可靠,無需手動(dòng)配置負(fù)載均衡器。
流量分發(fā):
可以根據(jù)不同的策略(如輪詢、隨機(jī)等)將請(qǐng)求分發(fā)到不同的 Pod,提高應(yīng)用的性能和可用性。
多環(huán)境一致性:
一致的部署方式:
在不同的環(huán)境(如開發(fā)、測(cè)試、生產(chǎn))中,可以使用相同的控制器和配置來部署應(yīng)用,確保應(yīng)用在不同環(huán)境中的行為一致。這有助于減少部署差異和錯(cuò)誤,提高開發(fā)和運(yùn)維效率。
擴(kuò)(縮)容
1、建立控制器并自動(dòng)運(yùn)行pod
[root@k8s-master ~]# kubectl create deployment test --image nginx
2、擴(kuò)容
[root@k8s-master ~]# kubectl scale deployment test --replicas 4
3、縮容
[root@k8s-master ~]# kubectl scale deployment test --replicas 2
應(yīng)用版本的更新
1、利用控制器建立pod
[root@k8s-master ~]# kubectl create deployment test --image myapp:v1 --replicas 2
2、暴露端口
[root@k8s-master ~]# kubectl expose deployment test --port 80 --target-port 80
3、訪問服務(wù)查看現(xiàn)版本
[root@k8s-master ~]# curl 10.107.184.152
4、更新控制器鏡像版本
[root@k8s-master ~]# kubectl set image deployments/test myapp=myapp:v2
5、再次訪問查看現(xiàn)版本
[root@k8s-master ~]# curl 10.107.184.152
6、查看容器內(nèi)的歷史版本
[root@k8s-master ~]# kubectl rollout history deployment test
7、版本回滾
[root@k8s-master ~]# kubectl rollout undo deployment test --to-revision 1
利用yaml文件部署應(yīng)用
用yaml文件部署應(yīng)用有以下優(yōu)點(diǎn)
聲明式配置:
- 清晰表達(dá)期望狀態(tài):以聲明式的方式描述應(yīng)用的部署需求,包括副本數(shù)量、容器配置、網(wǎng)絡(luò)設(shè)置等。這使得配置易于理解和維護(hù),并且可以方便地查看應(yīng)用的預(yù)期狀態(tài)。
- 可重復(fù)性和版本控制:配置文件可以被版本控制,確保在不同環(huán)境中的部署一致性??梢暂p松回滾到以前的版本或在不同環(huán)境中重復(fù)使用相同的配置。
- 團(tuán)隊(duì)協(xié)作:便于團(tuán)隊(duì)成員之間共享和協(xié)作,大家可以對(duì)配置文件進(jìn)行審查和修改,提高部署的可靠性和穩(wěn)定性。
靈活性和可擴(kuò)展性:
- 豐富的配置選項(xiàng):可以通過 YAML 文件詳細(xì)地配置各種 Kubernetes 資源,如 Deployment、Service、ConfigMap、Secret 等??梢愿鶕?jù)應(yīng)用的特定需求進(jìn)行高度定制化。
- 組合和擴(kuò)展:可以將多個(gè)資源的配置組合在一個(gè)或多個(gè) YAML 文件中,實(shí)現(xiàn)復(fù)雜的應(yīng)用部署架構(gòu)。同時(shí),可以輕松地添加新的資源或修改現(xiàn)有資源以滿足不斷變化的需求。
與工具集成:
- 與 CI/CD 流程集成:可以將 YAML 配置文件與持續(xù)集成和持續(xù)部署(CI/CD)工具集成,實(shí)現(xiàn)自動(dòng)化的應(yīng)用部署。例如,可以在代碼提交后自動(dòng)觸發(fā)部署流程,使用配置文件來部署應(yīng)用到不同的環(huán)境。
- 命令行工具支持:Kubernetes 的命令行工具
kubectl
對(duì) YAML 配置文件有很好的支持,可以方便地應(yīng)用、更新和刪除配置。同時(shí),還可以使用其他工具來驗(yàn)證和分析 YAML 配置文件,確保其正確性和安全性。
資源清單參數(shù)
參數(shù)名稱 | 類型 | 參數(shù)說明 |
---|---|---|
version | String | 這里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查詢 |
kind | String | 這里指的是yaml文件定義的資源類型和角色,比如:Pod |
metadata | Object | 元數(shù)據(jù)對(duì)象,固定值就寫metadata |
metadata.name | String | 元數(shù)據(jù)對(duì)象的名字,這里由我們編寫,比如命名Pod的名字 |
metadata.namespace | String | 元數(shù)據(jù)對(duì)象的命名空間,由我們自身定義 |
Spec | Object | 詳細(xì)定義對(duì)象,固定值就寫Spec |
spec.containers[] | list | 這里是Spec對(duì)象的容器列表定義,是個(gè)列表 |
spec.containers[].name | String | 這里定義容器的名字 |
spec.containers[].image | string | 這里定義要用到的鏡像名稱 |
spec.containers[].imagePullPolicy | String | 定義鏡像拉取策略,有三個(gè)值可選: (1) Always: 每次都嘗試重新拉取鏡像 (2) IfNotPresent:如果本地有鏡像就使用本地鏡像,沒有則進(jìn)行拉取 (3) )Never:表示僅使用本地鏡像 |
spec.containers[].command[] | list | 指定容器運(yùn)行時(shí)啟動(dòng)的命令,若未指定則運(yùn)行容器打包時(shí)指定的命令 |
spec.containers[].args[] | list | 指定容器運(yùn)行參數(shù),可以指定多個(gè) |
spec.containers[].workingDir | String | 指定容器工作目錄 |
spec.containers[].volumeMounts[] | list | 指定容器內(nèi)部的存儲(chǔ)卷配置 |
spec.containers[].volumeMounts[].name | String | 指定可以被容器掛載的存儲(chǔ)卷的名稱 |
spec.containers[].volumeMounts[].mountPath | String | 指定可以被容器掛載的存儲(chǔ)卷的路徑 |
spec.containers[].volumeMounts[].readOnly | String | 設(shè)置存儲(chǔ)卷路徑的讀寫模式,ture或false,默認(rèn)為讀寫模式 |
spec.containers[].ports[] | list | 指定容器需要用到的端口列表 |
spec.containers[].ports[].name | String | 指定端口名稱 |
spec.containers[].ports[].containerPort | String | 指定容器需要監(jiān)聽的端口號(hào) |
spec.containers[] ports[].hostPort | String | 指定容器所在主機(jī)需要監(jiān)聽的端口號(hào),默認(rèn)跟上面containerPort相同,注意設(shè)置了hostPort同一臺(tái)主機(jī)無法啟動(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)境變量名稱 |
spec.containers[].env[].value | String | 指定環(huán)境變量值 |
spec.containers[].resources | Object | 指定資源限制和資源請(qǐng)求的值(這里開始就是設(shè)置容器的資源上限) |
spec.containers[].resources.limits | Object | 指定設(shè)置容器運(yùn)行時(shí)資源的運(yùn)行上限 |
spec.containers[].resources.limits.cpu | String | 指定CPU的限制,單位為核心數(shù),1=1000m |
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的重啟策略,默認(rèn)值為Always. (1)Always:Pod 一旦終止運(yùn)行,無論容器是如何終止的,kubelet服務(wù)都將重啟它 (2)OnFailure:只有Pod以非零退出碼終止時(shí),kubelet才會(huì)重啟該容器。如果容器正常結(jié)束(退出碼為0),則kubelet將不會(huì)重啟它 (3) Never:Pod終止后,kubelet將退出碼報(bào)告給Master,不會(huì)重啟該容器 |
spec.nodeSelector | Object | 定義Node的Label過濾標(biāo)簽,以key:value格式指定 |
spec.imagePullSecrets | Object | 定義pull鏡像時(shí)使用secret名稱,以name:secretkey格式指定 |
spec.hostNetwork | Boolean | 定義是否使用主機(jī)網(wǎng)絡(luò)模式,默認(rèn)值為false。設(shè)置true表示使用宿主機(jī)網(wǎng)絡(luò),不使用docker網(wǎng)橋,同時(shí)設(shè)置了true將無法在同一臺(tái)宿主機(jī) 上啟動(dòng)第二個(gè)副本 |
如何獲得資源幫助
[root@k8s-master yaml]# kubectl explain pod.spec.containers
編寫示例
示例1:運(yùn)行簡(jiǎn)單的單個(gè)容器pod
用命令獲取yaml模板
[root@k8s-master ~]# kubectl run test --image myapp:v1 --dry-run=client -o yaml > pod.yml
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test #pod標(biāo)簽 name: test #pod名稱 spec: containers: - image: myapp:v1 #pod鏡像 name: myapp #容器名稱
示例2:運(yùn)行多個(gè)容器pod
注意如果多個(gè)容器運(yùn)行在一個(gè)pod中,資源是共享的,如果同時(shí)使用相同的資源會(huì)產(chǎn)生干擾,比如端口
1、一個(gè)端口干擾示例:
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: timing name: timinglee spec: containers: - image: nginx:latest name: web1 - image: nginx:latest name: web2 [root@k8s-master ~]# kubectl apply -f pod.yml pod/timinglee created #使用yaml文件創(chuàng)建并運(yùn)行pod [root@k8s-master ~]# kubectl get pods -o wide #查看容器的詳細(xì)運(yùn)行信息
查看pod內(nèi)運(yùn)行的容器日志信息:
[root@k8s-master yaml]# kubectl logs test web2
2、正確示例:
在一個(gè)pod中開啟多個(gè)容器時(shí)一定要確保容器彼此不能互相干擾
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: containers: - image: nginx:latest name: web1 - image: busybox:latest name: busybox command: ["/bin/sh","-c","sleep 1000000"] [root@k8s-master ~]# kubectl get pods
示例3:理解pod間的網(wǎng)絡(luò)整合
同在一個(gè)pod中的容器公用一個(gè)網(wǎng)絡(luò)
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: containers: - image: myapp:v1 name: myapp1 - image: busyboxplus:latest name: busyboxplus command: ["/bin/sh","-c","sleep 1000000"] [root@k8s-master ~]# kubectl apply -f pod.yml pod/test created [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE test 2/2 Running 0 8s
效果演示:
[root@k8s-master ~]# kubectl exec test -c busyboxplus -- curl -s localhost
示例4:端口映射
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: containers: - image: myapp:v1 name: myapp1 ports: - name: http containerPort: 80 hostPort: 80 protocol: TCP #測(cè)試 [root@k8s-master ~]# kubectl apply -f pod.yml pod/test created [root@k8s-master yaml]# kubectl get pods -o wide
效果展示:
[root@k8s-master yaml]# curl k8s-node2
示例5:如何設(shè)定環(huán)境變量
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: containers: - image: busybox:latest name: busybox command: ["/bin/sh","-c","echo $NAME;sleep 3000000"] env: - name: NAME value: test [root@k8s-master ~]# kubectl apply -f pod.yml
效果演示:
[root@k8s-master yaml]# kubectl logs pods/test myapp
示例6:資源限制
資源限制會(huì)影響pod的Qos Class資源優(yōu)先級(jí),資源優(yōu)先級(jí)分為Guaranteed > Burstable > BestEffort
QoS(Quality of Service)即服務(wù)質(zhì)量
資源設(shè)定 優(yōu)先級(jí)類型 資源限定未設(shè)定 BestEffort 資源限定設(shè)定且最大和最小不一致 Burstable 資源限定設(shè)定且最大和最小一致 Guaranteed
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: containers: - image: myapp:v1 name: myapp resources: limits: #pod使用資源的最高限制 cpu: 500m memory: 100M requests: #pod期望使用資源量,不能大于limits cpu: 500m memory: 100M [root@k8s-master ~]# kubectl apply -f pod.yml pod/test created
效果展示:
[root@k8s-master yaml]# kubectl describe pods test
示例7:容器啟動(dòng)管理
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: restartPolicy: Always containers: - image: myapp:v1 name: myapp [root@k8s-master ~]# kubectl apply -f pod.yml pod/test created
效果演示:
[root@k8s-master yaml]# kubectl get pods -o wide #查看pod運(yùn)行的詳細(xì)信息,得知該pod在node2節(jié)點(diǎn)上 [root@k8s-node2 ~]# docker rm -f k8s_myapp_test_... #在該工作節(jié)點(diǎn)上刪除該容器 [root@k8s-node2 ~]# docker ps #列出正在運(yùn)行的容器
示例8:選擇運(yùn)行節(jié)點(diǎn)
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: nodeSelector: kubernetes.io/hostname: k8s-node1 restartPolicy: Always containers: - image: myapp:v1 name: myapp [root@k8s-master ~]# kubectl apply -f pod.yml pod/test created
效果演示:
[root@k8s-master yaml]# kubectl get pods -o wide
示例9:共享宿主機(jī)網(wǎng)絡(luò)
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: run: test name: test spec: hostNetwork: true restartPolicy: Always containers: - image: myapp:v1 name: myapp [root@k8s-master ~]# kubectl apply -f pod.yml pod/test created
效果演示:
[root@k8s-master yaml]# kubectl exec -it pods/test -c myapp -- /bin/sh
pod 的生命周期
INIT 容器
官方文檔:https://kubernetes.io/zh/docs/concepts/workloads/pods/
Pod 可以包含多個(gè)容器,應(yīng)用運(yùn)行在這些容器里面,同時(shí) Pod 也可以有一個(gè)或多個(gè)先于應(yīng)用容器啟動(dòng)前的 Init 容器。
Init 容器與普通的容器非常像,除了以下兩點(diǎn):
它們總是運(yùn)行到完成
init 容器不支持 Readiness,因?yàn)樗鼈儽仨氃?Pod 就緒之前運(yùn)行完成,每個(gè) Init 容器必須運(yùn)行成功,下一個(gè)才能夠運(yùn)行。
如果Pod的 Init 容器失敗,Kubernetes 會(huì)不斷地重啟該 Pod,直到 Init 容器成功為止。但是,如果 Pod 對(duì)應(yīng)的 restartPolicy 值為 Never,它不會(huì)重新啟動(dòng)。
INIT 容器的功能
- Init 容器可以包含一些安裝過程中應(yīng)用容器中不存在的實(shí)用工具或個(gè)性化代碼。
- Init 容器可以安全地運(yùn)行這些工具,避免這些工具導(dǎo)致應(yīng)用鏡像的安全性降低。
- 應(yīng)用鏡像的創(chuàng)建者和部署者可以各自獨(dú)立工作,而沒有必要聯(lián)合構(gòu)建一個(gè)單獨(dú)的應(yīng)用鏡像。
- Init 容器能以不同于Pod內(nèi)應(yīng)用容器的文件系統(tǒng)視圖運(yùn)行。因此,Init容器可具有訪問 Secrets 的權(quán)限,而應(yīng)用容器不能夠訪問。
- 由于 Init 容器必須在應(yīng)用容器啟動(dòng)之前運(yùn)行完成,因此 Init 容器提供了一種機(jī)制來阻塞或延遲應(yīng)用容器的啟動(dòng),直到滿足了一組先決條件。一旦前置條件滿足,Pod內(nèi)的所有的應(yīng)用容器會(huì)并行啟動(dòng)。
INIT 容器示例
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: name: initpod name: initpod spec: containers: - image: myapp:v1 name: myapp initContainers: #init容器 - name: init-myservice image: busybox command: ["sh","-c","until test -e /testfile;do echo wating for myservice; sleep 2;done"] [root@k8s-master ~]# kubectl apply -f pod.yml pod/initpod created
pod的狀態(tài):
[root@k8s-master yaml]# kubectl get pods #查看容器的狀態(tài) [root@k8s-master yaml]# kubectl logs initpod init-myservice #查看init容器的日志信息
滿足 init 容器條件,則容器正常運(yùn)行:
[root@k8s-master ~]# kubectl exec pods/initpod -c init --- /bin/sh -c "touch /testfile"
探針
探針是由 kubelet 對(duì)容器執(zhí)行的定期診斷:
- ExecAction:在容器內(nèi)執(zhí)行指定命令。如果命令退出時(shí)返回碼為 0 ,則認(rèn)為診斷成功。
- TCPSocketAction:對(duì)指定端口上的容器的 IP 地址進(jìn)行 TCP 檢查。如果端口打開,則診斷被認(rèn)為是成功的。
- HTTPGetAction:對(duì)指定的端口和路徑上的容器的 IP 地址執(zhí)行 HTTP Get 請(qǐng)求。如果響應(yīng)的狀態(tài)碼大于等于200 且小于 400,則診斷被認(rèn)為是成功的。
每次探測(cè)都將獲得以下三種結(jié)果之一:
- 成功:容器通過了診斷。
- 失敗:容器未通過診斷。
- 未知:診斷失敗,因此不會(huì)采取任何行動(dòng)。
Kubelet 可以選擇是否執(zhí)行在容器上運(yùn)行的三種探針執(zhí)行和做出反應(yīng):
- livenessProbe:指示容器是否正在運(yùn)行。如果探測(cè)到容器存活失敗,則 kubelet 會(huì)殺死容器,并且容器將受到其
重啟策略
的影響。如果容器不提供存活探針,則默認(rèn)狀態(tài)為 Success。 - readinessProbe:指示容器是否準(zhǔn)備好服務(wù)請(qǐng)求。如果就緒探測(cè)失敗,端點(diǎn)控制器將從與 該 Pod 匹配的所有 Service 的端點(diǎn)中刪除該 Pod 的 IP 地址。初始延遲之前的就緒狀態(tài)默認(rèn)為 Failure。如果容器不提供就緒探針,則默認(rèn)狀態(tài)為 Success。
- startupProbe:指示容器中的應(yīng)用是否已經(jīng)啟動(dòng)。如果提供了啟動(dòng)探測(cè)(startup probe),則禁用所有其他探測(cè),直到它成功為止。如果啟動(dòng)探測(cè)失敗,kubelet 將殺死容器,容器服從其
重啟策略
進(jìn)行重啟。如果容器沒有提供啟動(dòng)探測(cè),則默認(rèn)狀態(tài)為成功Success。
ReadinessProbe 與 LivenessProbe 的區(qū)別:
- ReadinessProbe 當(dāng)檢測(cè)失敗后,將 Pod 的 IP:Port 從對(duì)應(yīng)的 EndPoint 列表中刪除。
- LivenessProbe 當(dāng)檢測(cè)失敗后,將殺死容器并根據(jù) Pod 的重啟策略來決定作出對(duì)應(yīng)的措施。
StartupProbe 與 ReadinessProbe、LivenessProbe 的區(qū)別
- 如果三個(gè)探針同時(shí)存在,先執(zhí)行 StartupProbe 探針,其他兩個(gè)探針將會(huì)被暫時(shí)禁用,直到 pod 滿足 StartupProbe 探針配置的條件,其他 2 個(gè)探針啟動(dòng),如果不滿足按照規(guī)則重啟容器。
- 另外兩種探針在容器啟動(dòng)后,會(huì)按照配置,直到容器消亡才停止探測(cè),而 StartupProbe 探針只在容器運(yùn)行前進(jìn)行探測(cè),且探測(cè)成功后就停止探測(cè),不參與后續(xù)容器運(yùn)行。
探針示例
存活探針示例:
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: name: liveness name: liveness spec: containers: - image: myapp:v1 name: myapp livenessProbe: tcpSocket: #檢測(cè)端口存在性 port: 8080 initialDelaySeconds: 3 #容器啟動(dòng)后要等待多少秒后就探針開始工作,默認(rèn)是 0 periodSeconds: 1 #執(zhí)行探測(cè)的時(shí)間間隔,默認(rèn)為 10s timeoutSeconds: 1 #探針執(zhí)行檢測(cè)請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間,默認(rèn)為 1s [root@k8s-master ~]# kubectl apply -f pod.yml pod/liveness created
查看pod的狀態(tài):
[root@k8s-master yaml]# kubectl get pods
查看其pod的描述信息:
[root@k8s-master yaml]# kubectl describe pods liveness
將其端口號(hào)改為80端口,探測(cè)成功,則運(yùn)行容器:
[root@k8s-master yaml]# kubectl describe pods liveness
就緒探針示例:
[root@k8s-master ~]# vim pod.yml apiVersion: v1 kind: Pod metadata: labels: name: readiness name: readiness spec: containers: - image: myapp:v1 name: myapp readinessProbe: httpGet: path: /test.html port: 80 initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 1 [root@k8s-master ~]# kubectl apply -f pod.yml pod/liveness created
查看其pod狀態(tài):
[root@k8s-master yaml]# kubectl get pods
查看其pod詳細(xì)描述信息:
root@k8s-master yaml]# kubectl describe pods readness
滿足探測(cè)條件,則Pod運(yùn)行成功:
[root@k8s-master ~]# kubectl exec pods/readiness -c myapp -- /bin/sh -c "echo test > /usr/share/nginx/html/test.html"
總結(jié)
到此這篇關(guān)于K8s學(xué)習(xí)之Pod的定義及詳細(xì)資源調(diào)用案例的文章就介紹到這了,更多相關(guān)K8s Pod定義及資源調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
k8s中如何實(shí)現(xiàn)pod自動(dòng)擴(kuò)縮容詳解
在實(shí)際生產(chǎn)系統(tǒng)中,經(jīng)常會(huì)遇到某個(gè)服務(wù)需要擴(kuò)容的場(chǎng)景,可能會(huì)遇到由于資源緊張或者工作負(fù)載降低而需要減少服務(wù)實(shí)例數(shù)量的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于k8s中如何實(shí)現(xiàn)pod自動(dòng)擴(kuò)縮容的相關(guān)資料,需要的朋友可以參考下2022-08-08centos搭建k8s環(huán)境詳細(xì)步驟及常用命令
kubernetes是google開源的容器集群管理系統(tǒng),提供應(yīng)用部署、維護(hù)、擴(kuò)展機(jī)制等功能,利用kubernetes能方便管理跨集群運(yùn)行容器化的應(yīng)用,這篇文章主要給大家介紹了關(guān)于centos搭建k8s環(huán)境詳細(xì)步驟及常用命令的相關(guān)資料,需要的朋友可以參考下2024-01-01在?k8s?中部署Jenkins的實(shí)踐指南(最新推薦)
本文介紹了在Kubernetes(K8s)中部署Jenkins的方法和步驟,包括準(zhǔn)備K8s集群、選擇Jenkins鏡像、創(chuàng)建存儲(chǔ)資源、賬號(hào)授權(quán)、部署Jenkins、創(chuàng)建Service以及訪問測(cè)試,Jenkins在K8s中的部署可以實(shí)現(xiàn)動(dòng)態(tài)資源管理、提高可靠性和容錯(cuò)能力、快速響應(yīng)變化和統(tǒng)一環(huán)境等優(yōu)勢(shì)2025-03-03kubernetes?Volume存儲(chǔ)卷configMap學(xué)習(xí)筆記
這篇文章主要為大家介紹了kubernetes?Volume存儲(chǔ)卷configMap學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Rancher部署配置開源Rainbond云原生應(yīng)用管理平臺(tái)
這篇文章主要為大家介紹了Rancher部署配置開源Rainbond云原生應(yīng)用管理平臺(tái),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04K8s解決主機(jī)重啟后kubelet無法自動(dòng)啟動(dòng)問題(推薦)
在安裝配置好Kubernetes后,正常情況下服務(wù)器關(guān)機(jī)重啟,kubelet也會(huì)自動(dòng)啟動(dòng)的,如何解決這個(gè)問題呢,下面小編給大家?guī)砹薑8s解決主機(jī)重啟后kubelet無法自動(dòng)啟動(dòng)問題,感興趣的朋友一起看看吧2022-08-08K8s中Pod處于Pending狀態(tài)的八種原因分析
文章詳細(xì)介紹了Pod處于Pending狀態(tài)的八種常見原因,并提供了相應(yīng)的排查和解決方法,這些原因包括資源不足、調(diào)度約束、存儲(chǔ)依賴、鏡像問題、配額限制、網(wǎng)絡(luò)暗礁、系統(tǒng)級(jí)異常以及冷門陷阱,每種原因都附帶了具體的診斷方法和解決建議,感興趣的朋友一起看看吧2025-02-02