欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

K8s學(xué)習(xí)之Pod的定義及詳細(xì)資源調(diào)用案例

 更新時間:2024年09月16日 11:13:26   作者:雨凝1213  
Kubernetes將所有內(nèi)容抽象為資源,通過操作資源管理集群,核心單元是Pod,通過控制器管理Pod,資源管理分為命令式對象管理、命令式對象配置和聲明式對象配置,各有適用場景,需要的朋友可以參考下

資源管理介紹

  • 在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

常用資源類型

資源分類資源名稱縮寫資源作用
集群級別資源nodesno集群組成部分
namespacesns隔離pod
pod資源podspo裝載容器
pod資源控制器replicationcontrollersrc控制pod資源
replicasetsrs控制pod資源
deploymentsdeploy控制pod資源
daemonsetsds控制pod資源
jobs控制pod資源
cronjobscj控制pod資源
horizontalpodautoscalershpa控制pod資源
statefulsetssts控制pod資源
服務(wù)發(fā)現(xiàn)資源servicessvc統(tǒng)一pod對外接口
ingressing統(tǒng)一pod對外接口
存儲資源volumeattachments存儲
persistentvolumespv存儲
persistentvolumeclaimspvc存儲
配置資源configmapscm配置
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ù)說明
versionString這里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查詢
kindString這里指的是yaml文件定義的資源類型和角色,比如:Pod
metadataObject元數(shù)據(jù)對象,固定值就寫metadata
metadata.nameString元數(shù)據(jù)對象的名字,這里由我們編寫,比如命名Pod的名字
metadata.namespaceString元數(shù)據(jù)對象的命名空間,由我們自身定義
SpecObject詳細(xì)定義對象,固定值就寫Spec
spec.containers[]list這里是Spec對象的容器列表定義,是個列表
spec.containers[].nameString這里定義容器的名字
spec.containers[].imagestring這里定義要用到的鏡像名稱
spec.containers[].imagePullPolicyString定義鏡像拉取策略,有三個值可選:
(1) Always: 每次都嘗試重新拉取鏡像
(2) IfNotPresent:如果本地有鏡像就使用本地鏡像,沒有則進行拉取
(3) )Never:表示僅使用本地鏡像
spec.containers[].command[]list指定容器運行時啟動的命令,若未指定則運行容器打包時指定的命令
spec.containers[].args[]list指定容器運行參數(shù),可以指定多個
spec.containers[].workingDirString指定容器工作目錄
spec.containers[].volumeMounts[]list指定容器內(nèi)部的存儲卷配置
spec.containers[].volumeMounts[].nameString指定可以被容器掛載的存儲卷的名稱
spec.containers[].volumeMounts[].mountPathString指定可以被容器掛載的存儲卷的路徑
spec.containers[].volumeMounts[].readOnlyString設(shè)置存儲卷路徑的讀寫模式,ture或false,默認(rèn)為讀寫模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].nameString指定端口名稱
spec.containers[].ports[].containerPortString指定容器需要監(jiān)聽的端口號
spec.containers[] ports[].hostPortString指定容器所在主機需要監(jiān)聽的端口號,默認(rèn)跟上面containerPort相同,注意設(shè)置了hostPort同一臺主機無法啟動該容器的相同副本(因為主機的端口號不能相同,這樣會沖突)
spec.containers[].ports[].protocolString指定端口協(xié)議,支持TCP和UDP,默認(rèn)值為 TCP
spec.containers[].env[]list指定容器運行前需設(shè)置的環(huán)境變量列表
spec.containers[].env[].nameString指定環(huán)境變量名稱
spec.containers[].env[].valueString指定環(huán)境變量值
spec.containers[].resourcesObject指定資源限制和資源請求的值(這里開始就是設(shè)置容器的資源上限)
spec.containers[].resources.limitsObject指定設(shè)置容器運行時資源的運行上限
spec.containers[].resources.limits.cpuString指定CPU的限制,單位為核心數(shù),1=1000m
spec.containers[].resources.limits.memoryString指定MEM內(nèi)存的限制,單位為MIB、GiB
spec.containers[].resources.requestsObject指定容器啟動和調(diào)度時的限制設(shè)置
spec.containers[].resources.requests.cpuStringCPU請求,單位為core數(shù),容器啟動時初始化可用數(shù)量
spec.containers[].resources.requests.memoryString內(nèi)存請求,單位為MIB、GIB,容器啟動的初始化可用數(shù)量
spec.restartPolicystring定義Pod的重啟策略,默認(rèn)值為Always.
(1)Always:Pod 一旦終止運行,無論容器是如何終止的,kubelet服務(wù)都將重啟它
(2)OnFailure:只有Pod以非零退出碼終止時,kubelet才會重啟該容器。如果容器正常結(jié)束(退出碼為0),則kubelet將不會重啟它
(3) Never:Pod終止后,kubelet將退出碼報告給Master,不會重啟該容器
spec.nodeSelectorObject定義Node的Label過濾標(biāo)簽,以key:value格式指定
spec.imagePullSecretsObject定義pull鏡像時使用secret名稱,以name:secretkey格式指定
spec.hostNetworkBoolean定義是否使用主機網(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)文章

  • k8s常用命令大全(最新推薦)

    k8s常用命令大全(最新推薦)

    這篇文章主要介紹了k8s常用命令大全,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • k8s設(shè)置非強一致反親和性示例

    k8s設(shè)置非強一致反親和性示例

    這篇文章主要為大家介紹了k8s設(shè)置非強一致反親和性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • k8s中如何實現(xiàn)pod自動擴縮容詳解

    k8s中如何實現(xiàn)pod自動擴縮容詳解

    在實際生產(chǎn)系統(tǒng)中,經(jīng)常會遇到某個服務(wù)需要擴容的場景,可能會遇到由于資源緊張或者工作負(fù)載降低而需要減少服務(wù)實例數(shù)量的場景,下面這篇文章主要給大家介紹了關(guān)于k8s中如何實現(xiàn)pod自動擴縮容的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • centos搭建k8s環(huán)境詳細(xì)步驟及常用命令

    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-01
  • 在?k8s?中部署Jenkins的實踐指南(最新推薦)

    在?k8s?中部署Jenkins的實踐指南(最新推薦)

    本文介紹了在Kubernetes(K8s)中部署Jenkins的方法和步驟,包括準(zhǔn)備K8s集群、選擇Jenkins鏡像、創(chuàng)建存儲資源、賬號授權(quán)、部署Jenkins、創(chuàng)建Service以及訪問測試,Jenkins在K8s中的部署可以實現(xiàn)動態(tài)資源管理、提高可靠性和容錯能力、快速響應(yīng)變化和統(tǒng)一環(huán)境等優(yōu)勢
    2025-03-03
  • kubernetes?Volume存儲卷configMap學(xué)習(xí)筆記

    kubernetes?Volume存儲卷configMap學(xué)習(xí)筆記

    這篇文章主要為大家介紹了kubernetes?Volume存儲卷configMap學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Rancher部署配置開源Rainbond云原生應(yīng)用管理平臺

    Rancher部署配置開源Rainbond云原生應(yīng)用管理平臺

    這篇文章主要為大家介紹了Rancher部署配置開源Rainbond云原生應(yīng)用管理平臺,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • 從小飯館客流量變大論云原生負(fù)載均衡

    從小飯館客流量變大論云原生負(fù)載均衡

    這篇文章主要為大家介紹了從小飯館客流量變大來討論云原生負(fù)載均衡,為大家做出更生動易懂的云原生解釋說明有需要的朋友可以借鑒參考下
    2022-03-03
  • K8s解決主機重啟后kubelet無法自動啟動問題(推薦)

    K8s解決主機重啟后kubelet無法自動啟動問題(推薦)

    在安裝配置好Kubernetes后,正常情況下服務(wù)器關(guān)機重啟,kubelet也會自動啟動的,如何解決這個問題呢,下面小編給大家?guī)砹薑8s解決主機重啟后kubelet無法自動啟動問題,感興趣的朋友一起看看吧
    2022-08-08
  • K8s中Pod處于Pending狀態(tài)的八種原因分析

    K8s中Pod處于Pending狀態(tài)的八種原因分析

    文章詳細(xì)介紹了Pod處于Pending狀態(tài)的八種常見原因,并提供了相應(yīng)的排查和解決方法,這些原因包括資源不足、調(diào)度約束、存儲依賴、鏡像問題、配額限制、網(wǎng)絡(luò)暗礁、系統(tǒng)級異常以及冷門陷阱,每種原因都附帶了具體的診斷方法和解決建議,感興趣的朋友一起看看吧
    2025-02-02

最新評論