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