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

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

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

資源管理介紹

  • 在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í)別資源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對(duì)外接口
ingressing統(tǒng)一pod對(duì)外接口
存儲(chǔ)資源volumeattachments存儲(chǔ)
persistentvolumespv存儲(chǔ)
persistentvolumeclaimspvc存儲(chǔ)
配置資源configmapscm配置
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ù)說明
versionString這里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查詢
kindString這里指的是yaml文件定義的資源類型和角色,比如:Pod
metadataObject元數(shù)據(jù)對(duì)象,固定值就寫metadata
metadata.nameString元數(shù)據(jù)對(duì)象的名字,這里由我們編寫,比如命名Pod的名字
metadata.namespaceString元數(shù)據(jù)對(duì)象的命名空間,由我們自身定義
SpecObject詳細(xì)定義對(duì)象,固定值就寫Spec
spec.containers[]list這里是Spec對(duì)象的容器列表定義,是個(gè)列表
spec.containers[].nameString這里定義容器的名字
spec.containers[].imagestring這里定義要用到的鏡像名稱
spec.containers[].imagePullPolicyString定義鏡像拉取策略,有三個(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[].workingDirString指定容器工作目錄
spec.containers[].volumeMounts[]list指定容器內(nèi)部的存儲(chǔ)卷配置
spec.containers[].volumeMounts[].nameString指定可以被容器掛載的存儲(chǔ)卷的名稱
spec.containers[].volumeMounts[].mountPathString指定可以被容器掛載的存儲(chǔ)卷的路徑
spec.containers[].volumeMounts[].readOnlyString設(shè)置存儲(chǔ)卷路徑的讀寫模式,ture或false,默認(rèn)為讀寫模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].nameString指定端口名稱
spec.containers[].ports[].containerPortString指定容器需要監(jiān)聽的端口號(hào)
spec.containers[] ports[].hostPortString指定容器所在主機(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[].protocolString指定端口協(xié)議,支持TCP和UDP,默認(rèn)值為 TCP
spec.containers[].env[]list指定容器運(yùn)行前需設(shè)置的環(huán)境變量列表
spec.containers[].env[].nameString指定環(huán)境變量名稱
spec.containers[].env[].valueString指定環(huán)境變量值
spec.containers[].resourcesObject指定資源限制和資源請(qǐng)求的值(這里開始就是設(shè)置容器的資源上限)
spec.containers[].resources.limitsObject指定設(shè)置容器運(yùn)行時(shí)資源的運(yùn)行上限
spec.containers[].resources.limits.cpuString指定CPU的限制,單位為核心數(shù),1=1000m
spec.containers[].resources.limits.memoryString指定MEM內(nèi)存的限制,單位為MIB、GiB
spec.containers[].resources.requestsObject指定容器啟動(dòng)和調(diào)度時(shí)的限制設(shè)置
spec.containers[].resources.requests.cpuStringCPU請(qǐng)求,單位為core數(shù),容器啟動(dòng)時(shí)初始化可用數(shù)量
spec.containers[].resources.requests.memoryString內(nèi)存請(qǐng)求,單位為MIB、GIB,容器啟動(dòng)的初始化可用數(shù)量
spec.restartPolicystring定義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.nodeSelectorObject定義Node的Label過濾標(biāo)簽,以key:value格式指定
spec.imagePullSecretsObject定義pull鏡像時(shí)使用secret名稱,以name:secretkey格式指定
spec.hostNetworkBoolean定義是否使用主機(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常用命令大全(最新推薦)

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

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

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

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

    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-08
  • centos搭建k8s環(huán)境詳細(xì)步驟及常用命令

    centos搭建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í)踐指南(最新推薦)

    在?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-03
  • kubernetes?Volume存儲(chǔ)卷configMap學(xué)習(xí)筆記

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

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

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

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

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

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

    K8s解決主機(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-08
  • K8s中Pod處于Pending狀態(tài)的八種原因分析

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

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

最新評(píng)論