為什么需要Pod?
- 進程是以進程組的方式組織在一起。
- 受限制容器的“單進程模型”, 成組調用沒有被妥善處理(資源調用有限),使用資源囤積則導致復雜度上升。
在k8s項目中,Pod的實現需要使用一個中間容器——Infra容器,該容器永遠是第一個被創建的容器,用戶定義的其他容器則通過Join Network Namespace的方式與Infra容器關聯在一起。
initContainer
Init Container容器會按順序逐一啟動,而直到它們啟動并且退出了,用戶容器才會啟動
nodeselector
nodeselector:disktype: ssd
意味著這個Pod只能在攜帶disktype:ssd標簽的節點上運行,否則調度失敗
NodeName
一旦Pod的這個字段被賦值,K8s則認為這個Pod已經被調度
HostAliases
定義了Pod的host文件(比如/etc/hosts)里的內容
shareProcessNamespace
這個Pod里的容器要共享PID Namespace,Pod就是要讓其中的容器盡可能多地共享Linux Namespace
HostNetwork, hostIPC, hostPID
待補充
Lifecycle
- postStart: 在容器啟動后立即執行一個指定操作。雖然在Docker ENTRYPOINT執行之后,但并不嚴格保證順序。
- preStop:容器被結束之前(比如收到了SIGKILL信號)執行是同步的。
Pod的生命周期
- Pending:Pod的YAML文件已經提交給了k8s,API對象已經創建并保存到etcd中。但是Pod里的容器因為某種原因不能被順利創建(比如:調度不成功)。
- Running:
- Succeeded:一段時間就退出的Pod,反饋任務執行的結果(運行一次性任務時最為常見)。
- Failed:Pod里至少有一個容器以不正常的狀態(非0的返回碼)退出。查看Events和日志。
- Unknown:異常狀態,很有可能是Master和kubelet間的通信出了問題。
特殊的Volume
Secret
Pod想要訪問的加密數據存放到etcd中,可以通過Pod的容器里掛載Volume的方式去訪問Secret里保存的信息。
k create secret generic user --from-file=./username.txtk create secret generic pass --from-file=./password.txt
也可以使用Secret.yaml來進行生成。
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: MTIzNDU2
但Secret對象要求這些數據需要經過Base64進行轉碼,同時創建出來的Secret對象只有一個,在data中以key-value的形式保存。
ConfigMap
使用properties文件生成ConfigMap,與Secret區別在ConfigMap保存的是無須加密、應用所需的配置信息。
Downward API
讓Pod里的容器能夠直接獲取這個Pod API對象本身的信息。比如可以獲取Pod的Labels字段的值
注意
通過環境變量獲取這些信息的方式不具備自動更新的能力,建議使用volume文件的方式獲取這些消息。
ServiceAccountToken
是一種特殊的Secret對象,每一個Pod都已經自動聲明了一個類型是Secret、名為default-token-xxxx的Volume,然后自動掛載在每一個容器的一個固定目錄上。
考慮到自動掛載默認ServiceAccountToken的潛在風險,K8s允許設置默認不為Pod里的容器自動掛載Volume
容器健康檢查和恢復機制
容器健康檢查-liveness
apiVersion: v1
kind: Pod
metadata:name: test-liveness-execlabels:test: liveness
spec:containers:- name: livenessimage: busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5
也可以定義為發起HTTP或者TCP請求的方式。所以Pod其實可以暴露一個健康檢查URL(/healthz)
恢復機制 restartPolicy
默認值為Always,Pod的恢復過程永遠發生在當前節點上,而不會跑到別的節點上。
- Always
- OnFailure
- Never:如果關心這個容器退出后的上下文環境,比如容器退出后的日志、文件和目錄,就需要將restartPolicy設置為Never
PodPreset
Pod的annotation會表示該Pod被PodPreset改動過,并且修改對象只能是Pod。