日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

13 张图带你学懂 Kubernetes Service(转载)

發(fā)布時(shí)間:2025/3/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 13 张图带你学懂 Kubernetes Service(转载) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


在 Kubernetes 中 Service 主要有4種不同的類(lèi)型,其中的 ClusterIP 是最基礎(chǔ)的,如下圖所示:

當(dāng)我們創(chuàng)建一個(gè) NodePort 的 Service 時(shí),它也會(huì)創(chuàng)建一個(gè) ClusterIP,而如果你創(chuàng)建一個(gè) LoadBalancer,它就會(huì)創(chuàng)建一個(gè) NodePort,然后創(chuàng)建一個(gè) ClusterIP

此外我們還需要明白 Service 是指向 pods 的,Service 不是直接指向 Deployments 或 ReplicaSets,而是直接使用 labels 標(biāo)簽指向 Pod,這種方式就提供了極大的靈活性,因?yàn)橥ㄟ^(guò)什么方式創(chuàng)建的 Pod 其實(shí)并不重要。接下來(lái)我們通過(guò)一個(gè)簡(jiǎn)單的例子開(kāi)始,我們用不同的 Service 類(lèi)型來(lái)逐步擴(kuò)展,看看這些 Service 是如何建立的。

No Services

最開(kāi)始我們沒(méi)有任何的 Services。

我們有兩個(gè)節(jié)點(diǎn),一個(gè) Pod,節(jié)點(diǎn)有外網(wǎng)(4.4.4.1、4.4.4.2)和內(nèi)網(wǎng)(1.1.1.1、1.1.1.2)的 IP 地址,pod-python 這個(gè) Pod 只有一個(gè)內(nèi)部的 IP 地址。

現(xiàn)在我們添加第二個(gè)名為 pod-nginx 的 Pod,它被調(diào)度在 node-1 節(jié)點(diǎn)上。在 Kubernetes 中,所有的 Pod 之間都可以通過(guò) Pod 的 IP 進(jìn)行通信,不管它們運(yùn)行在哪個(gè)節(jié)點(diǎn)上。這意味著 pod-nginx 可以使用其內(nèi)部IP 1.1.1.3 來(lái) ping 和連接 pod-python 這個(gè) Pod。

現(xiàn)在如果 pod-python 掛掉了重新創(chuàng)建了一個(gè)新的 pod-python 出來(lái)(本文不涉及如何管理和控制 pods),重新分配了一個(gè)新的 1.1.1.5 的 Pod IP 地址,這個(gè)時(shí)候 pod-nginx 就無(wú)法再達(dá)到 1.1.1.3 這個(gè)之前的地址了,為了防止這種情況發(fā)生,我們就需要?jiǎng)?chuàng)建一個(gè) Service 服務(wù)了!
?

ClusterIP

和上面同樣的場(chǎng)景,但是我們創(chuàng)建了一個(gè)名為 service-python 類(lèi)型為 ClusterIP 的 Service 服務(wù),一個(gè) Service 并不像 Pod 那樣運(yùn)行在一個(gè)特定的節(jié)點(diǎn)上,這里我們可以假設(shè)一個(gè) Service 只是在整個(gè)集群內(nèi)部的內(nèi)存中可用就可以了。

pod-nginx 可以安全地連接到 1.1.10.1 這個(gè) ClusterIP 或直接通過(guò) dns 名service-python 進(jìn)行通信,并被重定向到后面一個(gè)可用的 Pod 上去。

現(xiàn)在我們來(lái)稍微擴(kuò)展下這個(gè)示例,啟動(dòng)3個(gè) python 實(shí)例,現(xiàn)在我們來(lái)顯示所有 Pod 和 Service 內(nèi)部 IP 地址的端口。

集群內(nèi)部的所有 Pods 都可以通過(guò)?http://1.1.10.1:3000?或者?http://service-python:3000?來(lái)訪問(wèn)到后面的 python pods 的443端口。

service-python?這個(gè) Service ?是隨機(jī)或輪詢的方式來(lái)轉(zhuǎn)發(fā)請(qǐng)求的,這個(gè)就是 ClusterIP Service 的作用,它通過(guò)一個(gè)名稱和一個(gè) IP 讓集群內(nèi)部的 Pods 可用。

上圖中的 service-python 這個(gè) Service 可以用下面的 yaml 文件來(lái)創(chuàng)建:

apiVersion:?v1 kind:?Service metadata:name:?service-python spec:ports:-?port:?3000protocol:?TCPtargetPort:?443selector:run:?pod-pythontype:?ClusterIP

創(chuàng)建后,可以用?kubectl get svc?命令來(lái)查看:

NodePort

現(xiàn)在我們想讓 ClusterIP Service 可以從集群外部進(jìn)行訪問(wèn),為此我們需要把它轉(zhuǎn)換成 NodePort 類(lèi)型的 Service,在我們的例子中,我們只需要簡(jiǎn)單修改上面的?service-python?這個(gè) Service 服務(wù)即可:

apiVersion:?v1 kind:?Service metadata:name:?service-python spec:ports:-?port:?3000protocol:?TCPtargetPort:?443nodePort:?30080selector:run:?pod-pythontype:?NodePort

更新完成后,如下圖所示:

這意味著我們的內(nèi)部的?service-python?這個(gè) Service 現(xiàn)在也可以通過(guò)30080 端口從每個(gè)節(jié)點(diǎn)的內(nèi)部和外部 IP 地址進(jìn)行訪問(wèn)了。

集群內(nèi)部的 Pod 也可以通過(guò)內(nèi)網(wǎng)節(jié)點(diǎn) IP 連接到 30080 端口。

運(yùn)行?kubectl get svc?命令來(lái)查看這個(gè) NodePort 的 Service,可以看到同樣有一個(gè) ClusterIP,只是類(lèi)型和額外的節(jié)點(diǎn)端口不同。在內(nèi)部,NodePort 服務(wù)仍然像之前的 ClusterIP 服務(wù)一樣。

LoadBalancer

如果我們希望有一個(gè)單獨(dú)的 IP 地址,將請(qǐng)求分配給所有的外部節(jié)點(diǎn)IP(比如使用 round robin),我們就可以使用 LoadBalancer 服務(wù),所以它是建立在 NodePort 服務(wù)之上的。


一個(gè) LoadBalancer 服務(wù)創(chuàng)建了一個(gè) NodePort 服務(wù),NodePort 服務(wù)創(chuàng)建了一個(gè) ClusterIP 服務(wù)。我們也只需要將服務(wù)類(lèi)型更改為 LoadBalancer 即可。

apiVersion:?v1 kind:?Service metadata:name:?service-python spec:ports:-?port:?3000protocol:?TCPtargetPort:?443nodePort:?30080selector:run:?pod-pythontype:?LoadBalancer

LoadBalancer 服務(wù)所做的就是創(chuàng)建一個(gè) NodePort 服務(wù),此外,它還會(huì)向托管 Kubernetes 集群的提供商發(fā)送一條消息,要求設(shè)置一個(gè)指向所有外部節(jié)點(diǎn) IP 和特定 nodePort 端口的負(fù)載均衡器,當(dāng)然前提條件是要提供商支持。

現(xiàn)在運(yùn)行?kubectl get svc?可以看到新增了 external-IP 和 LoadBalancer 的類(lèi)型。

LoadBalancer 服務(wù)仍然像和以前一樣在節(jié)點(diǎn)內(nèi)部和外部 IP 上打開(kāi) 30080 端口。

ExternalName

最后是 ExternalName 服務(wù),這個(gè)服務(wù)和前面的幾種類(lèi)型的服務(wù)有點(diǎn)分離。它創(chuàng)建一個(gè)內(nèi)部服務(wù),其端點(diǎn)指向一個(gè) DNS 名。

我們假設(shè) pod-nginx 運(yùn)行在 Kubernetes 集群中,但是 python api 服務(wù)在集群外部。

這里?pod-nginx?這個(gè) Pod 可以直接通過(guò) http://remote.server.url.com 連接到外部的 python api 服務(wù)上去,但是如果我們考慮到以后某個(gè)時(shí)間節(jié)點(diǎn)希望把這個(gè) python api 服務(wù)集成到 Kubernetes 集群中去,還不希望去更改連接的地址,這個(gè)時(shí)候我們就可以創(chuàng)建一個(gè) ExternalName 類(lèi)型的 Service 服務(wù)了。

對(duì)應(yīng)的 YAML 資源清單文件如下所示:

kind:?Service apiVersion:?v1 metadata:name:?service-python spec:ports:-?port:?3000protocol:?TCPtargetPort:?443type:?ExternalNameexternalName:?remote.server.url.com

現(xiàn)在?pod-nginx?就可以很方便地通過(guò)?http://service-python:3000?進(jìn)行通信了,就像使用 ClusterIP 服務(wù)一樣,當(dāng)我們決定將 python api 這個(gè)服務(wù)也遷移到我們 Kubernetes 集群中時(shí),我們只需要將服務(wù)改為 ClusterIP 服務(wù),并設(shè)置正確的標(biāo)簽即可,其他都不需要更改了。

到這里我們就用 13 張圖將 Kubernetes 中的 Service 解釋得明明白白清清楚楚真真切切了。
原文鏈接:https://medium.com/swlh/kubernetes-services-simply-visually-explained-2d84e58d70e5

本文轉(zhuǎn)載自:「K8s 技術(shù)圈」,原文:https://tinyurl.com/y5v5hcuk,版權(quán)歸原作者所有

?

?

?

總結(jié)

以上是生活随笔為你收集整理的13 张图带你学懂 Kubernetes Service(转载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。