k8s健康檢測
健康 檢測機制liveness和readiness
好處,避免0停機部署、避免無效鏡像、更加安全回滾
restartPolicy規則,默認always,Onfailure
1.livenness使用.(程序異常,但是並沒有退出)
分析判斷容器健康條件,如果失敗就重啟
案例
cat headlth.yml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness
spec:
restartPolicy: OnFailure #重啟規則
containers:
- name: liveness
image: docker.io/nginx:latest
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 100 ;rm -rf /tmp/healthy ; sleep 1000 #判斷依據文件是否存在,可根據條件自己設計
livenessProbe: #定義如何執行探測
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 50 #指定容器啟動多久後執行,根據容器啟動時間相應調整
periodSeconds: 20 #探測間隔
2.readiness
readiness何時加入到service實現負載均衡,(升級時用的多)
cat readiness.yml
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness
name: readiness
spec:
restartPolicy: OnFailure #重啟規則
containers:
- name: readiness
image: docker.io/nginx:latest
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 100 ;rm -rf /tmp/healthy ; sleep 1000 #判斷依據文件是否存在,可根據條件自己設計
readinessProbe: #定義如何執行探測
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 50 #指定容器啟動多久後執行,根據容器啟動時間相應調整
periodSeconds: 20 #探測間隔
readiness檢測如下圖
先檢測為不可用,條件成功之後為可用,當條件失敗之後變為不可用,和liveness相反
兩種機制完全一樣,語法和參數也一樣,唯一不同是一個重啟容器,一個設置為不可用
3.健康檢測在應用服務(service)中的應用
對於多副本,新副本會被添加到service提供負載均衡,從容器啟動到提供服務需要一段時間,考慮使用readiness
cat nginx.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: web
spec:
replicas: 4
template:
metadata:
labels:
run: web
spec:
containers:
- name: web
image: nginx
ports:
- containerPort: 80
readinessProbe:
httpGet: #c此處不同於exec,的另一種探測方法httpGet
scheme: HTTP #指定協議,支持http與https
path: / #指定訪問路徑
port: 80 #訪問端口
initialDelaySeconds: 10
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
run: web
ports:
- protocol: TCP
port: 8080
targetPort: 80
過程為,pod只有變為可用狀態,才會加入service提供服務,初始時,狀態不可用。下圖的步驟2 ,當ready為可用狀態時,加入service,提供服務。該判斷為readiness
4.健康檢測在滾動升級中的應用
案例
cat update.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app
spec:
replicas: 10
template:
metadata:
labels:
run: app
spec:
containers:
- name: web
image: nginx
args:
- /bin/sh
- -c
- sleep 10; touch /tmp/healthy; sleep 3000
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 10
periodSeconds: 5
kubectl apply -f update.yml --record
升級操作
cat update2.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app
spec:
replicas: 10
template:
metadata:
labels:
run: app
spec:
containers:
- name: web
image: nginx
args:
- /bin/sh
- -c
- sleep 1000
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 10
periodSeconds: 5
kubectl apply -f update2.yml --record
kubectl get deployment app
回滾
kubectl rollout undo deployment app --to-revision=1
對於創建的新副本為5個,就副本銷毀2個,此處有兩個參數限制的
5.maxSurge和maxUnavailable
maxSurge控制更新過程中超過DESIRED(期望)的數字,可以為整數或百分數(向上去整),默認值25% 計算公式roundUp(10 + 10*25%)=13
maxUnavailable此參數控制滾動更新過程中,不可用的副本想占DESIRED的最大比例。可以為整數或百分數(向下去整),默認值25%
公式 10 - roundDown(10 * 25%)=8
設置上述兩個值
cat update2.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app
spec:
strategy:
rollingUpdate:
maxSurge: 35%
maxUnavailable: 35%
replicas: 10
template:
metadata:
labels:
run: app
spec:
containers:
- name: web
image: nginx
args:
- /bin/sh
- -c
- sleep 1000
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 10
periodSeconds: 5
k8s健康檢測