摘要:前言最近在產(chǎn)品新版本的服務(wù)發(fā)現(xiàn)和負(fù)載均衡方案上遇到了一個問題,在盡量不改動原生使用方式和代碼前提下,對又重新復(fù)習(xí)了一遍,略有體會。所有訪問該的請求,都會被轉(zhuǎn)發(fā)到后端的中。使用這種方案的原因,不外乎是外部無法訪問容器服務(wù)。
前言
最近在產(chǎn)品新版本的服務(wù)發(fā)現(xiàn)和負(fù)載均衡方案上遇到了一個問題,在盡量不改動原生k8s使用方式和代碼前提下,對service又重新復(fù)習(xí)了一遍,略有體會。
Servicek8s中service是一個面向微服務(wù)架構(gòu)的設(shè)計,它從k8s本身解決了容器集群的負(fù)載均衡,并開放式地支持了用戶所需要的各種負(fù)載均衡方案和使用場景。
通常,一個service被創(chuàng)建后會在集群中創(chuàng)建相應(yīng)的endpoints,隨后,controller-manager中的endpointsController會去檢查并向該endpoints填入關(guān)于這個service,符合下述所有條件的后端端點(即pod):
相同的namespace;
pod的labels能滿足service.Spec.selector(除非service.Spec.selector為空,這種情況下不會自動創(chuàng)建endpoints);
如果service開放了port,且是以字符串名字的形式(targetPort=[字符串]),則相應(yīng)的pod的某個container中必須有配置同名的port;
當(dāng)endpoints被更新后,kube-proxy會感知,并根據(jù)更新后的endpoints,在宿主機(jī)上做轉(zhuǎn)發(fā)規(guī)則的配置,kube-proxy目前支持iptables、ipvs兩種負(fù)載均衡方式,默認(rèn)是iptables。
DNS絕大部分使用k8s的人都會使用kubedns做服務(wù)發(fā)現(xiàn)和service domain的解析。kubedns會建立長連接即時檢查service的變化,一旦發(fā)現(xiàn)有service被創(chuàng)建,會根據(jù)service的類型,在數(shù)據(jù)庫中構(gòu)建service domain 到指定的CNAME或IP(cluster-IP)的映射,作為對該service domain 的dns解析結(jié)果。
service 的類型 ClusterIP最普遍的service類型,也是默認(rèn)類型。ClusterIP類型的service創(chuàng)建時,k8s會通過etcd從可分配的IP池中分配一個IP,該IP全局唯一,且不可修改。所有訪問該IP的請求,都會被iptables轉(zhuǎn)發(fā)到后端的endpoints中。
該類型下,service的cluster-ip會作為kube-dns的解析結(jié)果,返回給客戶端?;旧线@是私有云中服務(wù)內(nèi)部常用的方案,但是也只能集群內(nèi)服務(wù)互相訪問。
NodePort通過node的IP進(jìn)行地址轉(zhuǎn)換實現(xiàn)服務(wù)的可訪問性,外部訪問集群中任意一個node:port即可以訪問服務(wù)。
舉個例子:一個單副本的deployment,其pod運(yùn)行在node2上,通過nodePort方式開放服務(wù),外部client訪問node1_ip:port即可訪問到容器服務(wù)。這個過程中原理是:
client訪問node1_ip:port
node1對數(shù)據(jù)包做SNAT,將來源地址改成node1_ip
node1對數(shù)據(jù)包做DNAT,將目的地址改成node2_ip
node2收到數(shù)據(jù)包,根據(jù)port查找自身的端口,這個端口在service創(chuàng)建時就會與自身運(yùn)行的port做映射,所以這里數(shù)據(jù)包會被轉(zhuǎn)發(fā)到真實的容器中
數(shù)據(jù)響應(yīng)由容器發(fā)給node1,node1再返回給client
這種方案下,node上會產(chǎn)生端口的占用,所以要確保端口可用性。
另外,通過指定service.spec.externalTrafficPolicy=Local可以設(shè)置node上kube-proxy不轉(zhuǎn)發(fā)到其他node,參照上面的例子,由于node1沒有響應(yīng)的pod在運(yùn)行,所以node1上會直接drop數(shù)據(jù)包。
使用這種方案的原因,不外乎是:外部無法訪問容器服務(wù)。
LoadBalancer需要外部支持(GCP and Azure),用戶訪問service.spec.external-ip,該IP對應(yīng)到一個外部負(fù)載均衡的vip,外部服務(wù)對這個vip的請求,會被loadbalancer通過健康檢查和轉(zhuǎn)發(fā),發(fā)送到一個運(yùn)行著該服務(wù)pod的node上,并同樣通過nodePort里的端口映射,發(fā)送給容器。
上述是幾種比較普遍的service,隨著社區(qū)發(fā)展,又出現(xiàn)了一些新的類型,可以做更靈活的適配。
ExternalName用戶可以指定一個任意的名字,作為該service被解析的CNAME,這種類型的servcie不用指定clusterIP,因此kube-proxy不會管理這類service,這類service需要使用1.7版本以上的kubedns。比如用戶想創(chuàng)建一個service,但要讓所有容器訪問該service的請求都引導(dǎo)到用戶自己定義的外部域名服務(wù),就可以通過這個方式實現(xiàn)??梢哉f這個是最自由的一個方式:你希望服務(wù)被如何解析,服務(wù)就能被如何解析。你甚至可以給多個service配置同一個externalName。
headless serviceheadless service是一個特殊的ClusterIP類service,這種service創(chuàng)建時不指定clusterIP(--cluster-ip=None),因為這點,kube-proxy不會管這種service,于是node上不會有相關(guān)的iptables規(guī)則。
當(dāng)headless service有配置selector時,其對應(yīng)的所有后端節(jié)點,會被記錄到dns中,在訪問service domain時kube-dns會將所有endpoints返回,選擇哪個進(jìn)行訪問則是系統(tǒng)自己決定;
當(dāng)selector設(shè)置為空時,headless service會去尋找相同namespace下與自己同名的pod作為endpoints。這一點被應(yīng)用到statefulset中,當(dāng)一個三副本的statefulset(mysql1,mysql2,mysql3)運(yùn)行在不同節(jié)點時,我們可以通過域名的方式對他們分別訪問。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/32648.html
摘要:與已運(yùn)行相關(guān)的過濾規(guī)則負(fù)責(zé)檢查待調(diào)度與上已有之間的親和性關(guān)系。并且每個打分函數(shù)都可以配置對應(yīng)的權(quán)重值,下面介紹調(diào)度器策略配置時,也會涉及權(quán)重值的配置。默認(rèn)權(quán)重值是,如果覺得某個打分函數(shù)特別重要,便可以加大該權(quán)重值。 一、概述 Kubernetes 是 Google 開源的容器集群管理系統(tǒng)(谷歌內(nèi)部:Borg),而今天要介紹的 kube-scheduler 是 k8s 系統(tǒng)的核心組件之一...
摘要:本文將主要分析原生的網(wǎng)絡(luò)策略。筆者認(rèn)為這個問題主要是因為使用者不了解網(wǎng)絡(luò)策略的省缺行為??蛇x字段,字符串,策略規(guī)則類型,表示該網(wǎng)絡(luò)策略中包含哪些類型的策略,可選為或?;ハ嚅g為或的關(guān)系,滿足其中一條則放行。標(biāo)準(zhǔn),除了指定的放行外其他都禁止。 k8s中的網(wǎng)絡(luò)策略主要分為原生 NetworkPolicy 和第三方網(wǎng)絡(luò)插件提供的網(wǎng)絡(luò)策略。本文將主要分析原生Networkpolicy的網(wǎng)絡(luò)策略。...
摘要:簡稱,是在年發(fā)布的一個開源項目。網(wǎng)絡(luò)要能夠通信,必須部署網(wǎng)絡(luò),是其中一個可選方案。最常使用,可以管理多個副本,并確保按照期望的狀態(tài)運(yùn)行,底層調(diào)用。用于每個最多只運(yùn)行一個副本的場景。 Kubernetes 簡稱 k8s,是 google 在 2014 年發(fā)布的一個開源項目。 Kubernetes 解決了哪些問題? 真實的生產(chǎn)環(huán)境應(yīng)用會包含多個容器,而這些容器還很可能會跨越多個服務(wù)器主機(jī)部...
摘要:年月的華為大會上,兩人開始了對的討論。聯(lián)合創(chuàng)始人及梁勝在月上海中,聯(lián)合華為布道華為云和以下簡稱的合作由來已久。這一觀點與梁勝的看法不謀而合。甫一見面,方璞便向梁勝拋出了一個重磅問題:在K8S之后,你覺得未來最有前途的容器技術(shù)是什么呢?方璞是華為云容器服務(wù)域的產(chǎn)品總監(jiān),主要負(fù)責(zé)華為云容器的構(gòu)建和部署。我覺得是Istio。方璞說。2016年9月的華為CONNECT大會上,兩人開始了對Istio的...
摘要:組件會給每個分配一個,則替代了的來實現(xiàn)服務(wù)發(fā)現(xiàn),在的容器內(nèi)部依然可以訪問服務(wù)來獲取元數(shù)據(jù)信息。的需要在中實現(xiàn)一個,目前只有,而則維護(hù)了自己的版本在其中提供了。 在Rancher 1.0版本開始,Rancher逐步增加了Kubernetes、Swarm、Mesos等多編排引擎的支持,很多朋友就此產(chǎn)生了疑惑,諸如Cattle引擎和這幾個之間到底什么關(guān)系?每種引擎是如何支持的?自家的業(yè)務(wù)環(huán)境...
閱讀 2226·2021-11-15 11:38
閱讀 1179·2021-09-06 15:02
閱讀 3432·2021-08-27 13:12
閱讀 1406·2019-08-30 14:20
閱讀 2426·2019-08-29 15:08
閱讀 668·2019-08-29 14:08
閱讀 1754·2019-08-29 13:43
閱讀 1488·2019-08-26 12:11