K8S Pod 如何實(shí)現(xiàn) Service 切流

前言

在云原生環(huán)境中归薛,Pod 是部署應(yīng)用程序的基本單位羞酗,而 Service 將符合指定條件的 Pod 作為可通過(guò)網(wǎng)絡(luò)訪問(wèn)的服務(wù)提供給服務(wù)調(diào)用者汽抚。在某些情況下易结,可能需要將某個(gè) Pod 的流量從 Service 中切走精算,使其不再接收 Service 的請(qǐng)求瓢宦。這可能是因?yàn)?Pod 出現(xiàn)故障需要保留現(xiàn)場(chǎng)人工排查。

目標(biāo)

使能夠靈活地將 Pod 的流量從 Service 中切走灰羽,同時(shí)確保在切走流量時(shí)驮履,其他 Pod 仍然能夠正常工作,并且對(duì)用戶請(qǐng)求的影響最小化廉嚼。

概述

  1. 基本概念和原理
    在 Kubernetes 中玫镐,Service 通過(guò) Label 選擇器來(lái)將請(qǐng)求流量分發(fā)到對(duì)應(yīng)的 Pod 上。因此怠噪,要切走某個(gè) Pod 的流量恐似,可以通過(guò)修改 Label 選擇器來(lái)實(shí)現(xiàn)。我們可以為需要切走的 Pod Label 進(jìn)行修改傍念,使其 Service Label 選擇器不再包含該 Pod 的 Label矫夷。
# Service 通過(guò) Label 選擇器綁定 Deployment
---
apiVersion: v1
kind: Service
metadata:
  name: test
spec:
  ports:
    - name: port-xxxx
      nodePort: xxxxx
      port: xxxx
      protocol: TCP
      targetPort: xxxx
  selector:
    app: test
  type: NodePort

# Deployment Label
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  selector:
    matchLabels:
      app: test   # 與 Pod Label一致
  template:
    metadata:
      labels:
        app: test  # 與 Service selector 一致
        
# Pod Label
---
apiVersion: v1
kind: Pod
metadata:
  generateName: test-8495787574-
  labels:
    app: test
  name: test-8495787574-rssvq
  1. 實(shí)現(xiàn)流程
    (1)準(zhǔn)備階段:確定需要切走流量的 Pod,并修改成特定 Label捂寿,如原 Label:app=test口四,修改后 Label:app=test-offline。
    (2)修改 Pod 的 Label 后秦陋,Deployment 會(huì)檢測(cè)發(fā)現(xiàn)同 Label 實(shí)例與副本數(shù)實(shí)例不一致蔓彩,通過(guò)擴(kuò)容將 Pod 個(gè)數(shù)與副本數(shù)一致。
    (3)驗(yàn)證流量切分:通過(guò) Service 調(diào)用時(shí)驳概,使用工具或監(jiān)控系統(tǒng)驗(yàn)證流量是否成功切分赤嚼,確保其他 Pod 能夠正常接收請(qǐng)求和被切流的 Pod 不再接收請(qǐng)求。
    (4)恢復(fù)流量:在需要恢復(fù)流量時(shí)顺又,將切走流量的 Pod 的 Label 恢復(fù)為原始狀態(tài)更卒,Deployment 會(huì)檢測(cè)發(fā)現(xiàn)同 Label 實(shí)例與副本數(shù)實(shí)例不一致,通過(guò)縮容將 Pod 個(gè)數(shù)與副本數(shù)一致稚照。
    (5)再次驗(yàn)證流量:確認(rèn)流量是否成功恢復(fù)蹂空,確保切走流量的 Pod 重新接收請(qǐng)求俯萌。

針對(duì)于第4、5點(diǎn)上枕,實(shí)際情況如排查完問(wèn)題咐熙,沒(méi)必要恢復(fù)該 Pod 流量,而是直接銷毀該 Pod辨萍,因?yàn)榈?點(diǎn)已將切流的 Pod 個(gè)數(shù)擴(kuò)容了回來(lái)棋恼,所以無(wú)須保留切流的 Pod

具體實(shí)現(xiàn)步驟

  1. 準(zhǔn)備階段
  • 確定需要切走流量的 Pod:確定需要切走流量的 Pod 的名稱或標(biāo)識(shí)。
  • 修改 Pod Label:使用 K8S API 進(jìn)行修改
public V1Pod patchPodLabel(String namespace, String name, String key, String value) throws ApiException {
    CoreV1Api api = new CoreV1Api(client);
    V1Patch v1Patch = new V1Patch(JSONUtil.toJsonStr(CollUtil.newArrayList(new PatchPodLabelsParam(key, value))));
    return api.patchNamespacedPod(name, namespace, v1Patch, null, null, null, null);
}

@Getter
public static class PatchPodLabelsParam {
    private final String op = "replace";
    private final String path;
    private final String value;

    public PatchPodLabelsParam(String key, String value) {
        this.path = StrFormatter.format("/metadata/labels/{}", key);
        this.value = value;
    }
}

@Test
public void patchPodLabel() throws ApiException {
    Kube kube = Kube.init(dev_KubeConfig);
    kube.patchPodLabel("default","test-8495787574-nz58d", "app", "test-offline");
}
  1. 驗(yàn)證流量切分
# 到 Pod 中執(zhí)行命令安裝 arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

# 通過(guò) watch 監(jiān)控方法是否被調(diào)用
watch 包名.類名 方法名 '{params,returnObj,throwExp}'
// 模擬通過(guò) NodePort 進(jìn)行調(diào)用
for (int i = 0; i < 100; i++) {
    CompletableFuture.runAsync(() -> HttpUtil.get("http://測(cè)試接口"));
}
ThreadUtil.sleep(10000);
  1. 處理切流的 Pod
    修改了 Label 的 Pod 則脫離了 Deployment 的管理锈玉,也無(wú)法通過(guò) Deployment 來(lái)查看爪飘,該 Pod 則無(wú)法自動(dòng)銷毀,只能人工銷毀拉背。

總結(jié)和注意事項(xiàng)

本方案提供了一種將 Pod 的流量從 Service 中切走的方法师崎。通過(guò)修改 Pod Label,可以靈活地控制流量的分發(fā)去团,確保在進(jìn)行維護(hù)或升級(jí)時(shí)抡诞,對(duì)用戶請(qǐng)求的影響最小化。在實(shí)際應(yīng)用中土陪,需要根據(jù)具體業(yè)務(wù)需求和環(huán)境進(jìn)行適當(dāng)?shù)恼{(diào)整和測(cè)試昼汗,以確保方案的可行性和穩(wěn)定性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬼雀,一起剝皮案震驚了整個(gè)濱河市顷窒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌源哩,老刑警劉巖鞋吉,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異励烦,居然都是意外死亡谓着,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門坛掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赊锚,“玉大人,你說(shuō)我怎么就攤上這事屉栓∠掀眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵友多,是天一觀的道長(zhǎng)牲平。 經(jīng)常有香客問(wèn)我,道長(zhǎng)域滥,這世上最難降的妖魔是什么纵柿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任蜈抓,我火速辦了婚禮,結(jié)果婚禮上藐窄,老公的妹妹穿的比我還像新娘资昧。我一直安慰自己酬土,他們只是感情好荆忍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著撤缴,像睡著了一般刹枉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屈呕,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天微宝,我揣著相機(jī)與錄音,去河邊找鬼虎眨。 笑死蟋软,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嗽桩。 我是一名探鬼主播岳守,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碌冶!你這毒婦竟也來(lái)了湿痢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扑庞,失蹤者是張志新(化名)和其女友劉穎譬重,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罐氨,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臀规,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栅隐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塔嬉。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖约啊,靈堂內(nèi)的尸體忽然破棺而出邑遏,到底是詐尸還是另有隱情,我是刑警寧澤恰矩,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布记盒,位于F島的核電站,受9級(jí)特大地震影響外傅,放射性物質(zhì)發(fā)生泄漏纪吮。R本人自食惡果不足惜俩檬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碾盟。 院中可真熱鬧棚辽,春花似錦、人聲如沸冰肴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熙尉。三九已至联逻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間检痰,已是汗流浹背包归。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铅歼,地道東北人公壤。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像椎椰,于是被迫代替她去往敵國(guó)和親厦幅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容