k8s 服務(wù)

Service、Pod、Label、Endpoint、Kube-proxy、Cluster IP、LoadBalance、NodePort、環(huán)境變量、DNS、Expose

Service

微服務(wù)架構(gòu)的應(yīng)用需要有好的服務(wù)編排支持。k8s中的Service提供了一套簡(jiǎn)化的服務(wù)代理和發(fā)現(xiàn)機(jī)制,天然適應(yīng)微服務(wù)架構(gòu)。
Service定義了服務(wù)的入口地址。前端應(yīng)用(pod)通過(guò)入口地址訪問(wèn)其背后由pod副本組成的集群實(shí)例。service與其后端pod副本集群間通過(guò)label selector實(shí)現(xiàn)“無(wú)縫對(duì)接”。
負(fù)載均衡器,為這組pod開(kāi)啟對(duì)外服務(wù)端口,并且把這些pod的endpoint列表加入端口的轉(zhuǎn)發(fā)列表中,客戶端就可以通過(guò)負(fù)載均衡器的對(duì)外IP地址+服務(wù)端口來(lái)訪問(wèn)此服務(wù),而客戶端的請(qǐng)求由負(fù)載均衡器的算法來(lái)決定被轉(zhuǎn)發(fā)到哪個(gè)pod。
kube-proxy是軟件負(fù)載均衡器,負(fù)責(zé)把對(duì)service的請(qǐng)求轉(zhuǎn)發(fā)到后端的pod實(shí)例,并在內(nèi)部實(shí)現(xiàn)服務(wù)的負(fù)載均衡與會(huì)話保持機(jī)制。
每個(gè)service有全局唯一的虛擬IP地址,即cluster ip。這樣,每個(gè)服務(wù)就變成了具備唯一IP地址的“通信節(jié)點(diǎn)”,服務(wù)調(diào)用就變成了TCP網(wǎng)絡(luò)通信問(wèn)題。

pod的endpoint地址會(huì)隨著pod的銷毀和重新創(chuàng)建而發(fā)生改變,因?yàn)閜od的ip會(huì)變化。

pod的ip是在容器中配置。service的cluster ip是在iptables中配置,并映射到pod ip。iptables將訪問(wèn)service的流量使用類似輪詢的負(fù)載均衡策略轉(zhuǎn)發(fā)到后端pod。

除了通過(guò)cluster ip訪問(wèn)service,還可以通過(guò)DNS。

原理

在k8s中,受到RC調(diào)控的時(shí)候,Pod副本是變化的,對(duì)應(yīng)的虛擬IP也是變化的,比如發(fā)生遷移、伸縮或者更新的時(shí)候。k8s的Service是抽象概念,它定義了一組Pod邏輯集合以及訪問(wèn)它們的策略。Service的目標(biāo)是提供一種橋梁,為訪問(wèn)者提供一個(gè)固定訪問(wèn)地址,用于在訪問(wèn)時(shí)重定向到相應(yīng)的后端,這使得非k8s原生應(yīng)用程序,在無(wú)須為Kubemces編寫特定代碼的前提下,輕松訪問(wèn)后端。
 需要注意的是,k8s分配給Service的固定IP是虛擬IP,并不是真實(shí)的IP,在外部是無(wú)法尋址。真實(shí)的系統(tǒng)實(shí)現(xiàn)上,k8s是通過(guò)kube-proxy組件來(lái)實(shí)現(xiàn)虛擬IP路由及轉(zhuǎn)發(fā)。ku-proxy組件是基于iptables實(shí)現(xiàn)路由轉(zhuǎn)發(fā)。
通過(guò)分析、識(shí)別并建模系統(tǒng)中的所有服務(wù)為微服務(wù)-----Kubernetes Service,最終系統(tǒng)由多個(gè)提供不同業(yè)務(wù)能力而又彼此獨(dú)立的微服務(wù)單元所組成,服務(wù)之間通過(guò)TCP/IP進(jìn)行通信。

service的訪問(wèn)ip和endpoint/pod ip都會(huì)在k8s的dns服務(wù)器里存儲(chǔ)域名和ip的映射關(guān)系。

Service代理外部服務(wù)

Service不僅可以代理Pod,還可以代理任意其他后端,比如運(yùn)行在k8s外部的Mysql、Oracle等。
無(wú)頭(headless)service沒(méi)有selector,這樣就不會(huì)創(chuàng)建相關(guān)的endpoints對(duì)象。再手動(dòng)將service映射到指定的endpoints,即通過(guò)定義兩個(gè)同名的service和endPoints來(lái)實(shí)現(xiàn)的。service抽象類訪問(wèn)pod,也能抽象其他類型的backend。

Service內(nèi)部負(fù)載均衡

當(dāng)Service的Endpoints包含多個(gè)IP的時(shí)候,即服務(wù)代理存在多個(gè)后端,將進(jìn)行請(qǐng)求的負(fù)載均衡。默認(rèn)的負(fù)載均衡策略是輪詢或者隨機(jī)(由kube-proxy的模式?jīng)Q定)。同時(shí),Service上通過(guò)設(shè)置Service-->spec-->sessionAffinity=ClientIP,來(lái)實(shí)現(xiàn)基于源IP地址的會(huì)話保持。

發(fā)布Service(service的種類)

Service的虛擬IP是由k8s虛擬出來(lái)的內(nèi)部網(wǎng)絡(luò),外部是無(wú)法尋址到的。但有些服務(wù)需要被外部訪問(wèn)到。這時(shí)就需要增加一層網(wǎng)絡(luò)轉(zhuǎn)發(fā),即外網(wǎng)到內(nèi)網(wǎng)的轉(zhuǎn)發(fā)。k8s提供了NodePort、LoadBalancer、Ingress三種方式。

  • clusterIP(cluster內(nèi)部訪問(wèn)service)
    Cluster中的pod可以通過(guò)serviceName.namespace_name訪問(wèn)service。在同一個(gè)namespace的可以省略namespace_name。
  • nodePort(cluster外部訪問(wèn)service)
    service通過(guò)cluster節(jié)點(diǎn)的靜態(tài)端口對(duì)外提供服務(wù)。cluster外部通過(guò)任意nodeIP+nodePort訪問(wèn)service。默認(rèn)端口范圍是30000-32767。
  • loadbalancer
    公有云平臺(tái)(例如GCE)的load balance對(duì)外提供服務(wù)。一些高級(jí)的L7轉(zhuǎn)發(fā)功能,例如基于HTTP header、cookie、URL的轉(zhuǎn)發(fā)就做不了。
service的自發(fā)現(xiàn)機(jī)制

k8s中有一個(gè)很重要的服務(wù)自發(fā)現(xiàn)特性。一旦service被創(chuàng)建,該service的IP和port等信息都可以被注入到pod中供它們使用。k8s支持兩種service發(fā)現(xiàn)機(jī)制:環(huán)境變量和DNS。

  • 環(huán)境變量方式
      k8s創(chuàng)建Pod時(shí)會(huì)自動(dòng)添加所有可用的service環(huán)境變量到該P(yáng)od中,如有需要,這些環(huán)境變量就被注入Pod內(nèi)的容器里。環(huán)境變量的注入只發(fā)生在Pod創(chuàng)建時(shí),且不會(huì)被自動(dòng)更新。這個(gè)特點(diǎn)暗含了service和訪問(wèn)該service的Pod的創(chuàng)建時(shí)間的先后順序。
  • DNS方式
    k8s集群支持DNS服務(wù)。這個(gè)DNS服務(wù)器使用k8s的watchAPI,不間斷的監(jiān)測(cè)新的service的創(chuàng)建并為每個(gè)service創(chuàng)建一個(gè)DNS記錄。如果DNS在整個(gè)集群范圍內(nèi)都可用,那么所有的Pod都能夠自動(dòng)解析service的域名。
    服務(wù)發(fā)現(xiàn)用service的name與cluster ip地址做dns域名映射即可解決。
    k8s通過(guò)add-on增值包的方式引入dns系統(tǒng),把服務(wù)名作為dns域名,程序使用服務(wù)名來(lái)建立通信連接。
多個(gè)service如何避免地址和端口沖突

k8s為service分配唯一的ClusterIP,所以當(dāng)使用ClusterIP:port的組合訪問(wèn)service的時(shí)候,這個(gè)組合一定不會(huì)發(fā)生重復(fù)。另一方面,kube-proxy為每個(gè)service真正打開(kāi)的是不會(huì)重復(fù)的隨機(jī)端口,用戶在service描述文件中指定的訪問(wèn)端口會(huì)被映射到這個(gè)隨機(jī)端口上。

service的不足

k8s使用iptables和kube-proxy解析service的人口地址,在中小規(guī)模的集群中運(yùn)行良好,但是當(dāng)service的數(shù)量超過(guò)一定規(guī)模時(shí),仍然有些問(wèn)題。首當(dāng)其沖的便是service環(huán)境變量泛濫,以及service與使用service的pod兩者創(chuàng)建時(shí)間先后的制約關(guān)系。目前來(lái)看,很多使用者在使用k8s時(shí)往往會(huì)開(kāi)發(fā)一套自己的Router組件來(lái)替代service,以便更好地掌控和定制這部分功能。

如果覺(jué)得通過(guò)yaml方式創(chuàng)建service比較麻煩,kubectl提供expose子命令直接將deployment暴露為服務(wù)。

參考

  • 《Kubernetes 權(quán)威指南》
  • 《每天5分鐘玩轉(zhuǎn)kubernetes》
  • 《Kubernetes 權(quán)威指南-企業(yè)級(jí)容器云實(shí)踐》
  • http://www.lxweimin.com/p/d53b5df16e92
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,656評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,697評(píng)論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,098評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,855評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,254評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,473評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,014評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,833評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,016評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,273評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,680評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,946評(píng)論 1 288
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,730評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,006評(píng)論 2 374

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