1 概述
Pod是K8S系統(tǒng)中可以創(chuàng)建和管理的最小單元,是資源對象模型中由用戶創(chuàng)建或部署的最小資源對象模型
有許多組件圍繞Pod進行擴展和支持,比如控制器對象是用來管控Pod對象的,Service或者Ingress資源對象是用來暴露Pod引用對象的,PersistentVolume資源對象是用來為Pod提供存儲等。
1.1 Pod結(jié)構
Pod是多進程設計,一個Pod里面包含多個容器,而一個容器里面運行一個應用程序。
每個Pod都有一個特殊的被稱為 “根容器”的Pause容器。Pause容器對應的鏡像屬于Kubernetes平臺的一部分,為其他的業(yè)務容器作支撐。一般把業(yè)務相關聯(lián)的容器放到一個pod里,從而方便相關容器之間網(wǎng)絡互通和文件共享。
1.2 實現(xiàn)機制
Pod實現(xiàn)主要依賴于共享網(wǎng)絡和共享存儲兩大機制
-
共享網(wǎng)絡:docker創(chuàng)建的容器由于namespace和group而相互隔離的,在創(chuàng)建業(yè)務容器時會注冊到
pause容器
中從而共享其 ip地址,mac地址,port 等信息,這樣便處于同一個網(wǎng)絡中實現(xiàn)網(wǎng)絡的共享。 -
共享存儲:如下所示,每個容器會掛載到公共的
數(shù)據(jù)卷Volume
上,然后其數(shù)據(jù)都持久化存儲到其中,當一個容器掛掉后,新的容器也能從Volume讀取到之前的數(shù)據(jù)
apiversion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
-name: write
image: centos
command: ["bash", "-u","for i in {1..100};do echo $i ? /data/hello;sleep 1;done"]
# 掛載數(shù)據(jù)卷
volumeMounts:
-name: data
mountPath: /data
-name: read
image: centos
command: [“bash",”-c","tail -f /data/hello"]
# 掛載數(shù)據(jù)卷
volumeMounts:
-name: data
mountPath: /data
# 定義數(shù)據(jù)卷
volumes:
-name: data
emptyDir: {}
2 Pod機制
2.1 鏡像拉取策略
Pod的拉取策略主要分為了以下幾種
- IfNotPresent:默認值,鏡像在宿主機上不存在才拉取
- Always:每次創(chuàng)建Pod都會重新拉取一次鏡像
- Never:Pod永遠不會主動拉取這個鏡像
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
-name: nginx
image: nginx:1.14
# 拉取策略
imagePullPolicy: Always
2.2 Pod資源限制
Pod在進行調(diào)度時,可以在調(diào)度器對資源的分配進行設置。例如限制使用的資源是 2C4G,那么在調(diào)度到對應的node節(jié)點時,只會占用對應的資源,對于不滿足資源的節(jié)點則會跳過。
有兩種資源配置的方式:
- request:表示調(diào)度所需最少的資源
- limits:表示最多允許使用的資源
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL__ROOT_PASSWORD
value: "password"
resources:
# 資源限制
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
2.3 Pod重啟機制
當Pod中的容器出現(xiàn)問題時就會觸發(fā)重啟機制,重啟策略主要分為以下三種
- Always:當容器終止退出后,總是重啟容器,默認策略 【nginx等,需要不斷提供服務】
- OnFailure:當容器異常退出(退出狀態(tài)碼非0)時,才重啟容器。
- Never:當容器終止退出,從不重啟容器
apiVersion: v1
kind: Pod
metadata:
name: dns-test
spec:
containers:
- name: busybox
image: busybox:1.28
args:
- /bin/sh
- -c
- sleep 33000
# 重啟策略
restartPolicy: Never
2.4 Pod健康檢查
通過容器檢查來判斷服務是否可用,共有兩種檢查方式:存活檢查livenessProbe,如果檢查失敗,將殺死容器,根據(jù)Pod的restartPolicy來操作;就緒檢查readinessProbe,如果檢查失敗,Kubernetes會把Pod從Service endpoints中剔除
Probe支持以下三種檢查方式
- http Get:發(fā)送HTTP請求,返回200 - 400 范圍狀態(tài)碼為成功
- exec:執(zhí)行Shell命令返回狀態(tài)碼是0為成功
- tcpSocket:發(fā)起TCP Socket建立成功
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30;
# 通過exec來執(zhí)行存活檢查
livenessProbe:
exec:
command:
-cat
-/tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
3 調(diào)度策略
創(chuàng)建Pod流程如下:
- 首先創(chuàng)建一個pod,然后創(chuàng)建一個API Server 和 Etcd,把創(chuàng)建出來的信息存儲在etcd中
- 然后創(chuàng)建 Scheduler,監(jiān)控API Server是否有新的Pod,如果有的話,會通過調(diào)度算法把pod調(diào)度具體node上
- 在node節(jié)點,會通過
kubelet -- apiserver
讀取etcd 拿到分配在當前node節(jié)點pod信息,然后通過docker創(chuàng)建容器
影響Pod調(diào)度的屬性
在Pod調(diào)度時會有多個條件影響調(diào)度結(jié)果。
首先調(diào)度器會考慮Pod的資源限制,根據(jù)request找到滿足條件的node節(jié)點進行調(diào)度
3.1 節(jié)點選擇器NodeSelector
調(diào)度器會根據(jù)節(jié)點的標簽將任務調(diào)度到符合條件的節(jié)點上,例如下面將任務調(diào)度到標簽為dev的節(jié)點上
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
# 根據(jù)節(jié)點選擇器標簽進行調(diào)度
nodeSelector:
env role: dev
containers:
-name: nginx
image: nginx:1.15
可以通過以下命令為節(jié)點新增標簽,然后節(jié)點選擇器就會進行調(diào)度了
kubectl label node node1 env_role=prod
3.2 節(jié)點親和性NodeAffinity
節(jié)點親和性和之前nodeSelector 基本一樣的,根據(jù)節(jié)約束條件來決定Pod調(diào)度到哪些節(jié)點上
- 硬親和性:約束條件必須滿足,不滿足則不分配
- 軟親和性:嘗試滿足,不保證
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinitv:
# 硬親和性
requiredDuringSchedulinglgnoredDuringExecution:
nodeSelectorTerms:
- matuhExpEessions:
- key: env sle
operator: In
values:
- dev
- test
# 軟親和性
preferredDuringSchedulinglgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: group
operator: In
values:
- otherprod
支持常用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists
反親和性:就是和親和性剛剛相反,如 NotIn、DoesNotExists等
3.3 污點Taint
通過Taint 將節(jié)點添加污點,從而使本節(jié)點不做普通分配調(diào)度。nodeSelector 和 NodeAffinity,都是Pod的屬性,而污點是節(jié)點的屬性。
可以通過污點
- 專用節(jié)點【限制ip】
- 配置特定硬件的節(jié)點【固態(tài)硬盤】
- 基于Taint驅(qū)逐【在node1不放,在node2放】
通過如下命令查看污點情況
kubectl describe node k8smaster | grep Taint
污點值有三個
- NoSchedule:一定不被調(diào)度
- PreferNoSchedule:盡量不被調(diào)度【也有被調(diào)度的幾率】
- NoExecute:不會調(diào)度,并且還會驅(qū)逐Node已有Pod
通過如下命令為節(jié)點添加污點文章來源:http://www.zghlxwxcb.cn/news/detail-609671.html
kubectl taint node [node] key=value:污點的三個值
舉例:文章來源地址http://www.zghlxwxcb.cn/news/detail-609671.html
kubectl taint node k8snode1 env_role=yes:NoSchedule
# 刪除污點
kubectl taint node k8snode1 env_role:NoSchedule-
到了這里,關于Kubernetes中Pod容器的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!