廣州做網(wǎng)站 漢獅網(wǎng)絡(luò)抖音seo源碼搭建
基礎(chǔ)概念
- 定義:Pod 是 K8S 中最小的部署單元,是一個(gè)或多個(gè)緊密關(guān)聯(lián)容器的組合。
- 調(diào)度:Pod 作為一個(gè)整體被調(diào)度到 K8S 集群中的節(jié)點(diǎn)上。
- 生命周期:Pod 的生命周期由包含的容器的生命周期決定。
Pod中容器
- 容器定義:Pod 中的容器通過 Pod 的容器列表定義,這些容器可以共享相同的網(wǎng)絡(luò)和存儲(chǔ)。
- 共享資源:容器共享相同的網(wǎng)絡(luò)命名空間,可以通過 localhost 進(jìn)行通信,它們也可以訪問共享的存儲(chǔ)卷。
Pod的網(wǎng)絡(luò)模型
- 共享網(wǎng)絡(luò):所有 Pod 中的容器共享同一個(gè) IP 地址和端口空間,它們可以使用 localhost 進(jìn)行直接通信。
- Service:Pod 可以通過 Service 抽象進(jìn)行訪問,Service 提供了負(fù)載均衡和服務(wù)發(fā)現(xiàn)的功能。
Pod的生命周期
- Pending:Pod正在等待調(diào)度到某個(gè)節(jié)點(diǎn)上。
- Running:Pod中的至少一個(gè)容器正在運(yùn)行。
- Succeeded:Pod 中的所有容器已成功運(yùn)行完成。
- Failed:Pod 中至少有一個(gè)容器已經(jīng)以非正常狀態(tài)退出。
- Unknown:Pod 的狀態(tài)無法確定。
Pod的創(chuàng)建和管理
- Pod定義文件:使用 YAML 文件定義 Pod 的配置,包括容器規(guī)范、環(huán)境變量、資源限制等。
- kubectl命令:使用 kubectl 命令行工具創(chuàng)建、刪除、管理 Pod。
- ReplicaSets 和 Deployments:通過 ReplicaSets 和 Deployments 來管理 Pod 的復(fù)制和更新。
多容器Pod
- 定義:一個(gè) Pod 可以包含多個(gè)容器,這些容器共享相同的網(wǎng)絡(luò)和存儲(chǔ)。
- 使用場景:多容器 Pod 適用于需要協(xié)同工作的應(yīng)用,例如日志收集、輔助任務(wù)等。
Pod的基本使用
多種方式創(chuàng)建Pod
kubectl命令創(chuàng)建Pod
# 直接運(yùn)行一個(gè)nginx pod
kubectl run pod-nginx --image=nginx:latest
# 查看 pod 的詳細(xì)信息
kubectl get pod pod-nginx -o wide
# 在 master 節(jié)點(diǎn)訪問 nginx
curl ${pod_ip}
通過YAML創(chuàng)建Pod
# pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-nginx
spec:containers:- name: pod-nginximage: nginx-1.18.1ports:- containerPort: 80
# 通過 kubectl apply -f pod-nginx.yaml ,通過文件創(chuàng)建資源
配置 Pod 鏡像拉取策略
- spec.containers[].imagePullPolicy: IfNotPresent
Always[重新下載鏡像]、Never[僅使用本地]、IfNotPresent[優(yōu)先使用本地]
資源申請
Pod 中的 Container 指定了資源 request 時(shí),kube-scheduler 就利用該信息決定將 Pod 調(diào)度到哪個(gè)節(jié)點(diǎn)上,當(dāng)你為 container 指定了資源 limit 時(shí),kubelet 就可以確保運(yùn)行的容器不會(huì)使用超出所設(shè)的限制資源。kubelet 還會(huì)為容器預(yù)留所 request 數(shù)量的系統(tǒng)資源
- 單位:CPU(0.1/100m)、Memory(100Ei、100Pi、100Ti、100Gi、100Mi、100Ki)
- 配置:
- spec.containers[].resources.limits.cpu
- spec.containers[].resources.limits.memory
- spec.containers[].resources.requests.cpu
- spec.containers[].resources.requests.memory
生命周期事件回調(diào)
- postStart:K8S 在容器創(chuàng)建后立即發(fā)送 postStart 事件,然而,postStart 處理函數(shù)的調(diào)用不保證早于容器的入口點(diǎn)(entrypoint)的執(zhí)行
- postStop:K8S 在容器結(jié)束前立即發(fā)送 preStop 事件(termination),如果 preStop 被阻塞,那外界將會(huì)一直等待該事件結(jié)束,除非 Pod 寬限期限超時(shí)(terminationGracePeriodSeconds = 30)
配置 - 定義 Pod:postStart 回調(diào)后,輸出"postStart"到 k8s.txt,preStop 回調(diào)后,輸出 “preStop” 到 k8s.txt
apiVersion: v1
kind: Pod
metadata:name: pod-nginx-lifecycle
spec:containers:- name: pod-nginx-lifecycleimage: nginx:1.18.1imagePullPolicy: IfNotPresentlifecycle:postStart:exec:command: ["/bin/sh", "-c", "echo postStart > /k8s.txt"]postStop:exec:command: ["/bin/sh", "-c", "echo postStop >> /k8s.txt; sleep 3600;"]ports:- containerPort: 80
- 驗(yàn)證 postStart 回調(diào)
kubectl exec -ti pod-nginx-lifecycle -- /bin/bash
cat /k8s.txt
################
postStart
################
- 驗(yàn)證 postStop 回調(diào)
# 刪除容器
kubectl delete pod pod-nginx-lifecycle
# 在另一個(gè)節(jié)點(diǎn)執(zhí)行命令
kubectl exec -ti pod-nginx-lifecycle -- /bin/bash
cat /k8s.txt
################
postStart
postStop
################
Pod 加啟動(dòng)、就緒、存活探針
- 存活探針:k8s 通過存活探針來確定什么時(shí)候要重啟容器。
- 就緒探針:k8s 通過就緒探針來判斷是否要給流量。
- 啟動(dòng)探針:k8s 通過啟動(dòng)探針來了解應(yīng)用容器何時(shí)啟動(dòng),如果配置了這類探針,那么在這個(gè)探針成功之前就不會(huì)觸發(fā)存活和就緒探針,防止程序被頻繁 kill。
配置
存活探針
- exec 模式:容器啟動(dòng)時(shí)創(chuàng)建 healthy 文件,休眠 30s,刪除 healthy 文件,休眠 3000s,存活探針延時(shí) 5s 調(diào)用,后面每隔 5s 調(diào)用一次,驗(yàn)證存活
apiVersion: v1
kind: Pod
metadata:name: pod-nginx-liveness-exec
spec:containers:- name: pod-nginx-liveness-execimage: nginx:1.18.1imagePullPolicy: IfNotPresentargs:- /bin/sh- -c- touch /healthy; sleep 30; rm -f /tmp/healthy; sleep 3000livenessProbe:exec:command:- cat- /healthyinitialDelaySeconds: 5periodSeconds: 5
然后不斷執(zhí)行 kubectl describe pod pod-nginx-liveness-exec
命令,觀察探針情況。
- http 模式
apiVersion: v1
kind: Pod
metadata:name: pod-nginx-liveness-http
spec:containers:- name: pod-nginx-liveness-httpimage: nginx:1.18.1imagePullPolicy: IfNotPresentlivenessProbe:httpGet:path: /index.htmlport: 80httpHeaders:- name: Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3
此是啟動(dòng)是正常的,假設(shè)我們這個(gè)時(shí)候進(jìn)入容器刪除掉 index.html
kubectl exec -ti pod-nginx-liveness-http -- /bin/bash
rm -fr /usr/share/nginx/html/index.html
過幾秒后,執(zhí)行 kubectl get pod
查看到 pod 狀態(tài)為 restart 了 1 次,再執(zhí)行 kubectl describe pod pod-nginx-liveness-http
可以查看到具體的重啟原因是什么?我們這里是因?yàn)?index.html 被刪除,導(dǎo)致容器訪問 404 導(dǎo)致的重啟。
就緒探針
就緒探針和存活探針的配置一樣,唯一的區(qū)別是使用 readinessProbe
apiVersion: v1
kind: Pod
metadata:name: pod-nginx-readiness
spec:containers:- name: pod-nginx-readinessimage: nginx:1.18.1imagePullPolicy: IfNotPresentreadinessProbe:httpGet:path: /index.htmlport: 80httpHeaders:- name: Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3
同樣的操作,在容器啟動(dòng)一會(huì)后,進(jìn)入容器刪除 index.html 文件,
kubectl exec -ti pod-nginx-readiness -- rm -rf /usr/share/nginx/html/index.html
過一會(huì)查看 pod 可以看到就緒探針檢測失敗,但是通過 kubectl get pod
發(fā)現(xiàn) pod ready 的數(shù)量為0,但是 Pod 不會(huì)自動(dòng)重啟,這點(diǎn)和存活探針不同
。
啟動(dòng)探針
apiVersion: v1
kind: Pod
metadata:name: pod-nginx-startup
spec:containers:- name: pod-nginx-startupimage: nginx:1.18.1imagePullPolicy: IfNotPresentstartupProbe:httpGet:path: /index2.htmlport: 80initialDelaySeconds: 3periodSeconds: 3
這里我們寫成 index2.html,由于這個(gè)文件是不存在的,所以肯定是無法正常啟動(dòng)的
kubectl edit pod pod-nginx-startup
或
kubectl delete -f pod-nginx-startup.yaml
# 修改 index2.html 為 index.html。
kubectl apply -f pod-nginx-startup.yaml
修改成 index.html 后則探針檢測成功。