1. 程式人生 > >這個註冊的 IP 網路都不通了,Eureka 註冊中心竟然無法踢掉它!

這個註冊的 IP 網路都不通了,Eureka 註冊中心竟然無法踢掉它!

本文導讀:

  • 微服務技術架構選型介紹
  • k8s 容器化部署架構方案
  • Eureka 註冊中心問題場景
  • 問題解決手段及原理剖析

閱讀本文建議先了解:

  1. 註冊中心基本原理
  2. K8s(Kuberneters)基本概念

我們的微服務目前都是在伺服器上部署的,也是基於 Docker 來部署的。

運維部門基於 K8s 自研了一套容器雲管理平臺,平臺名稱叫做 Ares,我們也開始準備將微服務遷移到這平臺上,降低虛擬機器或實體機伺服器運維成本,提高伺服器資源利用效率。

Ares:阿瑞斯(戰神)

希臘神話中為戰爭而生的神,奧林匹斯十二神之一,被視為尚武精神的化身。看起來很牛逼的樣子!

1、微服務技術架構選型介紹

微服務框架使用了流行的 Spring Cloud 框架。

框架技術元件如下:

  • 註冊中心選擇的是 Eureka
  • 閘道器使用的 Zuul
  • 配置中心使用的 Apollo
  • 熔斷限流使用了 Sentienl + Hystrix

閘道器 Zuul 層使用了 Ribbon 做負載均衡、Hystrix 做限流熔斷。
後端微服務使用了阿里巴巴開源的 Sentinel 做限流熔斷。

由於當時伺服器的配置不同,比如有低配置的虛擬機器,還有高配置的物理機伺服器。

所以呢,我們基於當時的伺服器配置現狀,基於 Ribbon 自行擴充套件了按照權重的負載均衡策略,對 Eureka 註冊中心管理介面做了一點改造,能夠支援動態對每臺伺服器變更權重。

因為本文的問題跟 Eureka 註冊中心有關,對 Eureka 架構做個介紹下。

Eureka 註冊中心簡易架構圖:

上圖簡要描述了 Eureka 的基本架構,由3個角色組成:

1)Eureka Server

提供服務註冊、發現、健康檢查。

2)Service Provider

服務提供方,
將自身服務註冊到 Eureka,從而使服務消費方能夠找到,
我們將容器可以作為服務提供者,會註冊到 Eureka。

3)Service Consumer

服務消費方,
從Eureka獲取註冊服務列表,從而能夠消費服務
我們可以將 Zuul 閘道器作為服務消費者。

2、K8s 容器化部署架構方案

考慮到使用的 Spring Cloud 框架,結合運維提供的容器平臺。

制定容器化部署架構如下:

從容器建立到可訪問流程:

1)建立容器

選擇映象及版本、CPU、記憶體配置、配置健康檢查、日誌收集、Pod 副本數量。提交建立容器。

2)服務註冊

容器啟動時,申請 SLB VIP,作為服務註冊 IP,向 Eureka 上發起註冊。

3)閘道器發起請求

域名請求,DNS 解析經過 GSLB(全域性軟負載均衡)負載到 Zuul 閘道器,Zuul 閘道器從 Eureka 註冊中心拉取服務登錄檔,通過 Ribbon 負載均衡,從本地服務註冊列表中,選擇其中一臺 Server,發起 Http 呼叫。

4)容器提供服務

容器內註冊的是 SLB VIP(軟負載均衡),這個 SLB 通過內部的 Nginx 負載均衡機制,輪詢到後端的容器的多個 Pod IP 上,Pod IP 正是我們部署的微服務業務。

為什麼要使用SLB VIP呢?

當時我們對介面壓測時,發現使用 K8s 內部的 Service IP 存在效能瓶頸,該問題還在研究中。後來運維內部商榷,使用 SLB 來達到負載均衡的效果。

另外說明一點:
運維基於 K8s 自研的這套容器平臺,網路層面做了重新架設和優化,打通了各個機房的網路。

這樣做給我們的架構部署帶來了好處:
前期目標僅為了遷移微服務業務,考慮到穩定性等因素,正式上線的Zuul閘道器和Eureka 註冊中心部署在 K8s 叢集外,微服務業務部署在容器內,因網路可通,容器啟動後申請的 VIP,可以直接註冊到 Eureka 上。

模擬環境(預上線環境)是直接將Eureka註冊中心,也部署在了容器平臺中,接下來會說下,因此導致的一些問題,以及解決該問題的方式。

** 3、Eureka 註冊中心問題場景**

容器測試階段結束,由於運維調整為了 SLB VIP,將以前的應用(一個應用下包含多個 Pod 容器)都刪除掉,我們重新搭建一套模擬環境用於,上線前的效能測試環境。

但是當我們部署完 Eureka 後,發現以前刪除掉的應用VIP 也註冊上來了,而且這個 VIP 網路是不通的,無法訪問的。

Eureka 管理控制檯示意圖:

telnet 命令測試:

telnet 10.11.195.197 80 
Trying 10.11.195.197...
telnet: connect to address 10.11.195.197: Network is unreachable
telnet: Unable to connect to remote host

結果提示 10.11.195.197 這個 VIP,網路是不可達的。

那為什麼這個服務能註冊上來呢?

起初,跟運維老哥請教,經過容器內排查後,也暫時沒有太多眉目,確定是這個 VIP,已經下線了,網路也不通。

按照這個推測,是不太可能註冊到 Eureka 上來的。

開始考慮到以為是 Eureka 機制是不是有問題,但仔細用「屁股」猜想論思考一下,結合 Eureka 框架底層原理來看,是不應該出現這個情況。

根據 Eureka 續約機制,一定是有哪個「哥們」在默默給這個服務 IP 發續約(向註冊中心傳送心跳)。

我們在 Eureka Server 服務端,也有監聽各個動作的機制,如註冊服務、續約服務、下線服務,根據日誌看,也的確是有這個服務 IP 一直在傳送續約動作。

續約監聽程式碼:

@EventListener
public void listen(EurekaInstanceRenewedEvent event) {
    InstanceInfo instanceInfo = event.getInstanceInfo();
    if (instanceInfo != null) {
        logger.info("renew ...." + instanceInfo.getInstanceId());
    } else {
        logger.info("renew ....instanceInfo is null");
    }
}
4、問題解決手段及原理剖析

既然引出了上述問題,當然不能放任不管,一定要一探究竟。
這種問題你若不理他,早晚會搞出點別的事情來的。

Eureka 服務端已經收到了註冊和一直續約的請求,說明一定是有哪個服務一直在偷偷發送心跳。

到底是誰幹的啊?

到底如何找到這個上報的服務呢?

運維老哥暫時比較忙,看來只能先查詢網路鏈路,抓取網路資料包看看到底是怎麼回事了。

網路工具一般常用的就是 tcpdump、Wireshark。

Wireshark 小故事:
大概發生在 10 幾年前,主導 Ethereal(應該聽說過吧)的大佬跳槽了,然後這個商標就不能繼續使用了,但是這個工具在當時來說人氣很旺,後來大佬就將專案更名為 Wireshark 了。
伺服器上命令列的抓包程式 tethereal 更名為了 tshark。

容器映象中預設是不會自帶這些工具的。映象中 Linux 作業系統使用的是 CentOS,通過自帶的 yum 源安裝網路工具包,比較方便。

安裝 wireshark:

yum install -y wireshark

安裝 tcpdump:

yum install -y tcpdump

這裡我們使用的是 Wireshark 工具,簡單介紹下這個工具:

如果你要看到全部網路資料包,直接執行tshark命令即可。

1)獲得 tshark 命令幫助

tshark --help

2)tshark 抓包模式引數一覽

3)tshark 命令實戰使用

列印源目標 Host 及 Http 協議資訊:

tshark -s 512 -i eth0 -n -f 'tcp dst port 80' -t ad -R 'http.host and http.request.uri' -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri" | tr -d ' '

引數解釋:

-i 捕獲 eth0 網絡卡;

-n 禁止所有地址名字解析(預設為允許所有)

-t 設定解碼結果的時間格式。
"ad"表示帶日期的絕對時間,"a"表示不帶日期的絕對時間,"r"表示從第一個包到現在的相對時間,“d”表示兩個相鄰包之間的增量時間(delta)

-R 設定讀取(顯示)過濾表示式(read filter expression)

-T -e 輸出指定的欄位

執行結果:

來段文字:

[root@mas-manager-eureka-es1-66cb79bfb7-snmxm manager]# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri" | grep 10.11
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
Sep 27, 2019 00:22:05.174770971 10.124.12.169   10.124.14.4     PUT     /eureka/apps/LETV-MAS-CALLER-TVPROXY-USER/10.11.195.197:80?status=UP&lastDirtyTimestamp=1569490783397
Sep 27, 2019 00:22:13.814821143 10.124.11.125   10.124.14.4     PUT     /eureka/apps/LETV-MAS-CALLER-TVPROXY-USER/10.11.195.197:80?status=UP&lastDirtyTimestamp=1569407741389
Sep 27, 2019 00:22:15.180243816 10.124.11.123   10.124.14.4     PUT     /eureka/apps/LETV-MAS-CALLER-TVPROXY-USER/10.11.195.197:80?status=UP&lastDirtyTimestamp=1569490783397

通過抓包,根據問題 IP 過濾得到的結果,我們看到了
/eureka/apps/LETV-MAS-CALLER-TVPROXY-USER/10.11.195.197:80?status=UP&lastDirtyTimestamp=1569490783397
說明是有 IP 在上報,上報來源 IP 就是第二列的 IP。

將這個資訊提供給運維同學,根據來源 IP 去繼續查詢線索。

但是,發現第二列 IP 並不是實際的伺服器節點 IP,查不到。因為這些 IP 都是主機上的虛擬 IP,每次上報來源 IP 不同,所以還要反向查詢實際歸屬的主機節點。

為什麼要有虛擬 IP?

實際是 SLB 節點上虛擬 IP,因為會負載到它所屬主機節點,這臺主機上預設只能支撐最大 65535 個 TCP 連線,所以為了單機能支撐更高的 TCP 連線數,會虛擬出來很多個 IP。假設有 10 個虛擬 IP,每個虛擬 IP 支撐 65535 個 TCP 連線,這臺主機總共可以支撐 10 * 65535 = 60萬以上的連線數了。

K8s 有多套叢集,每個叢集中有很多臺主機節點,茫茫主機池中怎麼去查詢這些虛擬 IP 呢,

其實我們的目的是為了找到,誰往註冊中心傳送請求了,還是可以繼續通過抓取網路資料包來定位這個問題。

這些網路資料包一定會經過 K8s 叢集裡的某一臺節點,一臺一臺去找,很麻煩,編寫簡單指令碼抓包查詢

#!/bin/bash
tcpdump -i any host 10.124.14.4 -n -s 0 -X -l | grep 10.11.195>/tmp/1.txt &
sleep 20s
kill -2 %1
cat /tmp/1.txt

網路抓包結果:

截取了關鍵的抓包資訊:

11:41:56.598204 IP 10.110.157.81.54078 > 10.124.14.4.http: Flags [P.], seq 273:622, ack 218, win 245, options [nop,nop,TS val 3348483954 ecr 1420800289], length 349: HTTP: PUT /eureka/apps/LETV-MAS-CALLER-TVPROXY-USER/10.11.195.197:80?status=UP&lastDirtyTimestamp=1569394834392 HTTP/1.1

這裡的 10.110.157.81.54078 就是主機節點 IP,目標地址 10.124.14.4 就是容器內的 Eureka 註冊中心地址。

傳送的請求是 /eureka/apps/LETV-MAS-CALLER-TVPROXY-USER/10.11.195.197:80?status=UP&lastDirtyTimestamp=1569394834392
這個請求地址上就帶了 10.11.195.197 這個網路不可達的 IP 地址。

到這裡,其實我們已經基本定位到了,一定是從 K8s 叢集容器內發出來了。
根據這個有價值的節點資訊,連線到 K8s 叢集內,查詢該節點上部署的容器。

查詢 K8s 叢集內 Pod 命令列:
kubectl get pod --all-namespaces -o wide |grep 10.110.157.81

部署在改節點上的容器:

運維根據 Eureka 上名稱大概猜測一下,終於找到這個「罪魁禍首」的容器了。
進入容器內,檢視配置 SVIP (Eureka上的註冊IP)就是 10.11.195.197 這個IP。

將這個問題容器徹底關閉後,沒有再繼續傳送續約請求,Eureka 註冊中心上過了一段時間摘掉了 IP。

大家可能有疑問,這麼繁瑣,為啥不直接到 K8s 叢集內去找,因為 K8s 叢集內目前已有業務在執行著,叢集內有幾百個容器在跑著。當時運維一起測試時,容器名稱都是自定義的,所以不是很好查詢。

咱們經過這個過程的排查,確認了這個 Eureka 註冊中心上的地址雖然不通,但是一直是有容器在上報,而上報的「ServerId」指向的 10.11.195.197:80 地址。

我們也可以結合底層原始碼瞭解下。

Eureka 續約時序圖:

介面實現方式跟註冊服務類似,更新自身狀態後,會同步到其他叢集節點。

PeerAwareInstanceRegistryImpl 類的 renew 方法會呼叫到 AbstractInstaceRegistry 抽象例項註冊類的 renew 方法。

AbstractInstaceRegistry#renew 方法原始碼:

會根據服務 id 從登錄檔中獲取 Lease 物件,如果不為空,則完成續約,更新 lastUpdateTimestamp 欄位。

Eureka 登錄檔的資料結構:

private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
= new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();

是一個 ConcurrentHashMap 結構,Key 就是應用名稱,Value 也是一個 Map 結構。
Map 結構中的 Key 是註冊ID(IP + 埠),Value 是 Lease 服務續約物件,裡面包含了動作型別,最後上報(心跳)更新時間戳等等資訊。

容器服務作為 Eureka Client,每隔一定時間間隔(預設60秒)向註冊中心發起一次續約。

Eureka Server 會定時檢測服務例項心跳是否正常,如果間隔一定時間(90秒),還沒有來續約,就會將這個服務從註冊中心摘除掉。

最後總結:

總結上述分析過程,一圖勝千言:

重要的不是結果,而是這個過程,希望你也能享受這個過程。

參考資料:

Wireshark 使用文件:
https://www.wireshark.org/docs/man-pages/tshark.html

Netflix Eureka 原始碼:
https://github.com/netflix/eureka

歡迎關注我的公眾號,更多精彩文章,與你一同成長,掃碼二維碼關注~

相關推薦

這個註冊IP 網路不通Eureka 註冊中心竟然無法

本文導讀: 微服務技術架構選型介紹 k8s 容器化部署架構方案 Eureka 註冊中心問題場景 問題解決手段及原理剖析 閱讀本文建議先了解: 註冊中心基本原理 K8s(Kuberneters)基本概念 我們的微服務目前都是在伺服器上部署的,也是基於 Docker 來部署的。 運維部門基於 K8s 自

我們過時怎樣獲得新生

轉行 層次 經驗 跟著 服務 框架 效率 正在 手機   今天,一個同事說起現在的實習生基礎太差,while,if,return和break這些混著用就分不清return和break怎麽用了,但是他們還有自己的優點,很明確自己的發展方向是什麽,而我們才畢業的時候,軟件是怎麽

黃錦宣:馬雲認為好做的事情賺不

簡單的思維+死腦筋=成功最近一段時間一直圍繞著“用戶思維”運營的經驗來寫文章,發現很多人對於“用戶思維”可以說完全陌生。 並且對於我關於用戶思維的經驗文章沒有太大的興趣,我在各大平臺發的關於“用戶思維”運營的文章,閱讀量也寥寥無幾。 記得馬雲老大說過這樣的話:如果一件事情大部分的人都贊成,那麽這件事就不值得做

寫給立誌做碼農的大學生(蘑菇街你你還要面騰訊? 我去我一定要去)

鍵盤 前言 docker 二本 征求意見 小時 形勢 我沒 妹子 先簡單介紹一下我自己,我是一所普通大學的本科生,大學錄取時的專業是非計算機系的,在大一下學期意識到自己喜歡敲代碼以後,就提交了轉專業申請。大二起開始在計算機系學習。大三時(2015年4月)拿到了騰訊暑期實習的

【10000+文章匯總】技巧在這裏你也能寫出1w+好文

51cto博客 10000+ 自 #我要10000+# 計劃啟動以來,已經有多位作者參與其中,我們通過文章專屬推廣渠道,取得了驚人的效果!單篇文章的閱讀量,最高達到55倍的閱讀量增長。從默默無聞,到有人喜歡,獲得關註的同時,打造個人影響力。現在讓我們來看看,這些 10000+ 好文,都有哪些~標題閱讀

如果包租公、包租婆的72家房客創業結果你無法相信|書樂寓言②

創客創客空間是個地產生意?還是門租賃生意?其實,它只是一個水平不太高的包裝生意。如何成功呢?看包租公、包租婆怎麽弄包租婆和包租公的生活,就是每個月,按時向自己豬籠城寨裏的七十二家房客收房租。日子過得不好也不差,反正就這麽過吧。幾十年下來,七十二家房客,有人走了,有人搬進來了,但大家也還和睦。只是過去房客們喜歡

大家忽略微信外鏈視頻“封殺令”背後藏著的“文化”

短視頻5月下旬,由於微信官方以各種理由,不斷變換著對其朋友圈中外鏈視頻的“封殺令”,引發多達30家短視頻產品的激烈反彈和業界對其行為是否構成不正當競爭的熱議。但,封殺事件中的一個主角,被忽略了。事件的爆發,是5月18日“國際博物館日”當天,短視頻平臺抖音的“博物館H5”在被網民分享到微信朋友圈後,不到24小時

eclipse中的出現在打包一次後後面新建的項目出錯出現support_v7下面出現紅線及解決方法及為什麽eclipse中項目繼承ActionBarActivity解決方法一樣

style 寫博客 引用 image back 你在 發現 想法 cti 第一次寫博客,有什麽問題或者想法的希望各位可以進行評論交流,望大家多多包涵! 遇到的問題是在新建的項目都出錯了,出現support_v7下面出現紅線及解決方法及為什麽eclipse中項目繼承Acti

小白也能做的IP代理池好久沒更新不知道你們想看什麽呢

不知道 一個 pytho 爬取 save 包含著 異步處理 使用方法 gen IP代理池制作 GitHub主頁: https://github.com/hfldqwe/ 使用工具: ip代理抓取: requests 後臺搭建: Django+Redis 代理檢測: ip

專案釋出到各個電腦上css樣式jsp頁面佈局亂怎麼處理

1.在做專案開始的時候,佈局頁面,就應該設定寬高為56%或者?%,而不是具體的780px; 2.做專案的時候儘可能的把公共的樣式放在css裡面。這樣調整的話,只需要調整css樣式而不是把所有的頁面全部開啟,設定一遍; 3.把電腦設定成一樣的解析度如1280*1024 4.選擇一樣的瀏覽器

8年的程式碼做過的專案下線程式設計師的意義在哪裡

一、起因 前幾天專案交付上線,所以閒下來了。忽然想起來,自己業餘接的活,有些專案已經不再運營了,所以想清理下域名解析。 上去阿里雲一看,總的大概有15個解析。這15個解析就意味著15個專案。這些專案都是我去談的需求、寫的文件、前後端開發、部署上線維護,整個專案幾乎都是我一人完成的。 想當初,很用心的去開

為什麼那麼多自學Python的後來放棄總結起來就這些原因

目前資訊化產業發展勢頭很好,IT就成為了很多普通人想要涉及的行業,因為相比於傳統行業,IT行業漲薪幅度大,機會也多,所以就會大批的人想要轉行來學習Python開發。目前來講市場上需要的Python人員非常多,而且按照現在的勢頭,以後會需要更多的Python開發人員,理由是以後每個人公司都會有自己的網

全棧雲一體機:為什麼大家想到卻讓他捷足先登?

                                     全棧雲一體機,從字面解讀,“全棧

瞭解這一行的腰包鼓鼓的程式輔導CS作業

我們都知道計算機這類理科專業,可能你開啟電腦聊幾分鐘微信,可能你就已經錯過了成為程式設計師大佬的機會。就像數學專業的同學彎腰撿了一支筆,然後發現黑板被寫滿從此再也沒有學懂數學。所以課後的作業自然也就沒法順利完成,轉而找程式作業代寫的同學也是屢見不鮮。那麼問題來了,計算機程式作業不同於其他專業的論文作業,計算機

8年的程式碼做過的專案下線程式設計師的意義在哪裡?

我堅信未來是我的,也是你的。但歸根結底是程式設計師的! ——忘記來自哪裡了 程式碼,正在改變世界。正是因為有了程式碼的存在,才有了百度、阿里巴巴、騰訊、京東、等的存在...... 下面是一位來自工作了八年的資深碼農的深刻感悟,正值“1024 程式設計

新手程式設計師?教你解決辦法基礎掌握動手敲程式碼就一臉懵逼

相信很多初學程式設計的朋友都有這樣的苦惱:為什麼我感覺自己基礎都掌握了,也看過很多視訊和資料了,但就是自己動手敲程式碼的時候就開始懵逼了! 通常新手程式設計師會以不同的方式來表達這個疑問,比如: “我通過線上課程學習了前端,但是我還是不知道怎麼用它來程式設計。” “我知道這個理論,可是怎麼把

NWT失敗反思:公司還怕得罪人

    2017年下半年,李某帶著研發部門不幹活,其實大家都心知肚明。可是工資還要照發啊。頭目甲向來不管理事(管事就是內鬥),頭目乙、股東吳瞭解情況,可能有點著急。這裡只是說可能,並不是說一定。如果真的著急,表現是完全不一樣的。   既然工資照發,還有這麼多活,人閒著也要利用起來。李某

阿里面試者吐槽:面試通過結果敗在背景調查上

一名程式設計師應聘阿里旗下企業支付寶,所有面試都通過了,結果卻敗在了背景調查上:支付寶P7 offer背景調查沒過,沒說什麼原因,再次進阿里失敗了,請問以後還有機會嗎? 據瞭解,大部分企業都會對面試者進行背景調查,所謂背景調查就是對面試者的簡歷背景做詳盡調查,以確保其提供的資料真實有效而非

本週新鮮事:有的技術線負責人我0點打電話睡覺很會養生。

大家知道 VIVO 上週釋出了一款很有逼格的手機 VIVO NEX,這款手機有個很炫的功能就是採用升降前置攝像頭配置,就是你拍照的時候會從手機頂部彈出一個鏡頭進行拍照,不用的時候會自動縮回去。但是呀,自從有人買了這個手機之後,還發現了一些有趣的事情。 NEX 事件 給大家說個笑死人的事情:前幾天 VIVO

致公元2018年:這樣有本事你再“冷”一點

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 週末!月末!!年末!!! 2018年的最後一個週末,貌似被賦予了一層額外的意義。 2018年,對網際網路來說,是不太平靜的一年。相比於前兩年的紅紅火火,裁員、優化、縮招,似乎成了年末的主旋律。