您好,登錄后才能下訂單哦!
這篇文章給大家介紹kubernetes如何進行readinessProbe,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
docker容器啟動成功,并不代表容器中的服務就能處理外部的請求。比方說java web項目啟動需要一段時間。
Kubernetes提供了readiness probe來檢測pod中的容器是否可以接受外部流量。
可以在java項目中提供一個接口,kubernetes發請求給此接口,當此接口返回數據時,則表明服務準備就緒,可以接受外部請求了。
先看一個簡單例子,準備一個spring boot工程,提供一個外部接口。以下服務用的端口號是10012
@GetMapping("/test02/version")
public String version(){
return "app02/version/v1";
}
在node節點上,編寫Docker配置文件,并打成鏡像
Dockerfile
FROM openjdk:8
ADD *.jar /app/app.jar
ADD entrypoint.sh /app/
# PORT="10012" 是項目端口號
ENV PORT="10012" TIME="Asia/Shanghai" JAVA_OPS="-Xmx256m -Xms256m -XX:+UseConcMarkSweepGC"
RUN set -e \
&& chmod +x /app/entrypoint.sh \
&& ln -snf /usr/share/zoneinfo/$TIME /etc/localtime \
&& echo $TIME > /etc/timezone
ENTRYPOINT ["/app/entrypoint.sh"]
EXPOSE $PORT
STOPSIGNAL SIGTERM
entrypoint.sh
#!/bin/sh
exec java ${JAVA_OPS} -jar /app/app.jar
打成鏡像codingsoldier/app02:v1
docker build -t codingsoldier/app02:v1 .
在master節點上編寫部署文件
k8s-service.yaml
apiVersion: v1
kind: Service
metadata:
name: service-app02
spec:
selector:
app: app02
ports:
- name: http
port: 10012
targetPort: 10012
k8s-app02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-app02
spec:
replicas: 2
selector:
matchLabels:
app: app02
template:
metadata:
labels:
app: app02
spec:
containers:
- name: app02
image: codingsoldier/app02:v1
ports:
- name: http
containerPort: 10012
部署服務
kubectl apply -f k8s-service
kubectl apply -f k8s-app02
獲取k8s-service的ip
kubectl get svc
重新開一個終端,循環調用接口,不要關閉這個終端,要一直開著。
while true; \
curl http://10.101.75.203:10012/test02/version; \
echo " "; \
do sleep 1; \
done;
現在就來升級版本吧
1、把/test02/version接口返回值改成v2
@GetMapping("/test02/version")
public String version(){
return "app02/version/v2";
}
2、打成jar包,上傳到所有node節點
3、生成docker鏡像
docker build -t codingsoldier/app02:v2 .
4、修改k8s-app02.yaml鏡像為v2
image: codingsoldier/app02:v2
5、重新開一個終端,執行 kubectl get pod -w 動態查看pod狀態
6、重新部署下k8s-app02.yaml
kubectl apply -f k8s-app02.yaml
在循環調用的監控中可以看到,服務有短暫的時間無法提供服務。
原因是:docker容器啟動成功了,k8s就認為此容器可以提供服務了。但事實上docker容器啟動成功的時候,java服務還沒啟動完成,暫時無法給外部提供服務。
解決辦法,使用readiness probe來檢測pod中的容器是否可以接受外部流量。
1、java工程新增一個服務就緒接口
//服務就緒接口,提供給k8s檢測
@GetMapping("/readiness")
public String readiness(){
return "yes";
}
2、k8s-app02.yaml加上就緒探針
readinessProbe:
httpGet:
port: http
path: /readiness
initialDelaySeconds: 20
periodSeconds: 10
readinessProbe詳細的配置:
initialDelaySeconds:容器啟動后第一次執行探測是需要等待多少秒。
periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
timeoutSeconds:探測超時時間。默認1秒,最小1秒。
successThreshold:探測失敗后,最少連續探測成功多少次才被認定為成功。默認是1。對于liveness必須是1。最小值是1。
failureThreshold:探測成功后,最少連續探測失敗多少次才被認定為失敗。默認是3。最小值是1。
httpGet配置項:
host:連接的主機名,默認連接到pod的IP。你可能想在http header中設置”Host”而不是使用IP。
scheme:連接使用的schema,默認HTTP。
path: 訪問的HTTP server的path。
httpHeaders:自定義請求的header。HTTP運行重復的header。
port:訪問的容器的端口名字或者端口號。端口號必須介于1和65525之間。
3、改下 /test02/version ,的返回值 app02/version/v3
4、修改 k8s-app02.yaml中鏡像的版本image: codingsoldier/app02:v3
5、打成jar,上傳
6、打成鏡像
docker build -t codingsoldier/app02:v3 .
7、重新部署服務
kubectl apply -f k8s-app02.yaml
查看循環調用接口的終端,服務一直可用
查看運行了kubectl get pod -w 的終端
1、新pod處于Running狀態,但READY是0/1。pod已經運行,但未就緒,此時不接收外部請求
2、25秒后,新pod處于Running狀態,READY是1/1。pod可以接收外部請求了
3、新pod能夠接收外部請求后,一個舊pod開始終止
4、由于pod服務數設置為2,所以此時另一個新pod開始創建,過程跟上面的一樣,新pod能就收請求后,舊pod終止。
關于kubernetes如何進行readinessProbe就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。