中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kubernetes怎么判斷什么時候重啟容器

發布時間:2021-12-14 14:13:58 來源:億速云 閱讀:184 作者:iii 欄目:大數據

本篇內容介紹了“Kubernetes怎么判斷什么時候重啟容器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

在設計關鍵任務、高可用應用程序時,彈性是要考慮的最重要因素之一。

當應用程序可以快速從故障中恢復時,它便具有彈性。

云原生應用程序通常設計為使用微服務架構,其中每個組件都位于容器中。為了確保Kubernetes托管的應用程序高可用,在設計集群時需要遵循一些特定的模式,其中有“健康探測模式”。應用高可觀察性原則(HOP)可確保您的應用程序收到的每個請求都能及時找到響應。

The High Observability Principle (HOP)

高可觀察性原則是基于容器的應用程序設計原則之一。微服務體系要求每個服務不關心(也不應該關心)被調用方如何處理請求。
HOP原則要求每個服務必須公開幾個API端點,其意義在于揭示服務健康狀態,Kubernetes調用這些端點,決定下一步的路由和負載平衡

“  

設計良好的云原生程序應將日志事件記錄到STDERR和STDOUT,由logstash、Fluent等日志攝取服務將這些日志運送到集中式監控(例如Prometheus)和日志聚合系統(例如ELK)。下圖說明了云原生應用程序如何遵守健康狀況探測模式和高可觀察性原則。Kubernetes怎么判斷什么時候重啟容器

 

How to Apply Health Probe Pattern in Kubernetes?

我之前寫過ASP.NetCore + Docker健康檢查的原創:[web程序暴露http健康檢查端點,平臺輪詢探測],Kubernetes針對不同場合細化了探針,更為強大的是給出對應決策。

Kubernetes怎么判斷什么時候重啟容器 

Liveness Probes

使用[存活探針]判斷什么時候重啟容器。
使用存活探針檢查應用本身是否無響應、死鎖, 有時候重啟容器常常能解決此類問題。

我們以kubernetes官方demo為例:

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5   # 指示kubectl等待5s才執行首次探測
      periodSeconds: 5         # 間隔5秒輪詢
 
  • 在第5秒kubectl開始首次liveness探測
  • 在30秒進行的每次探測均成功
  • 30s之后容器內文件被刪除,之后間隔5s的探測會失敗,根據liveness默認配置連續3次失敗就會放棄探測,放棄探測意味著重啟容器,故容器會在第45s重啟
  • 重啟之后又開始以上流程, 故可以看到此探針以重啟的決策嘗試修復應用問題。

這個探針會體現到kubectl get podRESTARTSKubernetes怎么判斷什么時候重啟容器

Readiness Probes

使用[就緒探針]判斷容器是否就緒,是否可以接受流量。
Pod內所有容器ready,則該Pod被認為ready,當pod沒有ready,將會從服務負載均衡中移除。

“  

有些時候,應用程序臨時不可用(加載大量數據或者依賴外部服務),這個時候,重啟這個Pod無濟于事,但你也不希望請求被發送到該Pod

下面的應用強依賴mongodb,我們針對這些依賴項設置了readiness探針

services.AddHealthChecks()
    .AddCheck<MongoHealthCheck>(nameof(MongoHealthCheck), tags: new[] { "readyz" });
// ----------------------
app.UseHealthChecks("/readyz", new HealthCheckOptions
{
        Predicate = (check) => check.Tags.Contains("readyz")
});                
 

以下代碼探測Mongodb的連通性

  sealed class MongoHealthCheck : IHealthCheck
    {
        private readonly IMongoDatabase _defaultMongoDatabase;

        public MongoHealthCheck(IDefaultMongoDatabaseProvider defaultMongoDatabaseProvider)
        {
            _defaultMongoDatabase = defaultMongoDatabaseProvider.GetDatabase();
        }

        public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            var doc = await _defaultMongoDatabase.RunCommandAsync(
                new BsonDocumentCommand<BsonDocument>(
                    new BsonDocument() {
                        { "ping", "1" }
                    }), 
                cancellationToken: cancellationToken);

            var ok = doc["ok"].ToBoolean();

            if (ok)
            {
                return HealthCheckResult.Healthy("OK");
            }

            return HealthCheckResult.Unhealthy("NotOK");
        }
    }
 

對于依賴項的探測,探測周期和超時時間可以設置的稍長一點

readinessProbe:
  httpGet:
    path: /readyz
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 60     # 60s探測一次
  timeoutSeconds: 30    # 每次探測30s超時,與應用建立與依賴項的連接超時時間一致
  failureThreshold: 3   # 連續3次探測失敗,該Pod會被標記為`Unready`
     
Startup Probes

使用[啟動探針]判斷容器應用是否已經啟動。如果配置了這個探針,則該探針成功之前將會禁用存活和就緒探針。

配置探針
  • initialDelaySeconds:容器啟動,探針延后工作,默認是0s
  • periodSeconds 探針探測周期,默認10s
  • timeoutSeconds:探針工作的超時時間,默認1s
  • successThreshold:連續幾次探測成功,該探針被認為是成功的,默認1次
  • failureThreshold:連續幾次探測失敗,該探針被認為最終失敗,對于livenes探針最終失敗意味著重啟,對于readiness探針意味著該pod Unready, 默認3次。

強烈建議根據應用結構合理設置探針參數,避免不切實際的認定失敗導致的頻繁重啟或 Unready。

“Kubernetes怎么判斷什么時候重啟容器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

怀集县| 旺苍县| 周至县| 增城市| 墨竹工卡县| 克东县| 双江| 舒城县| 龙胜| 栖霞市| 崇左市| 宽城| 青田县| 揭阳市| 桓仁| 西吉县| 灵璧县| 镇平县| 茌平县| 托克逊县| 闽清县| 确山县| 金坛市| 凤城市| 太谷县| 海伦市| 九龙城区| 金寨县| 绥芬河市| 卫辉市| 驻马店市| 徐水县| 屯昌县| 黑水县| 天长市| 辽宁省| 黎平县| 宁德市| 绿春县| 海门市| 齐齐哈尔市|