Pod 是 k8s 系統中可以創建和管理的最小單元, 是資源物件模型中由用戶創建或部署的最小資源物件模型, 也是在 k8s 上運行容器化應用的資源物件, 其他的資源物件都是用來支撐或者擴展 Pod 物件功能的, 比如控制器物件是用來管控 Pod 物件的, Service 或者Ingress 資源物件是用來暴露 Pod 參考物件的, PersistentVolume 資源物件是用來為 Pod提供存盤等等, k8s 不會直接處理容器, 而是 Pod, Pod 是由一個或多個 container 組成Pod 是 Kubernetes 的最重要概念, 每一個 Pod 都有一個特殊的被稱為” 根容器“的 Pause容器, Pause 容器對應的鏡 像屬于 Kubernetes 平臺的一部分, 除了 Pause 容器, 每個 Pod還包含一個或多個緊密相關的用戶業務容器
- 最小部署單元
- 是一組容器的集合
- 一個Pod 中的容器,是共享網路的
- 生命周期是短暫的,重啟后資料丟失,所以需要(nfs)
Pod 存在的意義
- 創建容器使用 Docker, 一個 Docker 對應一個容器,一個容器有一個行程,一個容器運行一個應用程式(多個不方便管理) docker ps -a
- Pod是多行程設計:里面可以包括多個容器,一個容器運行一個應用程式,因此Pod可以運行多個應用程式
- 為了親密性應用:兩個應用之間進行互動,網路之間呼叫,兩個應用需要頻繁呼叫
Pod 實作機制
容器本身之間相互隔離,通過 namespace、group
-
共享網路,通過Pause容器,把其它業務容器加入到 Pause 容器里面,讓所有業務容器在同一個 namespace ,實作網路共享

-
共享存盤,引入資料卷Volumn,使用資料卷進行持久化存盤(日志資料,業務資料),當一個節點掛了,漂移到另一個節點,資料不丟失


Pod 拉取策略
[root@k8smaster ~]# kubectl edit deployment/javademo1
.....
spec:
containers:
- image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:4.3
imagePullPolicy: IfNotPresent
name: vipsoft
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
.....

- imagePullPolicy: IfNotPresent
- Always :總是拉取 pull
- IfNotPresent: 默認值,本地有則使用本地鏡像,不拉取
- Never:只使用本地鏡像,從不拉取
Pod 資源限制
由Docker限制,非Pod去限制
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL ROOT PASSWORD
value: "password"
resources:
# 調度需要至少這么大
requests:
memory: "64Mi"
# 1核=1000m,250m=0.25核
cpu:“250m”
# 最大不超過
limits:
memory: ”128Mi"
cpu:"500m"
Pod和Container的資源請求和限制:
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
Pod 重啟機制
apiVersion: v1
kind: Pod
metadata:
name: dns-test
spec:
containers:
- name: busybox
image: busybox:1.28.4
args:
- /bin/sh
- -C
- sleep 36000
restartPolicy:Never
restartPolicy
- Always:當容器終止退出后,總是重啟容器,默認策略,
- OnFailure:當容器例外退出(退出狀態碼非0)時,才重啟容器,
- Never:當容器終止退出,從不重啟容器,
Pod 健康檢查
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
test: liveness
spec:
containers: #容器
- name: liveness #容器名字
image: busybox #鏡像
args: #args
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe: #存活檢查
exec:
command: #命令
- cat
- /tmp/healthy
initialDelaySeconds: 5 # 延遲探測時間
periodSeconds: 5 # 執行探測頻率
- livenessProbe (存活檢查)
如果檢查失敗,將kill殺死容器,根據Pod的 restartPolicy 來操作 - readinessProbe (就緒檢查)
如果檢查失敗,K8S會把Pod從Service endpoints 中剔除,
Probe 支持以下三種檢查方法: - httpGet
發送HTTP請求,回傳200~400范圍狀態碼為成功, - exec
執行 Shell 命令回傳狀態碼是0為成功, - tcpSocket
發起TCP Socket 建立成功,
Pod 調度策略
創建Pod流程

影響調度因素
- Pod 資源限制對Pod調度有影響,根據 Request 找到足夠 Node 節點進行除錯
- 節點選擇器標簽,nodeSelector.env_role:dev,影響

kubectl label node node1 env_role=dev
- 節點的親和性,nodeAffinity 和 nodeSelector 基本一樣,根據節點上標簽約束來對Pod調度到哪些節點上,功能更強大,符合條件就用,不符合也能用,支持各種運算子
(1) 硬親和性:約束條件必須滿足
(2) 軟親和性:嘗試滿足,不保證
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinityspec:
spec:
affinity:
nodeAffinity:
# 硬親和性
requiredDuringschedulingIgnoredDuringExecution:
nodeSelectorTerms :
- matchExpressions :
- key: env
roleoperator: In # NotIn Exists Gt Lt DoesNotExists
values:
- dev
- test
preferredDuringschedulingIgnoredDuringExecution:
# 軟親和性
- weiqht:1
preference:
matchExpressions :
- key: group
operator: In
values:
- otherprod
containers:
- name: webdemo
image: nginx
污點和污點容忍
nodeSelector、nodeAffinity: Pod調度到某些節點上,Pod 屬性,高度時實作
Taint 污點:節點不做普通分配除錯,是節點屬性
場景
-
專用節點
-
配置特定硬體節點
-
基于 Taint 驅逐
演示
# 查看當前節點的污點
[root@k8smaster ~]# kubectl describe node k8snode3 | grep Taint
# 添加污點 kubectl taint node 節點名稱 key=value:污點值-
[root@k8smaster ~]# kubectl taint node k8snode1 key=value:NoSchedule
# 洗掉污點 kubectl taint node 節點名稱 key=value:污點值-
[root@k8smaster ~]# kubectl taint node k8snode1 env_role:NoSchedule-
污點值
- NoSchedule: 一定不被調度
- PreferNoSchedule:盡量不被調度
- NoExecute:不會除錯,并且還會驅逐Node已有 Pod
污點容忍
加上 tolerations

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538634.html
標籤:其他
上一篇:漫談車載作業系統發展趨勢
下一篇:漫談車載作業系統發展趨勢
