主頁 >  其他 > Kubernetes 服務部署最佳實踐(二) ——如何提高服務可用性

Kubernetes 服務部署最佳實踐(二) ——如何提高服務可用性

2020-09-10 18:24:11 其他

引言

上一篇文章我們圍繞如何合理利用資源的主題做了一些最佳實踐的分享,這一次我們就如何提高服務可用性的主題來展開探討,

怎樣提高我們部署服務的可用性呢?K8S 設計本身就考慮到了各種故障的可能性,并提供了一些自愈機制以提高系統的容錯性,但有些情況還是可能導致較長時間不可用,拉低服務可用性的指標,本文將結合生產實踐經驗,為大家提供一些最佳實踐來最大化的提高服務可用性,

如何避免單點故障?

K8S 的設計就是假設節點是不可靠的,節點越多,發生軟硬體故障導致節點不可用的幾率就越高,所以我們通常需要給服務部署多個副本,根據實際情況調整 replicas 的值,如果值為 1 就必然存在單點故障,如果大于 1 但所有副本都調度到同一個節點了,那還是有單點故障,有時候還要考慮到災難,比如整個機房不可用,

所以我們不僅要有合理的副本數量,還需要讓這些不同副本調度到不同的拓撲域(節點、可用區),打散調度以避免單點故障,這個可以利用 Pod 反親和性來做到,反親和主要分強反親和與弱反親和兩種,更多親和與反親和資訊可參考官方檔案Affinity and anti-affinity,

先來看個強反親和的示例,將 DNS 服務強制打散調度到不同節點上:

affinity: podAntiAffinity:   requiredDuringSchedulingIgnoredDuringExecution:   - labelSelector:       matchExpressions:       - key: k8s-app         operator: In         values:         - kube-dns     topologyKey: kubernetes.io/hostname
  • labelSelector.matchExpressions 寫該服務對應 pod 中 labels 的 key 與 value,因為 Pod 反親和性是通過判斷 replicas 的 pod label 來實作的,
  • topologyKey 指定反親和的拓撲域,即節點 label 的 key,這里用的 kubernetes.io/hostname 表示避免 pod 調度到同一節點,如果你有更高的要求,比如避免調度到同一個可用區,實作異地多活,可以用 failure-domain.beta.kubernetes.io/zone,通常不會去避免調度到同一個地域,因為一般同一個集群的節點都在一個地域,如果跨地域,即使用專線時延也會很大,所以 topologyKey 一般不至于用 failure-domain.beta.kubernetes.io/region
  • requiredDuringSchedulingIgnoredDuringExecution 調度時必須滿足該反親和性條件,如果沒有節點滿足條件就不調度到任何節點 (Pending),

如果不用這種硬性條件可以使用 preferredDuringSchedulingIgnoredDuringExecution 來指示調度器盡量滿足反親和性條件,即弱反親和性,如果實在沒有滿足條件的,只要節點有足夠資源,還是可以讓其調度到某個節點,至少不會 Pending,

我們再來看個弱反親和的示例:

affinity:  podAntiAffinity:    preferredDuringSchedulingIgnoredDuringExecution:    - weight: 100      podAffinityTerm:        labelSelector:          matchExpressions:          - key: k8s-app            operator: In            values:            - kube-dns      topologyKey: kubernetes.io/hostname

注意到了嗎?相比強反親和有些不同哦,多了一個 weight,表示此匹配條件的權重,而匹配條件被挪到了 podAffinityTerm 下面,

如何避免節點維護或升級時導致服務不可用?

有時候我們需要對節點進行維護或進行版本升級等操作,操作之前需要對節點執行驅逐 (kubectl drain),驅逐時會將節點上的 Pod 進行洗掉,以便它們漂移到其它節點上,當驅逐完畢之后,節點上的 Pod 都漂移到其它節點了,這時我們就可以放心的對節點進行操作了,

有一個問題就是,驅逐節點是一種有損操作,驅逐的原理:

  1. 封鎖節點 (設為不可調度,避免新的 Pod 調度上來),
  2. 將該節點上的 Pod 洗掉,
  3. ReplicaSet 控制器檢測到 Pod 減少,會重新創建一個 Pod,調度到新的節點上,

這個程序是先洗掉,再創建,并非是滾動更新,因此更新程序中,如果一個服務的所有副本都在被驅逐的節點上,則可能導致該服務不可用,

我們再來下什么情況下驅逐會導致服務不可用:

  1. 服務存在單點故障,所有副本都在同一個節點,驅逐該節點時,就可能造成服務不可用,
  2. 服務沒有單點故障,但剛好這個服務涉及的 Pod 全部都部署在這一批被驅逐的節點上,所以這個服務的所有 Pod 同時被刪,也會造成服務不可用,
  3. 服務沒有單點故障,也沒有全部部署到這一批被驅逐的節點上,但驅逐時造成這個服務的一部分 Pod 被刪,短時間內服務的處理能力下降導致服務過載,部分請求無法處理,也就降低了服務可用性,

針對第一點,我們可以使用前面講的反親和性來避免單點故障,

針對第二和第三點,我們可以通過配置 PDB (PodDisruptionBudget) 來避免所有副本同時被洗掉,驅逐時 K8S 會 "觀察" nginx 的當前可用與期望的副本數,根據定義的 PDB 來控制 Pod 洗掉速率,達到閥值時會等待 Pod 在其它節點上啟動并就緒后再繼續洗掉,以避免同時洗掉太多的 Pod 導致服務不可用或可用性降低,下面給出兩個示例,

示例一 (保證驅逐時 nginx 至少有 90% 的副本可用):

apiVersion: policy/v1beta1kind: PodDisruptionBudgetmetadata:  name: zk-pdbspec:  minAvailable: 90%  selector:    matchLabels:      app: zookeeper

示例二 (保證驅逐時 zookeeper 最多有一個副本不可用,相當于逐個洗掉并等待在其它節點完成重建):

apiVersion: policy/v1beta1kind: PodDisruptionBudgetmetadata:  name: zk-pdbspec:  maxUnavailable: 1  selector:    matchLabels:      app: zookeeper

如何讓服務進行平滑更新?

解決了服務單點故障和驅逐節點時導致的可用性降低問題后,我們還需要考慮一種可能導致可用性降低的場景,那就是滾動更新,為什么服務正常滾動更新也可能影響服務的可用性呢?別急,下面我來解釋下原因,

假如集群記憶體在服務間呼叫:

img

當 server 端發生滾動更新時:

img

發生兩種尷尬的情況:

  1. 舊的副本很快銷毀,而 client 所在節點 kube-proxy 還沒更新完轉發規則,仍然將新連接調度給舊副本,造成連接例外,可能會報 "connection refused" (行程停止程序中,不再接受新請求) 或 "no route to host" (容器已經完全銷毀,網卡和 IP 已不存在),
  2. 新副本啟動,client 所在節點 kube-proxy 很快 watch 到了新副本,更新了轉發規則,并將新連接調度給新副本,但容器內的行程啟動很慢 (比如 Tomcat 這種 java 行程),還在啟動程序中,埠還未監聽,無法處理連接,也造成連接例外,通常會報 "connection refused" 的錯誤,

針對第一種情況,可以給 container 加 preStop,讓 Pod 真正銷毀前先 sleep 等待一段時間,等待 client 所在節點 kube-proxy 更新轉發規則,然后再真正去銷毀容器,這樣能保證在 Pod Terminating 后還能繼續正常運行一段時間,這段時間如果因為 client 側的轉發規則更新不及時導致還有新請求轉發過來,Pod 還是可以正常處理請求,避免了連接例外的發生,聽起來感覺有點不優雅,但實際效果還是比較好的,分布式的世界沒有銀彈,我們只能盡量在當前設計現狀下找到并實踐能夠解決問題的最優解,

針對第二種情況,可以給 container 加 ReadinessProbe (就緒檢查),讓容器內行程真正啟動完成后才更新 Service 的 Endpoint,然后 client 所在節點 kube-proxy 再更新轉發規則,讓流量進來,這樣能夠保證等 Pod 完全就緒了才會被轉發流量,也就避免了鏈接例外的發生,

最佳實踐 yaml 示例:

        readinessProbe:          httpGet:            path: /healthz            port: 80            httpHeaders:            - name: X-Custom-Header              value: Awesome          initialDelaySeconds: 10          timeoutSeconds: 1        lifecycle:          preStop:            exec:              command: ["/bin/bash", "-c", "sleep 10"]

更多資訊請參考 Specifying a Disruption Budget for your Application ,

健康檢查怎么配才好?

我們都知道,給 Pod 配置健康檢查也是提高服務可用性的一種手段,配置 ReadinessProbe (就緒檢查) 可以避免將流量轉發給還沒啟動完全或出現例外的 Pod;配置 LivenessProbe (存活檢查) 可以讓存在 bug 導致死鎖或 hang 住的應用重啟來恢復,但是,如果配置配置不好,也可能引發其它問題,這里根據一些踩坑經驗總結了一些指導性的建議:

  • 不要輕易使用 LivenessProbe,除非你了解后果并且明白為什么你需要它,參考 Liveness Probes are Dangerous
  • 如果使用 LivenessProbe,不要和 ReadinessProbe 設定成一樣 (failureThreshold 更大)
  • 探測邏輯里不要有外部依賴 (db, 其它 pod 等),避免抖動導致級聯故障
  • 業務程式應盡量暴露 HTTP 探測介面來適配健康檢查,避免使用 TCP 探測,因為程式 hang 死時, TCP 探測仍然能通過 (TCP 的 SYN 包探測埠是否存活在內核態完成,應用層不感知)

【騰訊云原生】云說新品、云研新術、云游新活、云賞資訊,掃碼關注同名公眾號,及時獲取更多干貨!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3049.html

標籤:其他

上一篇:GPS對時裝置(北斗衛星同步時鐘)應用市場調研分析

下一篇:Windows安裝tensorflow教程 GPU版

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more