service能去调另外一个service吗_kubernetes的service和pod是如何关联的?
kubernetes為我們提供了更方便管理容器的方式,大服務(wù)集群環(huán)境下不需要開發(fā)人員去關(guān)注底層的網(wǎng)絡(luò)層邏輯,就能創(chuàng)建出一個(gè)穩(wěn)定的集群服務(wù)。
下圖說明了pod和service的關(guān)聯(lián)原理圖,且說明了服務(wù)之間通信數(shù)據(jù)轉(zhuǎn)發(fā)的原理
service和pod關(guān)聯(lián)原理圖
創(chuàng)建有副本的pod
當(dāng)我們創(chuàng)建pod時(shí),僅僅是創(chuàng)建了pod,要為其創(chuàng)建rc(ReplicationController),他才會(huì)有固定的副本。
創(chuàng)建service
然后為其創(chuàng)建service,集群內(nèi)部才能訪問該pod,使用 NodePort 或者 LoadBalancer 類型的 Service,外部網(wǎng)絡(luò)也可以訪問該pod;每個(gè) service 會(huì)創(chuàng)建出來一個(gè)虛擬 ip,通過訪問 vip:port 就能獲取服務(wù)的內(nèi)容(內(nèi)部訪問,因?yàn)檫@是一個(gè)vip,外部無法訪問的)
創(chuàng)建service時(shí),其配置文件中的selector:指定后端綁定的pod,
例如serviceA的
selector:
app:a
env:dev
podA
labels:
app:a
env:dev
podB
labels:
app:a
env:dev
那么我們的serviceA 就會(huì)綁定podA,podB,綁定的pod的ip會(huì)填寫到serviceA的endpoint中,內(nèi)部訪問(vip:port方式訪問)serviceA,根據(jù)serviceA的vip:port直接訪問,serviceA會(huì)隨機(jī)的將服務(wù)轉(zhuǎn)發(fā)給后端的pod(podA,podB)已上實(shí)現(xiàn)是通過kube-proxy實(shí)現(xiàn)的,kube-proxy默認(rèn)使用iptables模,實(shí)際中使用ipvs會(huì)更實(shí)用;
kube-proxy的模式
userspace: client -> iptables -> kube-proxy -> backend pod(rr), iptables只是把虛ip轉(zhuǎn)換成kube-proxy的ip,通過kube-proxy自己維護(hù)的不同端口來輪詢轉(zhuǎn)發(fā)到后端的pod上。
iptables: client -> iptables -> backend pod(random),kube-proxy只是監(jiān)聽master上service的創(chuàng)建,之后動(dòng)態(tài)添加/刪除本機(jī)上的iptables規(guī)則
ipvs: client -> ipvs ->backend pod, ipvs是一個(gè)內(nèi)核模塊
在ipvs模式下,kube-proxy監(jiān)聽API Server中service和endpoint的變化情況,調(diào)用netlink接口創(chuàng)建相應(yīng)的ipvs規(guī)則,并定期將ipvs規(guī)則與Kubernetes服 Services和Endpoints同步。保證IPVS狀態(tài)。當(dāng)訪問Services時(shí),IPVS將流量定向到后端pod之一。
ipvs 為大型集群提供了更好的可擴(kuò)展性和性能
ipvs 支持比 iptables 更復(fù)雜的負(fù)載均衡算法(最小負(fù)載、最少連接、加權(quán)等等)
ipvs 支持服務(wù)器健康檢查和連接重試等功能
服務(wù)發(fā)現(xiàn)
在k8s中用了兩個(gè)方案讓服務(wù)使用方找到我們定義的Service:環(huán)境變量 和 DNS。
環(huán)境變量
每當(dāng)有service被創(chuàng)建出來之后,各個(gè)node(宿主機(jī))上的kubelet,就會(huì)把service name加到自己宿主機(jī)的環(huán)境變量中,供所有Pod使用。環(huán)境變量的命名規(guī)則是
{SERVICE_NAME}_SERVICE_HOST,
${SERVICE_NAME}SERVICE_PORT,其中SERVICE_NAME是新serviceName的大寫形式,serviceName中的橫杠-會(huì)被替換成下劃線.
使用環(huán)境變量有一個(gè)隱含的創(chuàng)建順序,即服務(wù)使用方在通過環(huán)境變量訪問一個(gè)service的時(shí)候,這個(gè)service必須已經(jīng)存在了。
使用env命令可以看到pod內(nèi)部有很多kubernetes內(nèi)部組件的環(huán)境變量
DNS
這是官方不推薦的做法,推薦用來跟k8s的外部服務(wù)進(jìn)行交互。
總結(jié)
以上是生活随笔為你收集整理的service能去调另外一个service吗_kubernetes的service和pod是如何关联的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 官方公布《人中之龙 8》更多细节:可驾驶
- 下一篇: 联想天津工厂落成 未来年产300万电脑及