服務健康檢查
檢測容器服務是否健康的手段,若不健康,會根據設置的重啟策略(restartPolicy)進行操作,兩種檢測機制可以分別單獨設置,若不設置,默認認為Pod是健康的。
兩種機制:
- LivenessProbe探針
存活性探測:用於判斷容器是否存活,即Pod是否為running狀態,如果LivenessProbe探針探測到容器不健康,則kubelet將kill掉容器,並根據容器的重啟策略是否重啟,如果一個容器不包含LivenessProbe探針,則Kubelet認為容器的LivenessProbe探針的返回值永遠成功。
containers:
- name: myblog
image: 192.168.136.10:5000/myblog:v1
livenessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10 # 容器啟動后第一次執行探測是需要等待多少秒
periodSeconds: 10 # 執行探測的頻率
timeoutSeconds: 2 # 探測超時時間
- ReadinessProbe探針
可用性探測:用於判斷容器是否正常提供服務,即容器的Ready是否為True,是否可以接收請求,如果ReadinessProbe探測失敗,則容器的Ready將為False, Endpoint Controller 控制器將此Pod的Endpoint從對應的service的Endpoint列表中移除,不再將任何請求調度此Pod上,直到下次探測成功。(剔除此pod不參與接收請求不會將流量轉發給此Pod)。
containers:
- name: myblog
image: 192.168.136.10:5000/myblog:v1
readinessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 10
訪問分為三種類型:
- exec:通過執行命令來檢查服務是否正常,返回值為0則表示容器健康
- httpGet方式:通過發送http請求檢查服務是否正常,返回200-399狀態碼則表明容器健康
- tcpSocket:通過容器的IP和Port執行TCP檢查,如果能夠建立TCP連接,則表明容器健康
上一個實例:
containers:
- name: myblog
image: 192.168.136.10:5000/myblog:v1
env:
- name: MYSQL_HOST # 指定root用戶的用戶名
value: "127.0.0.1"
- name: MYSQL_PASSWD
value: "123456"
ports:
- containerPort: 8002
livenessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10 # 容器啟動后第一次執行探測是需要等待多少秒
periodSeconds: 10 # 執行探測的頻率
timeoutSeconds: 2 # 探測超時時間
readinessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 10
參數詳解:
- initialDelaySeconds:容器啟動后第一次執行探測是需要等待多少秒。
- periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
- timeoutSeconds:探測超時時間。默認1秒,最小1秒。
- successThreshold:探測失敗后,最少連續探測成功多少次才被認定為成功。默認是1。
- failureThreshold:探測成功后,最少連續探測失敗多少次才被認定為失敗。默認是3,最小值是1。
K8S將在Pod開始啟動10s(initialDelaySeconds)后利用HTTP訪問8002端口的/blog/index/,如果超過2s或者返回碼不在200~399內,則健康檢查失敗
容器的重啟策略
Pod的重啟策略(RestartPolicy)應用於Pod內的所有容器,並且僅在Pod所處的Node上由kubelet進行判斷和重啟操作。當某個容器異常退出或者健康檢查失敗時,kubelet將根據RestartPolicy的設置來進行相應的操作。
Pod的重啟策略包括Always、OnFailure和Never,默認值為Always。
- Always:當容器進程退出后,由kubelet自動重啟該容器;
- OnFailure:當容器終止運行且退出碼不為0時,由kubelet自動重啟該容器;
- Never:不論容器運行狀態如何,kubelet都不會重啟該容器。
- 使用默認的重啟策略,即 restartPolicy: Always ,無論容器是否是正常退出,都會自動重啟容器
- 使用OnFailure的策略時
- 如果把exit 1,去掉,即讓容器的進程正常退出的話,則不會重啟
- 只有非正常退出狀態才會重啟
- 使用Never時,退出了就不再重啟
我們一般都是選擇默認,只在個別情況下選擇其他
實例:
apiVersion: v1
kind: Pod
metadata:
name: test-restart-policy
spec:
restartPolicy: Always
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 10
鏡像拉取策略
設置鏡像的拉取策略,默認為IfNotPresent
- Always,總是拉取鏡像,即使本地有鏡像也從倉庫拉取
- IfNotPresent ,本地有則使用本地鏡像,本地沒有則去倉庫拉取
- Never,只使用本地鏡像,本地沒有則報錯
spec:
containers:
- name: test-one
image: harbor.xxx.com/xxx/test:v1.1
imagePullPolicy: IfNotPresent
Pod資源限制
為了保證充分利用集群資源,且確保重要容器在運行周期內能夠分配到足夠的資源穩定運行,因此平台需要具備
Pod的資源限制的能力。 對於一個pod來說,資源最基礎的2個的指標就是:CPU和內存。
Kubernetes提供了個采用requests和limits 兩種類型參數對資源進行預分配和使用限制。
containers:
...
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
requests:
- 容器使用的最小資源需求,作用於schedule階段,作為容器調度時資源分配的判斷依賴
- 只有當前節點上可分配的資源量 >= request 時才允許將容器調度到該節點
- request參數不限制容器的最大可使用資源
- requests.cpu被轉成docker的--cpu-shares參數,與cgroup cpu.shares功能相同 (無論宿主機有多少個cpu或者內核,--cpu-shares選項都會按照比例分配cpu資源)
- requests.memory沒有對應的docker參數,僅作為k8s調度依據
limits:
- 容器能使用資源的最大值
- 設置為0表示對使用的資源不做限制, 可無限的使用
- 當pod 內存超過limit時,會被oom
- 當cpu超過limit時,不會被kill,但是會限制不超過limit值
- limits.cpu會被轉換成docker的–cpu-quota參數。與cgroup cpu.cfs_quota_us功能相同
- limits.memory會被轉換成docker的–memory參數。用來限制容器使用的最大內存
對於 CPU,我們知道計算機里 CPU 的資源是按“時間片”
的方式來進行分配的,系統里的每一個操作都需要 CPU 的處理,所以,哪個任務要是申請的 CPU 時間片越多,那么它得到的 CPU 資源就越多。
來一段比較完善的yaml:
apiVersion: v1
kind: Pod
metadata:
name: mysql
namespace: luffy
labels:
component: mysql
spec:
hostNetwork: true # 聲明pod的網絡模式為host模式,效果同docker run --net=host
volumes:
- name: mysql-data
hostPath:
path: /opt/mysql/data
nodeSelector: # 使用節點選擇器將Pod調度到指定label的節點
component: mysql
containers:
- name: mysql
image: 192.168.136.10:5000/mysql:5.7-utf8
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "myblog"
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 15
periodSeconds: 20
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql