色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

首次部署 Kubernetes 應用程序需注意的“陷阱”

如意 ? 來源:架構頭條 ? 作者:Julian Gindi ? 2020-10-08 14:43 ? 次閱讀

根據我的個人經驗,大多數人似乎傾向于通過 Helm 或者手動方式將應用程序甩給 Kubernetes,之后就坐等每天輕松調用的美好生活。但在 GumGum 公司的實踐當中,我們體會到 Kubernetes 應用的一系列“陷阱”,也希望把這些陷阱與大家分享,給您的 Kubernetes 探索之旅帶來一點啟發。

1. 配置 Pod 請求與限制

我們從配置一套可以運行 Pod 的簡單環境開始。Kubernetes 在處理 Pod 調度與故障狀態方面確實表現出色,但我們也意識到,如果 Kubernetes 調度程序無法衡量 Pod 的成功運行究竟需要多少資源,那么有時候部署工作可能面臨挑戰。而這一挑戰,也正是資源請求與限制機制的設計根源。目前,設置應用程序請求與限制方面的最佳實踐仍然存在不少爭議。實際上,這項工作更像是一門藝術,而非單純的科學。下面,我們聊聊 GumGum 公司內部對這個問題的看法:

Pod 請求: 這是調度程序用于衡量 Pod 最佳部署方法的主要指標。

下面來看 Kubernetes 說明文檔中的相關描述:

過濾步驟會在可行的情況下找到一組 Pod。例如,PodFitsResources 過濾器會檢查候選節點是否具備充足的可用資源,以滿足 Pod 提出的特定資源請求。

在內部,我們通過這樣一種方式使用應用程序請求:通過設置,我們對應用程序正常運行實際工作負載時的資源需求做出估計。以此為基礎,調度程序即可更合理地放置節點。最初,我們希望將請求設置得更高一些,保證各個 Pod 都擁有充足的資源。但我們很快發現,這種方式會大大增加調度時間,并導致部分 Pod 無法完全調度。這樣的結果實際上與我們完全不指定資源請求時看到的情況類似:在后一種情況下,由于控制平面并不清楚應用程序需要多少資源,因此調度程序經常會“逐出”Pod 且不再重新加以調度。正是這一調度算法中的關鍵組成部分,導致我們無法得到符合預期的調度效果。

Pod 限制: 即對于 Pod 的直接限制,代表著集群允許各容器所使用的最大資源量。

同樣來看官方說明文檔中的描述:

如果您為容器設置了 4GiB 的內存限制,則 kubelet(與容器運行時)將強制執行此限制。運行時將防止容器使用超出所配置上限的資源容量。例如,當容器中的進程所消耗的內存量超過獲準數量時,系統內核將終止該資源分配嘗試,并提示內存不足(OOM)錯誤。

容器所使用的實際資源量可以高于其請求,但永遠不能高于配置上限。很明顯,對限制指標的正確設置相當困難,但也非常重要。在理想情況下,我們希望讓 Pod 的資源需求在整個流程生命周期內發生變化,而又不致干擾到系統上的其他流程——這也正是限制機制的意義所在。遺憾的是,我們無法明確給出最合適的設置值,只能遵循以下過程進行調整:

使用負載測試工具,我們可以模擬基準流量水平,并觀察 Pod 的資源使用情況(包括內存與 CPU)。

我們將 Pod 請求設置在極低水平,同時將 Pod 資源限制保持在請求值的約 5 倍,而后觀察其行為。當請求過低時,進程將無法啟動,并時常引發神秘的 Go 運行時錯誤。

這里需要強調的一點在于,資源限制越嚴格,Pod 的調度難度也就越大。這是因為 Pod 調度要求目標節點擁有充足的資源。例如,如果您的資源非常有限(內存只有 4GB),那么即使是運行輕量級 Web 服務器進程都很可能非常困難。在這種情況下,大家需要進行橫向擴展,而且各個新容器也應運行在同樣擁有至少 4GB 可用內存的節點之上。如果不存在這樣的節點,您需要在集群中引入新節點以處理該 Pod,這無疑會令啟動時間有所增加。總之,請務必在資源請求與限制之間找到最小“邊界”,保證快速、平衡實現擴展。

2. 配置 Liveness 與 Readiness 探針

Kubernetes 社區中經常討論的另一個有趣話題,就是如何配置 Linvess 與 Readiness 探針。合理使用這兩種探針,能夠為我們帶來一種運行容錯軟件、并最大程度減少停機時間的機制。但如果配置不正確,它們也可能對應用程序造成嚴重的性能影響。下面來看這兩種探針的基本情況,以及如何進行使用判斷:

Liveness 探針:“用于指示容器是否正在運行。如果 Liveness 探針失敗,則 kubelet 將關閉容器,且容器將開始執行重新啟動策略。如果容器并不提供 Liveness 探針,則其默認狀態被視為成功。”—Kubernetes說明文檔

Liveness 探針的資源需求必須很低,因為它們需要頻繁運行,并需要在應用程序運行時向 Kubernetes 發出通知。請注意,如果將其設置為每秒運行一次,則系統將需要承擔每秒 1 次的額外請求處理量。因此,請務必認真考慮如何處理這些額外請求及相應資源。在 GumGum,我們將 Liveness 探針設置為在應用程序主組件運行時進行響應,且不考慮數據是否已經完全可用(例如來自遠程數據庫或緩存的數據)。舉例來說,我們會在應用當中設置一個特定的“health”端點,單純負責返回 200 響應代碼。只要仍在返回響應,就表明該進程已經啟動并可以處理請求(但尚未正式產生流量)。

Readiness 探針:“指示容器是否準備好處理請求。如果 Readiness 探針失敗,則端點控制器將從與該 Pod 相匹配的所有服務端點中,刪除該 Pod 的 IP 地址。”

Readiness 探針的運行成本要高得多,因為其作用在于持續告知后端,整個應用程序正處于運行狀態且準備好接收請求。關于此探針是否應該訪問數據庫,社區中存在諸多爭論。考慮到 Readiness 探針造成的開銷(需要經常運行,但頻繁可以靈活調整),我們決定在某些應用程序中只在從數據庫返回記錄后,才開始“提供流量”。通過對 Readiness 探針的精心設計,我們已經能夠實現更高的可用性水平以及零停機時間部署。

但如果大家確實有必要通過應用程序的 Readiness 探針隨時檢查數據庫請求的就緒狀態,請盡可能控制查詢操作的資源用量,例如……

SELECT small_item FROM table LIMIT 1

以下,是我們在 Kubernetes 中為這兩種探針指定的配置值:

首次部署 Kubernetes 應用程序需注意的“陷阱”

您還可以添加其他一些配置選項:

initialDelaySeconds- 容器啟動的多少秒后,探針開始實際運行

periodSeconds- 兩次探測之間的等待間隔

timeoutSeconds- 需要經過多少秒,才能判定某一 Pod 處于故障狀態。相當于傳統意義上的超時指標

failureThreshold- 探針失敗多少次后,才向 Pod 發出重啟信號

successThreshold- 探針成功多少次后,才能判定 Pod 進入就緒狀態(通常使用在 Pod 啟動或者故障恢復之后)

3. 設置默認 Pod 網絡策略

Kubernetes 使用一種“扁平”網絡拓撲;在默認情況下,所有 Pod 之間都可以直接相互通信。但結合實際用例,這種通信能力往往不必要甚至不可接受。由此帶來的一大潛在安全隱患在于,如果某一易受攻擊的應用程序遭到利用,則攻擊者即可由此獲取完全訪問權限,進而將流量發送至網絡上的所有 Pod 當中。因此我們也有必要在 Pod 網絡中應用最低訪問原則,在理想情況下通過網絡策略明確指定哪些容器之間允許建立相互連接。

以下列簡單策略為例,可以看到其將拒絕特定命名空間中的所有入口流量:

首次部署 Kubernetes 應用程序需注意的“陷阱”

4. 通過 Hooks 與 Init 容器執行自定義行為

我們希望在 Kubernetes 系統中實現的核心目標之一,在于嘗試為現有開發人員提供近乎零停機時間的部署支持。但不同應用程序往往擁有不同的關閉方式與資源清理過程,因此整體零停機目標很難實現。首先橫亙在我們面前的,就是 Nginx 這道難關。我們注意到在啟動 Pod 的滾動部署時,活動連接在成功終止之前就會被丟棄。經過廣泛的在線研究,事實證明 Kubernetes 在終止 Pod 之前,并不會等待 Nginx 用盡其連接資源。使用預停止 hook,我們得以注入此項功能,并由此實現了零停機時間。

首次部署 Kubernetes 應用程序需注意的“陷阱”

另一個實用范例,是通過 Init 容器處理特定應用程序的啟動任務。部分高人氣 Kubernetes 項目還會使用 Istio 等 init-containers 將 Envoy 處理代碼注入 Pod 當中。如果您在應用程序啟動之前,需要首先完成繁重的數據庫遷移過程,那么 Init 容器特別適用。您也可以為此過程設定更高的資源上限,保證其不受主應用程序的限制設定影響。

另一種常見模式是向 init-conatiner 提供 secrets 訪問權,并由該容器將這些憑證公布給主 Pod,從而防止通過主應用 Pod 本體對 secret 發出示授權訪問。同樣來看說明文檔中的表述:

Init 容器能夠安全運行實用程序或自定義代碼,避免其破壞應用程序容器鏡像的安全性。通過剝離這些不必要的工具,您可以限制應用程序容器鏡像的攻擊面。

5. 內核調優

最后,我們來聊聊一項最先進的技術。Kubernetes 本身是一套高度靈活的平臺,可幫助您以最適合的方式運行工作負載。在 GumGum,我們擁有多種高性能應用程序,其對運行資源有著極為苛刻的要求。在進行了廣泛的負載測試之后,我們發現有某一款應用程序難以在使用 Kubernetes 默認設置的前提下處理必要的流量負載。但 Kubernetes 允許我們運行一個高權限容器,通過修改為其配置適用于特定 Pod 的內核運行參數。通過以下示例代碼,我們修改了 Pod 中的最大開啟連接數量:

首次部署 Kubernetes 應用程序需注意的“陷阱”

這是一種使用頻率較低的高級技術。如果您的應用程序難以在高負載場景下健康運行,大家可能需要調整其中的部分參數。這里建議各位在官方說明文檔中參閱參數調優與可選值的相關細節信息

6. 總結

雖然 Kubernetes 已經算是一種幾乎“開箱即用”的解決方案,但大家仍然需要采取一系列關鍵步驟以保證應用程序的平衡運行。在將應用程序遷移至 Kubernetes 之上的整個過程中,請務必重視負載測試“循環”——運行應用程序,對其進行負載測試,觀察指標與擴展行為,基于結果調整您的配置,而后重復。請盡量客觀地設定預期流量,并嘗試將流量增加至超限水平,借此查看哪些組件會最先陷入癱瘓。通過這種迭代方法,大家也許只需要采取本文中介紹的部分步驟即可獲得理想的應用程序運行效果。總之,請永遠關注以下幾個核心問題:

我的應用程序的資源占用量是多少?占用量會如何變化?

服務的實際擴展要求是什么?預計需要處理怎樣的平均流量?峰值流量處于怎樣的水平?

服務可能多久需要進行一次橫向擴展?新的 Pod 要過多久才能正式開始接收流量?

我們的 Pod 終止過程優雅可控嗎?是否需要這種優雅性與可控性?我們能否實現零停機時間部署?

該如何盡可能降低安全風險,并限制 Pod 入侵狀況的“爆炸半徑”(影響范圍)?服務中是否存在某些不必要的權限或訪問能力?

Kubernetes 是一套令人印象深刻的強大平臺,您可以在這里運用最佳實踐為整個集群部署數千項服務。但不同的軟件之間總是有所差別,有時候您的應用程序可能需要進一步調整,好在 Kubernetes 為我們提供不少調整“旋鈕”,盡可能讓用戶輕松達成與預期相符的技術目標。將資源請求與限制、Livenss 與 Readiness 檢查、init-containers、網絡策略以及自定義內核調優等方法相結合,相信大家能夠在 Kubernetes 平臺之上實現更出色的基準性能、彈性與快速規模擴展能力。
責編AJX

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10882

    瀏覽量

    212220
  • 應用程序
    +關注

    關注

    37

    文章

    3283

    瀏覽量

    57756
  • kubernetes
    +關注

    關注

    0

    文章

    225

    瀏覽量

    8726
收藏 人收藏

    評論

    相關推薦

    如何使用Kubernetes實現零停機應用程序

    費力(實現 VRRP 解決方案、使用 monit 之類的應用程序監控重啟、負載均衡 haproxy 之類的)!
    的頭像 發表于 09-01 10:04 ?770次閱讀
    如何使用<b class='flag-5'>Kubernetes</b>實現零停機<b class='flag-5'>應用程序</b>

    Kubernetes Ingress 高可靠部署最佳實踐

    節點數等,注意集群默認會初始化3臺Master節點來部署集群管控服務。我們通過阿里云容器服務控制臺創建一個Kubernetes集群,這里以創建3臺Worker節點集群為例。2、打標 Ingress
    發表于 04-17 14:35

    阿里云宣布推出Serverless Kubernetes服務 30秒即可完成應用部署

    ,而是更專注在編寫應用程序邏輯上。據悉,在Serverless Kubernetes模式下,開發者只需指明應用容器鏡像、CPU和內存需求,選定對外服務模式,即可直接啟動應用程序,敏捷便利部署
    發表于 05-03 15:38

    kubernetes部署與應用

    kubernetes運維筆記
    發表于 10-25 13:08

    kubernetes v112二進制方式集群部署

    kubernetes v112 二進制方式集群部署
    發表于 05-05 16:30

    請問鴻蒙系統上可以部署kubernetes集群嗎?

    鴻蒙系統上可以部署kubernetes集群嗎
    發表于 06-08 11:16

    《Visual C# 2005開發技術》應用程序部署

    《Visual C# 2005開發技術》應用程序部署
    發表于 02-07 15:17 ?0次下載

    如何部署基于Mesos的Kubernetes集群

    kubernetes是一個跨多個計算節點的管理容器化應用的系統,它提供了一系列基本的功能,如應用的自動化部署,維護和擴展等。Mesos是Apache下的開源分布式資源管理框架,它被稱為是分布式系統
    發表于 10-09 18:04 ?0次下載
    如何<b class='flag-5'>部署</b>基于Mesos的<b class='flag-5'>Kubernetes</b>集群

    如何在 Intellij IDEA 更高效地將應用部署到容器服務 Kubernetes

    前言 在之前的一篇文章中,我們介紹了? 如何將一個本地的 Java 應用程序直接部署到阿里云 ECS? ,有不少讀者反饋,如果目前已經在使用阿里云容器服務 Kubernetes 了,那該如何配合這個
    發表于 12-28 16:06 ?440次閱讀
    如何在 Intellij IDEA 更高效地將應用<b class='flag-5'>部署</b>到容器服務 <b class='flag-5'>Kubernetes</b>

    如何解決Kubernetes部署故障及技巧

    Kubernetes資源配置中的錯誤,例如在部署(Deployment)和服務(Service)里。
    發表于 05-04 07:12 ?655次閱讀
    如何解決<b class='flag-5'>Kubernetes</b>中<b class='flag-5'>部署</b>故障及技巧

    KUBERNETES開源平臺的定義、工作原理及重要意義

    Kubernetes 是一個開源平臺,用于自動進行容器編排,即容器化應用程序部署、擴展和管理。
    的頭像 發表于 06-10 12:00 ?1747次閱讀

    如何從零開發Kubernetes Operator?

    大多數人使用Kubernetes的方式是使用原生資源(如Pod、Deployment、Service等)部署應用程序。但是,也可以擴展Kubernetes的功能,從而添加滿足特定需求的
    的頭像 發表于 01-05 11:27 ?1366次閱讀

    Kubernetes的集群部署

    Kubeadm是一種Kubernetes集群部署工具,通過kubeadm init命令創建master節點,通過 kubeadm join命令把node節點加入到集群中
    的頭像 發表于 02-15 10:35 ?1744次閱讀

    探討使用YAML文件定義Kubernetes應用程序

    Kubernetes已經占據如何管理集容器化應用程序的核心位置。因此,存在許多定義Kubernetes應用程序的約定文件格式,包括YAML、JSON、INI等。
    的頭像 發表于 04-20 10:03 ?610次閱讀

    Jenkins pipeline是如何連接Kubernetes的呢?

    Kubernetes 是一個開源的容器編排平臺,可以幫助開發團隊管理和部署容器化的應用程序
    的頭像 發表于 10-23 11:13 ?1826次閱讀
    Jenkins pipeline是如何連接<b class='flag-5'>Kubernetes</b>的呢?
    主站蜘蛛池模板: 饥渴的40岁熟妇完整版在线| 亚洲国产在线视频精品| 又大又硬又爽免费视频| 俄罗斯XX性幻女18| 久久精品国产欧美成人| 亚洲精品AV无码重口另类| 国产精品嫩草久久久久| 视频成人永久免费看| 成人伦理影院| 欧美特黄三级成人| 波多野结衣 熟女| 人人妻免费线| 成人国产亚洲精品A区天堂蜜臀| 免费xxx成年大片| 99久久国产露脸国语对白| 男男肉肉互插腐文| jealousvue成熟40岁| 日本美女抠逼| 国产精品爽黄69天堂A片| 亚洲精品不卡在线| 九九国产精品成人AV麻豆| 在线免费观看毛片| 年轻漂亮的妺妺中文字幕版| 99久久国产露脸国语对白| 日韩爽爽影院在线播放| 国产免费人成在线看视频| 亚洲中文日韩日本在线视频| 久久夜色精品国产亚州AV卜| 99热久久这里只有精品视频| 青青伊人影院| 国产香蕉九九久久精品免费| 伊人网综合| 美女白虎穴| 国产3级在线| 无套内射在线观看THEPORN| 精品久久久爽爽久久久AV| 亚洲电影不卡| 久久棋牌评测| YELLOW免费观看完整视频| 丝袜美女被艹| 九九色精品国偷自产视频|