K8S動手教程2.5:Pod健康檢查

2020-09-10 韋陀學院

內容摘要

健康檢查


在前面講解容器的時候,講到了容器的自動重啟特性,K8S也提供了該特性,並做了加強。Pod使用健康檢查來保證容器的可用性,健康檢查可以保證Pod保持可用性,能使業務達到幾乎無間斷使用。下面我們通過實驗給大家展示該特性。


測試環境

參考前面章節,創建兩節點K8S集群。1個作為控制節點,1個作為主節點。


測試鏡像構建

Dockerfile配置如下:

FROM node:7ADD app.js /app.jsENTRYPOINT ["node", "app.js"]

app.js文件內容如下:

const http = require('http');const os = require('os');​console.log("server starting...");​var requestCount = 0;​var handler = function(request, response) { console.log("Received request from " + request.connection.remoteAddress); requestCount++; if (requestCount > 3) { response.writeHead(500); response.end("I'm not well. Please restart me!"); return; } response.writeHead(200); response.end("You've hit " + os.hostname() + "\n");};​var www = http.createServer(handler);www.listen(8080);

上面的程序當訪問超過3次時,報500錯誤。

構建鏡像,名字為health_image:latest,記得推送到自己的倉庫。

注意:由於現在是兩節點K8S集群,如果想要測試比較順暢,建議在兩個節點都構建鏡像。


創建Pod

配置Pod yaml文件,內容為:

apiVersion: v1kind: Podmetadata: name: health1spec: containers: - image: huqianakls/health_image:latest name: health1 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 protocol: TCP livenessProbe: httpGet: path: / port: 8080

配置說明:

livenessProbe下就是健康檢查配置,它也被叫做存儲探針。httpGet表示使用http的方式檢查容器是否健康,path是訪問路徑。從配置可以看出,健康檢查會訪問app.js文件中接口,該接口在訪問3次以後,會返回500錯誤,此時容器會處於不正常狀態。

運行該Pod,觀察健康檢查如何發生作用。

觀察步驟如下:

1、運行起來以後,等待容器狀態變為Runing;

2、等待一段時間後,使用kubectl describe 和 kubectl get pod命令查看Pod;

注意RESTARTS列,表示重啟次數,大概在1分鐘的時候,容器重啟了一次。

查詢詳情,結果如下:

[root@K8S001 test]success=1 success=1 kubectl describe pod health2Name: health2Namespace: defaultNode: k8s002/172.18.152.17Start Time: Wed, 25 Sep 2019 18:44:41 +0800Labels: <none>Annotations: <none>Status: RunningIP: 192.168.3.71Containers: health2: Container ID: docker://c6046bf54f46b7b1ac786b77afa17be4122594644ca1f7383e5ad8f1d25eb4ba Image: httpd Image ID: docker-pullable://httpd@sha256:39d7d9a3ab93c0ad68ee7ea237722ed1b0016ff6974d80581022a53ec1e58797 Port: 80/TCP Host Port: 0/TCP State: Running Started: Wed, 25 Sep 2019 18:51:13 +0800 Last State: Terminated Reason: Completed Exit Code: 0 Started: Wed, 25 Sep 2019 18:50:33 +0800 Finished: Wed, 25 Sep 2019 18:51:13 +0800 Ready: True Restart Count: 5 Liveness: tcp-socket :8080 delay=15s timeout=1s period=20s failure=3 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-6fqw2 (ro)Conditions: Type Status Initialized True Ready True PodScheduled True Volumes: default-token-6fqw2: Type: Secret (a volume populated by a Secret) SecretName: default-token-6fqw2 Optional: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300sEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 6m default-scheduler Successfully assigned health2 to k8s002 Normal SuccessfulMountVolume 6m kubelet, k8s002 MountVolume.SetUp succeeded for volume "default-token-6fqw2" Normal Pulling 6m kubelet, k8s002 pulling image "httpd" Normal Pulled 3m kubelet, k8s002 Successfully pulled image "httpd" Normal Created 1m (x4 over 3m) kubelet, k8s002 Created container Normal Started 1m (x4 over 3m) kubelet, k8s002 Started container Normal Killing 1m (x3 over 2m) kubelet, k8s002 Killing container with id docker://health2:Container failed liveness probe.. Container will be killed and recreated. Normal Pulled 1m (x3 over 2m) kubelet, k8s002 Container image "httpd" already present on machine Warning Unhealthy 44s (x9 over 3m) kubelet, k8s002 Liveness probe failed: dial tcp 192.168.3.71:8080: getsockopt: connection refused

從Event屬性可以看出,重啟原因是無法聯通8080埠。

Last State屬性內容為: Liveness: tcp-socket :8080 delay=15s timeout=1s period=20s failure=3

可以看出此時的健康檢查方式是tcp。


Kubelet

Kubelet是具體操控存活探針的系統組件,該組件在每個節點上都有,並且相互之間沒有直接聯繫。kubelet也會具體管理Pod的運行重啟等。每個節點管理的Pod是不同的。

下面們做個實驗,停止運行Pod的節點,看容器是否可以重啟。

上面我們的應用都被調度到k8s002工作節點,下面我們刪除該節點,大家可以在阿里雲上釋放該節點,之後,我們在在控制節點查看Pod,結果如下:

大家可以看到,health2重啟次數為7次,不管你隔多久時間查詢,你會發現這個次數不會變,仍舊是7,說明該Pod之後再也沒有重啟。原因是該Pod由k8s002節點上的Kubelet管理,現在該節點被刪除了,因此,不會再重啟該容器。

從這裡可以也可以看出,還需要更好的機制來解決這個問題,在節點出問題後,該節點上的容器能夠在其他節點運行起來。K8S提供了這種機制,即副本控制器。下節我們將進入該內容的學習。


實驗

1、創建Pod,使用存活探針;

2、觀察存活探針工作機制;

相關焦點

  • K8S動手教程2.1:第1個Pod
    構建完成後,將鏡像push到自己在hub.docker.com中的容器倉庫,步驟如下:1、給新構建的鏡像打tagdocker tag first_pod huqianakls/first_pod:latest注意:huqianakls 是dockers上的帳號或者id號,使用/隔開,/後面就是鏡像名和tag;2、登錄自己的帳號
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-pod介紹和安裝nginx
    (2)學校做統計的時候會很方便,比如這次的疫情下統計健康情況,班級1 和班級2都很健康,班級3不正常。數據很容易觀察。(3)同一個班級裡面的學生共享一份教材即可,節省了資源。01—pod的介紹k8s最重要的功能之一就是資源的管理和調度,對於pod的理解和我們上面提到的班級的例子類似。
  • 認識和理解k8s中的pod
    序言在大部分的k8s教程中,都是先講k8s的基本理論,對於剛剛接觸k8s的同學來說,可能一臉懵逼,望而生畏,所以我帶領大家一步步動手部署,在部署的過程中一步步教大家理解其中的概念,讓更多的技術人員邁入k8s的大門。
  • K8s使用metric-server讓pod自動擴縮容
    /{namespace}/pods/{pod} 特定 pod 的指標,指標名稱為PodMetrics未來將能夠支持指標聚合,如 max 最大值,min 最小值,95th 峰值,以及自定義時間窗口,如 1h,1d,1w 等。
  • K8S動手教程2.4:Pod註解和命名空間
    註解常用操作添加註解命令為:kubectl annotate pod apppod5 company=hadoop不同namespace中可以創建同名的Pod,下面我們在namespace2下創建apppod6,將namespace改為namespace2。
  • K8S動手教程2.3:Pod標籤和選擇器
    根據標籤查詢Pod為了測試,創建1個新Pod,配置內容為:apiVersion: v1kind: Podmetadata: name: apppod2 labels: app: myapp2rel: v2.0spec: containers: - image: huqianakls/app1:latest name: appcon2 ports: - containerPort: 8080 protocol: TCP下面我來測試下查詢Pod:1、查詢標籤app值為myapp2的Pod命令為:kubectl get pod
  • 一個小需求,自動重啟k8s集群中日誌不刷新的POD
    k8s需求日常工作中,所有項目都不是完美的,筆者就經常遇到這種情況,pod狀態是running,但是程序卻沒有響應。發生這種情況的原因有很多種,有可能是因為k8s健康檢查的原因,比如使用ps檢查進程;或者是程序內部死循環,但是不退出;再或者網絡閃斷,程序無法重連等等。無論什麼原因,都會有解決辦法,但是優化需要時間,在未完全解決之前,問題不能不解決,於是想到了一個臨時方案,因為筆者公司項目日誌是直接列印在stdout的,發生了程序無響應的情況,比較簡單的一個辦法是判斷日誌輸出的時間。
  • k8s三部曲第二章第1節 pod核心原理
    1.pod核心原理概念:k8s的作用k8s是用來管理容器,但不直接操作容器,最小操作單元是pod(間接管理容器)特點:1).一個master有一群node節點2).master節點不存儲容器,只是負責調度、網關、控制器、資源對象存儲
  • K8S動手教程2.2:Pod多容器,訪問,日誌
    訪問Pod目前使用一種簡單的方式來訪問Pod,使用埠轉發方式,命令如下:kubectl port-forward Pod名稱 主機埠:容器埠對於multicontainerpod,我們配置埠轉發如下:kubectl port-forward multicontainerpod
  • 阿里雲架構師強烈推薦的K8S文檔,學完曬一下自己的學習筆記
    pod中的多個容器只需要localhost就可以相互訪問。2.4.3 靜態pod靜態pod 是由kubelet進行管理創建的只存在於特定Node上的Pod,kubelet無法對其進行靜態檢查,且一般只存在於kubelet所在的節點上。
  • 乾貨|帶您了解k8s
    k8s的代碼託管在github之上:https://github.com/kubernetes/kubernetes/releases三、k8s的特性:1)可以自動裝箱,即可以自動完成容器的部署,而不影響可用性;2)可以自我修復,如果容器崩潰了,可以1s內重新啟動,有了k8s後,我們不再關注個體,而是關注群體,有一個個體壞了,把它幹掉
  • K8S中的Service的存在理由
    ServiceService資源用於為pod對象提供一個固定、統一的訪問接口及負載均衡的能力,並藉助新一代DNS系統的服務發現功能,解決客戶端發現並訪問容器化應用的問題。注意:service只是在k8s集群內部起作用,集群外部訪問是無效的實現原理Service通過關註定義出多個POD對象組合而成的邏輯集合,以及訪問這組POD的策略,Service關聯POD需要標籤選擇器完成,其基於標籤選擇器將一組POD定義成一個邏輯集合,並通過自己的IP位址和埠調度代理請求至後端POD之上。
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-基礎組件與架構
    master節點包含的組件及其作用:API Server:是k8s最核心的組件,統一的資源操作入口,包括提供認證、授權、訪問控制、API註冊和 發現等機制,其他的組件運行依賴於api server,通過api接口可以對k8s資源對象進行curd以及監控,也能進行健康,日誌等監控。
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-service的介紹和基本操作
    通過k8s部署集群並提供服務的時候,會部署很多的pod以及pod副本來保證服務的高可用。這也帶來了一個問題!!這麼多pod提供服務,外部如何訪問這些服務?在k8s中,每個pod都會被分配一個ip,即每個pod都唯一的ip。
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-eplicationController介紹
    前面我們介紹了pod的基本概念和常用命令,並且手動安裝了一個nginx應用pod。然而,線上的流量會越來越大,一個nginx應用提供服務顯然不夠,那就需要多個nginx應用來做均衡,共同提供服務。多個應用容器,就意味著多個pod。開啟了多個pod,雖然保證了對外服務的正常,但也同樣帶來了pod管理和維護的問題。
  • 從kubectl top看K8S監控原理
    的cpu、內存等,一般來說,核心指標作HPA已經足夠,但如果想根據自定義指標:如請求qps/5xx錯誤數來實現HPA,就需要使用自定義指標了。在K8S中集成在Kubelet裡作為默認啟動項,k8s官方標配。
  • ansible部署k8s
    安裝k8s3、檢查環境3.1、檢查etcd3.2、檢查flanneld3.3、檢查nginx和keepalived3.4、檢查kube-apiserver3.5、檢查 kube-controller-manager3.6、檢查kube-scheduler3.7
  • kubernetes中常用對象pod的詳細介紹
    叫:k8s.gcr.io/pause。在Kubernetes裡,可以為Pod裡的容器配置健康檢查探針(Probe)。periodSeconds: 5如上定義了一個livenessProbe健康檢查機制,其健康檢查方式為容器啟動後exec進入容器執行cat /tmp/health命令,如果文件存在則返回0表示健康,如果返回值不為0,則表示異常。
  • k8s中pause容器作用
    [root@test-3-217 pause] 查看容器[root@test-3-219 ~]34;sleep 3600&34;nginx -g &34; 3 hours ago Up 3 hours k8s_nginx_pause-test_default_02e7dcb7-5aeb-477f-a50b-
  • K8S動手教程1:安裝指南
    安裝方法請參考Docker動手教程第1章的相關內容。最好的方法是使用自定義容器鏡像在阿里雲創建虛擬機,這樣就不需要在每個節點上安裝Docker環境了。安裝完成後,在每個節點上檢查容器環境是否正常,運行命令:systemctl status docker