1. 程式人生 > >k8s健康檢測

k8s健康檢測

9.png failure period p s lur rate roc src col

8. 健康檢測

健康 檢測機制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.maxSurgemaxUnavailable

maxSurge控制更新過程中超過DESIRED(期望)的數字,可以為整數或百分數(向上去整),默認值25% 計算公式roundUp(10 + 10*25%)=13

maxUnavailable此參數控制滾動更新過程中,不可用的副本想占DESIRED的最大比例。可以為整數或百分數(向下去整),默認值25%

公式 10 - roundDown10 * 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健康檢測