前言:
參考k8s教程由淺入深
一、Pod概述:
定義:
- k8s系統中可以建立、管理的最小單元
- 資源對象模型中使用者建立或部署的最小資源模型
- k8s上運作容器化應用的資源對象
- 其他資源作用是支援pod,如控制器是為了管控pod,Service和Ingress是為了暴露pod引用對象,PersistentVolume為pod提供存儲
- pod不是容器,是一個或多個容器組成。k8s不會直接操作容器
- 一個pod中共享網絡命名空間
- pod是短暫的。每一個pod都有一個根容器,叫pause容器,還有使用者自己建立的容器
二、pod存在意義:
- 建立容器使用docker,一個docker對應一個容器,一個容器運作一個應用程式,對應一個程序
- pod是多程序設計,運作多個應用程式
- pod是為親密性應用而存在的(兩個應用頻繁互相調用)
三、pod實作機制
1. docker之間互相隔離
實作機制:linux的namespace機制/cgroup
namespace:linux核心隔離核心資源的方式。通過namespace能讓進行僅看到和自己程序相關的資源
cgroup:Linux下控制一個(或一組)程序的資源限制機制,可精細化的控制程序使用的cpu/記憶體
2.共享網絡
前提條件:容器在同一個namespace下可以共享網絡
實作機制:
a.預設建立根容器 pause(info容器)
b.後續建立的業務容器會加入info容器,使得業務容器與info容器在同一個namespace中,實作網絡共享
3.共享存儲
pod需要持久化的資料:日志資料、業務資料
實作機制:使用資料卷(Volume)進行持久化存儲
多個pod将資料存儲到Volume中,若node結點當機,建立的鏡像可以從資料卷中重新讀取資料進行同步
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: centos
name: write
command: ["bash","-c","for i in {1,100};do echo $i >> /data/hello;sleep 1;done"]
# 挂載資料卷
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
# 挂載資料卷
volumeMounts:
- name: data
mountPath: /data
# 定義資料卷
volumes:
- name: data
emptyDir: {}
四、鏡像拉取政策
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: nginx:1.14
name: nginx
# 鏡像拉取政策
imagePullPolicy:Always
如上,imagePullPolicy為鏡像拉取政策。拉取政策分為:
- IfNotPresent:預設值,鏡像在主控端上不存在時才拉取
- Always:每次建立pod都拉取
- Never:Pod永遠不會主動拉取這個鏡像
五、pod資源限制
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: nginx:1.14
name: nginx
imagePullPolicy:Always
# 資源限制
resources:
# 排程大小
request:
memory: "64Mi"
cpu: "250m" # 一核=1c=1000m
# 限制最大資源
limit:
memory: "128Mi"
cpu: "500m"
六、pod重新開機機制
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: nginx:1.14
name: nginx
imagePullPolicy:Always
# 重新開機政策
restartPolicy:Never
Always:容器終止退出後,總重新開機容器
OnFailure:容器異常退出後(狀态碼非0)重新開機
Never:不重新開機
七、健康檢查
1.容器檢查(部分問題容器檢查定位不了)
2.應用層面檢查
存活檢查:如果檢查失敗,kill,根據restartPolicy政策操作
就緒檢查:如果檢查失敗,将pod從service endpoints中剔除
Probe檢查方法:
1.httpGet 狀态碼200-400則為成功
2.exec 執行shell指令傳回0為成功
3.tcpSocket 發起TCP socket建立成功
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: busybox
name: write
args:
- /bin/sh
- -C
- touch /tmp/healthy; sleep 30;rm -rf /tmp/healthy
livenessProbe:
# probe檢查方法:exec;有tmp/healthy--->0 無--->1
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5