1 Pod 特點
Pod是kubernetes中你可以創(chuàng)建和部署的最小也是最簡的單位,一個Pod代表著集群中運行的一個進程。
Pod中封裝著應用的容器(有的情況下是好幾個容器),存儲、獨立的網(wǎng)絡IP,管理容器如何運行的策略選項,Pod代表著部署的一個單位:kubernetes中應用的一個實例,可能由一個或者多個容器組合在一起共享資源。
Pod有兩個必須知道的特點
1.1 網(wǎng)絡
每一個Pod都會被指派一個唯一的Ip地址,在Pod中的每一個容器共享網(wǎng)絡命名空間,包括Ip地址和網(wǎng)絡端口,在同一個Pod中的容器可以同locahost進行互相通信,當Pod中的容器需要與Pod外的實體進行通信時,則需要通過端口等共享的網(wǎng)絡資源。
1.2 存儲
Pod能夠配置共享存儲卷,在Pod中所有的容器能夠訪問共享存儲卷,允許這些容器共享數(shù)據(jù),存儲卷也允許在一個Pod持久化數(shù)據(jù),以防止其中的容器需要被重啟。
2 使用方式
2.1 自主式Pod
這種Pod本身是不能自我修復的,當Pod被創(chuàng)建后(不論是由你直接創(chuàng)建還是被其他Controller),都會被Kuberentes調度到集群的Node上,直到Pod的進程終止、被刪掉、因為缺少資源而被驅逐、或者Node故障之前這個Pod都會一直保持在那個Node上,Pod不會自愈。
如果Pod運行的Node故障,或者是調度器本身故障,這個Pod就會被刪除,同樣的,如果Pod所在Node缺少資源或者Pod處于維護狀態(tài),Pod也會被驅逐。
2.2 控制器管理的Pod
Kubernetes使用更高級的稱為Controller的抽象層,來管理Pod實例,Controller可以創(chuàng)建和管理多個Pod,提供副本管理、滾動升級和集群級別的自愈能力。
例如,如果一個Node故障,Controller就能自動將該節(jié)點上的Pod調度到其他健康的Node上。雖然可以直接使用Pod,但是在Kubernetes中通常是使用Controller來管理Pod的
3 自主運行Pod
3.1 創(chuàng)建資源清單
通過yaml文件或者json描述Pod和其內容器的運行環(huán)境和期望狀態(tài),例如一個最簡單的運行nginx應用的pod,定義如下
vi nginx-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
ports:
- containerPort: 80
3.1.1 參數(shù)描述
下面簡要分析一下上面的Pod定義文件:
- apiVersion: 使用哪個版本的Kubernetes API來創(chuàng)建此對象
- kind:要創(chuàng)建的對象類型,例如Pod,Deployment等
- metadata:用于唯一區(qū)分對象的元數(shù)據(jù),包括:name,UID和namespace
- labels:是一個個的key/value對,定義這樣的label到Pod后,其他控制器對象可以通過這樣的label來定位到此Pod,從而對Pod進行管理。(參見Deployment等控制器對象)
- spec: 其它描述信息,包含Pod中運行的容器,容器中運行的應用等等。不同類型的對象擁有不同的spec定義。詳情參見API文檔
3.2 創(chuàng)建Pod
使用
kubectl
創(chuàng)建pod
kubectl apply -f nginx-pod.yml
3.3 Pod操作
3.3.1 查看Pod列表
kubectl get pods
可以通過增加
-o wide
查看詳細信息
kubectl get pods -o wide
3.3.2 查看描述信息
可以通過
describe
查看pod的詳細信息
kubectl describe pod nginx
3.3.3 訪問pod
可以通過
k8s
創(chuàng)建的虛擬IP進行訪問,可以在k8s的任何一個節(jié)點訪問
curl 10.244.1.10
3.3.4 刪除Pod
可以使用
delete
刪除Pod,刪除后不能進行恢復
kubectl delete pod nginx
4 控制器運行Pod
Pod本身不具備容錯性,這意味著如果Pod運行的Node宕機了,那么該Pod無法恢復,因此推薦使用Deployment等控制器來創(chuàng)建Pod并管理。
4.1 創(chuàng)建資源清單
通過yaml文件或者json描述Pod和其內容器的運行環(huán)境和期望狀態(tài),例如一個最簡單的運行nginx應用的pod,定義如下
vi nginx-pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
ports:
- containerPort: 80
4.2 參數(shù)描述
下面簡要分析一下上面的Pod定義文件:
4.2.1 Replicas
副本數(shù)量
spec.replicas 是可以選字段,指定期望的pod數(shù)量,默認是1。
4.2.2 Selector
標簽選擇器
.spec.selector是可選字段,用來指定 label selector ,圈定Deployment管理的pod范圍。如果被指定, .spec.selector 必須匹配 .spec.template.metadata.labels,否則它將被API拒絕。如果 .spec.selector 沒有被指定, .spec.selector.matchLabels 默認是.spec.template.metadata.labels。
在Pod的template跟.spec.template不同或者數(shù)量超過了.spec.replicas規(guī)定的數(shù)量的情況下,Deployment會殺掉label跟selector不同的Pod。
4.2.3 Pod Template
Pod模板,.spec.template 是 .spec中唯一要求的字段。
.spec.template 是 pod template,它跟 Pod有一模一樣的schema,除了它是嵌套的并且不需要apiVersion 和 kind字段。
另外為了劃分Pod的范圍,Deployment中的pod template必須指定適當?shù)膌abel(不要跟其他controller重復了,參考selector)和適當?shù)闹貑⒉呗浴?
.spec.template.spec.restartPolicy 可以設置為 Always , 如果不指定的話這就是默認配置。
4.3 創(chuàng)建Pod
kubectl apply -f nginx-pod.yml
kubectl get pods -o wide
創(chuàng)建后發(fā)現(xiàn),有兩個nginx的pod在運行,符合我們的預期
4.4 Pod操作
4.4.1 刪除Pod
這里可以嘗試刪除Pod
kubectl delete pod nginx-deployment-f77774fc5-cgs82
# 查看Pod詳情
kubectl get pods -o wide
刪除Pod后發(fā)現(xiàn)重新新建了一個Pod,這是因為有控制器發(fā)現(xiàn)少了一個Pod就會進行重新拉起來一個
5 鏡像拉取策略
pod的鏡像拉取策略分為三種:
- always(總是從官方下載鏡像)
- never(從不下載鏡像)
- ifnotpresent(如果本地沒有鏡像就從官方下載鏡像)。
Kubernetes集群默認使用IfNotPresent策略
5.1 always
不管是否存在本地鏡像,總是從遠程倉庫下載
5.1.1 修改資源清單
我們可以通過修改配置清單來配置不同的策略
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
imagePullPolicy: Always
ports:
- containerPort: 80
5.1.2 生效配置
kubectl apply -f nginx-pod.yml
5.1.3 查看創(chuàng)建過程
kubectl describe pod nginx-deployment
可以清楚的看到重新下載而沒有使用本地鏡像
5.2 IfNotPresent
Kubernetes集群的默認策略,如果有本地鏡像就使用,沒有則從遠程倉庫下載
5.2.1 修改資源清單
我們可以通過修改配置清單來配置不同的策略
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
5.2.2 生效配置
kubectl apply -f nginx-pod.yml
5.2.3 查看創(chuàng)建過程
kubectl describe pod nginx-deployment
可以清楚的看到?jīng)]有重新下載鏡像而是使用本地的鏡像。
6 Pod生命周期
6.1 各個階段
POD中明確規(guī)定了如下幾個階段
狀態(tài)值 | 說明 |
---|---|
掛起(Pending) |
Pod 已被 Kubernetes 系統(tǒng)接受,但有一個或者多個容器鏡像尚未創(chuàng)建,等待時間包括調度 Pod 的時間和通過網(wǎng)絡下載鏡像的時間。 |
運行中(Running) |
該 Pod 已經(jīng)綁定到了一個節(jié)點上,Pod 中所有的容器都已被創(chuàng)建。至少有一個容器正在運行,或者正處于啟動或重啟狀態(tài)。 |
成功(Succeeded) |
Pod 中的所有容器都被成功終止,并且不會再重啟。 |
失?。‵ailed) |
Pod 中的所有容器都已終止了,并且至少有一個容器是因為失敗終止。也就是說,容器以非0狀態(tài)退出或者被系統(tǒng)終止。 |
未知(Unknown) |
因為某些原因無法取得 Pod 的狀態(tài),通常是因為與 Pod 所在主機通信失敗。 |
實際上還有一中狀態(tài)Terminating,在代碼和文檔中都沒有說明,但卻是存在。這種情況出現(xiàn)雜無法獲取所在主機的資源情況,一直在嘗試建立連接。
6.2 Pod重啟策略
在Pod中的容器可能會由于異常等原因導致其終止退出,Kubernetes提供了重啟策略以重啟容器。
Pod通過`restartPolicy`字段指定重啟策略,重啟策略類型為:Always、OnFailure 和 Never,默認為 Always。
重啟策略對同一個Pod的所有容器起作用,容器的重啟由Node上的kubelet執(zhí)行。Pod支持三種重啟策略,在配置文件中通過`restartPolicy`字段設置重啟策略:
重啟策略 | 說明 |
---|---|
Always | 當容器失效時,由kubelet自動重啟該容器 |
OnFailure | 當容器終止運行且退出碼不為0時,由kubelet自動重啟該容器 |
Never | 不論容器運行狀態(tài)如何,kubelet都不會重啟該容器 |
注意:這里的重啟是指在Pod的宿主Node上進行本地重啟,而不是調度到其它Node上。
6.3 Pod狀態(tài)轉換
Pod的容器數(shù) | Pod當前狀態(tài) | 發(fā)生的事件 | Pod結果狀態(tài) | ||
---|---|---|---|---|---|
RestartPolicy=Always | RestartPolicy=OnFailure | RestartPolicy=Never | |||
包含一個容器 | Running | 容器成功退出 | Running | Succeeded | Succeeded |
包含一個容器 | Running | 容器失敗退出 | Running | Running | Failure |
包含兩個容器 | Running | 1個容器失敗退出 | Running | Running | Running |
包含兩個容器 | Running | 容器被OOM殺掉 | Running | Running | Failure |
6.4 生命周期行為
6.4.1 初始化容器
初始化容器(
init container
)即應用程序的主容器啟動之前要運行的容器,常用于為主容器執(zhí)行一些預置操作,它們具有兩種典型特征。
- 初始化容器必須運行完成直至結束,若某初始化容器運行失敗,那么
kubernetes
需要重啟它直到成功完成。(注意:如果pod
的spec.restartPolicy
字段值為“Never
”,那么運行失敗的初始化容器不會被重啟。) - 每個初始化容器都必須按定義的順序串行運行。
6.4.2 容器探測
容器探測(
container probe
)是Pod
對象生命周期中的一項重要的日常任務,它是kubelet
對容器周期性執(zhí)行的健康狀態(tài)診斷,診斷操作由容器的處理器(handler
)進行定義,Kubernetes
支持三種處理器用于Pod
探測:文章來源:http://www.zghlxwxcb.cn/news/detail-718574.html
-
ExecAction
:在容器內執(zhí)行指定命令,并根據(jù)其返回的狀態(tài)碼進行診斷的操作稱為Exec
探測,狀態(tài)碼為0
表示成功,否則即為不健康狀態(tài)。 -
TCPSocketAction
:通過與容器的某TCP
端口嘗試建立連接進行診斷,端口能夠成功打開即為正常,否則為不健康狀態(tài)。 -
HTTPGetAction
:通過向容器IP
地址的某指定端口的指定path
發(fā)起HTTP GET
請求進行診斷,響應碼為2xx
或3xx
時即為成功,否則為失敗。
任何一種探測方式都可能存在三種結果:
“Success”(成功)
、“Failure”(失?。?/code>、
“Unknown”(未知)
,只有success
表示成功通過檢測。文章來源地址http://www.zghlxwxcb.cn/news/detail-718574.html
到了這里,關于Kubernetes(k8s)容器編排Pod介紹和使用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!