一個 service,二個IP,三個 port?
1、同一個 Pod 中 容器通信
2、同一個節(jié)點(diǎn)多個 Pod 之間通信
3、跨節(jié)點(diǎn)的pod通信
4、外部網(wǎng)絡(luò)和 pod 之間通信
一個 service,3個IP,三個 port?
NodePort
nodeport是外部流量訪問K8s的一種方式,即nodeIP:nodePort,是提供給外部流量訪問K8s集群資源的一種方式??偟膩碚f,我們可以通過在service中配置nodeport,從而使得我們可以通過集群外的機(jī)器進(jìn)行訪問我們的服務(wù)。
Port
port是K8s集群內(nèi)部服務(wù)訪問service的入口。是service暴露在Cluster上的端口,ClusterIP:Port。如下面的yaml配置文件所示,K8s集群內(nèi)部節(jié)點(diǎn)可以通過30080端口訪問Nginx服務(wù),然而外部網(wǎng)絡(luò)還是不能夠訪問到服務(wù),因為nodePort參數(shù)沒有配置。
targetPort
targetPort是容器的端口,也是最終底層的服務(wù)所提供的端口,所以說targetPod也就是Pod的端口。從port或者是nodePort進(jìn)入的流量,經(jīng)過路由轉(zhuǎn)發(fā)之后,最終都會都通過targetPort進(jìn)入到Pod中。
targetPort要與Dockerfile中暴露的端口一致。
apiVersion: v1
kind: Service
metadata:
?name: nginx-service
spec:
?type: NodePort ? ? ? ? // 配置為NodePort,外部可以訪問
?ports:
?- port: 30080 ? ? ? ? ?// 容器間,服務(wù)調(diào)用的端口
? ?targetPort: 80 ? ? ? // 容器暴露的端口,與Dockerfile暴露端口保持一致
? ?nodePort: 30001 ? ? ?// NodePort,外部訪問的端口,如果不顯示指定,k8s會隨機(jī)分配一個端口
?selector:
? name: nginx-pod
?
Kubernetes集群里有三種IP地址,分別如下:
Node IP:Node節(jié)點(diǎn)的IP地址,即物理網(wǎng)卡的IP地址。
Pod IP:Pod的IP地址,即docker容器的IP地址,此為虛擬IP地址。
Cluster IP:Service的IP地址,此為虛擬IP地址。
Node IP
可以是物理機(jī)的IP(也可能是虛擬機(jī)IP)。每個Service都會在Node節(jié)點(diǎn)上開通一個端口,外部可以通過NodeIP:NodePort即可訪問Service里的Pod,和我們訪問服務(wù)器部署的項目一樣,IP:端口/項目名。
在kubernetes查詢Node IP:
1.kubectl get nodes
2.kubectl describe node nodeName
3.顯示出來的InternalIP就是NodeIP
Pod IP
Pod IP是每個Pod的IP地址,他是Docker Engine根據(jù)docker網(wǎng)橋的IP地址段進(jìn)行分配的,通常是一個虛擬的二層網(wǎng)絡(luò)。
同Service下的pod可以直接根據(jù)PodIP相互通信。
不同Service下的pod在集群間pod通信要借助于 cluster ip。
pod和集群外通信,要借助于node ip。
在kubernetes查詢Pod IP:
1.kubectl get pods
2.kubectl describe pod podName
Cluster IP
Service的IP地址,此為虛擬IP地址。外部網(wǎng)絡(luò)無法ping通,只有kubernetes集群內(nèi)部訪問使用。
在kubernetes查詢Cluster IP: kubectl -n 命名空間 get Service即可看到ClusterIP
Cluster IP是一個虛擬的IP,但更像是一個偽造的IP網(wǎng)絡(luò),原因有以下幾點(diǎn):
Cluster IP僅僅作用于Kubernetes Service這個對象,并由Kubernetes管理和分配iP地址
Cluster IP無法被ping,
Cluster IP只能結(jié)合Service Port組成一個具體的通信端口,單獨(dú)的Cluster IP不具備通信的基礎(chǔ),并且他們屬于Kubernetes集群這樣一個封閉的空間。
在不同Service下的pod節(jié)點(diǎn)在集群間相互訪問可以通過Cluster IP
?
1、同一個 Pod 中 容器通信
同一個pod內(nèi)共享網(wǎng)絡(luò)命名空間,容器之間通過訪問 127.0.0.1:(端口)即可
2、同一個節(jié)點(diǎn)多個 Pod 之間通信
pause 容器啟動之前,會為容器創(chuàng)建虛擬一對 ethernet 接口,一個保留在宿主機(jī) vethxxx(插在網(wǎng)橋上),一個保留在容器網(wǎng)絡(luò)命名空間內(nèi),并重命名為eth0。兩個虛擬接口的兩端,從一端進(jìn)入,另一端出來。任何 Pod 連接到該網(wǎng)橋的 Pod 都可以收發(fā)數(shù)據(jù)。
同節(jié)點(diǎn)不同 pod 之間通信:通過 linux 虛擬以太網(wǎng)設(shè)備或者是用兩個虛擬接口組成的以太網(wǎng)接口對不同的網(wǎng)絡(luò)命名空間連接起來通信
3、跨節(jié)點(diǎn)的pod通信(CNI:容器網(wǎng)絡(luò)接口)
CNI 是一種標(biāo)準(zhǔn),它旨在為容器平臺提供網(wǎng)絡(luò)的標(biāo)準(zhǔn)化。不同的容器平臺(比如目前的 kubernetes、mesos 和 rkt)能夠通過相同的接口調(diào)用不同的網(wǎng)絡(luò)組件。
目前kubernetes支持的CNI組件種類很多,例如:bridge calico calico-ipam dhcp flannel host-local ipvlan loopback macvlan portmap ptp sample tuning vlan。在docker中,主流的跨主機(jī)通信方案主要有一下幾種:
1)基于隧道的overlay網(wǎng)絡(luò):按隧道類型來說,不同的公司或者組織有不同的實現(xiàn)方案。docker原生的overlay網(wǎng)絡(luò)就是基于vxlan隧道實現(xiàn)的。ovn則需要通過geneve或者stt隧道來實現(xiàn)的。flannel最新版本也開始默認(rèn)基于vxlan實現(xiàn)overlay網(wǎng)絡(luò)。
2)基于包封裝的overlay網(wǎng)絡(luò):基于UDP封裝等數(shù)據(jù)包包裝方式,在docker集群上實現(xiàn)跨主機(jī)網(wǎng)絡(luò)。典型實現(xiàn)方案有weave、flannel的早期版本。
3)基于三層實現(xiàn)SDN網(wǎng)絡(luò):基于三層協(xié)議和路由,直接在三層上實現(xiàn)跨主機(jī)網(wǎng)絡(luò),并且通過iptables實現(xiàn)網(wǎng)絡(luò)的安全隔離。典型的方案為Project Calico。同時對不支持三層路由的環(huán)境,Project Calico還提供了基于IPIP封裝的跨主機(jī)網(wǎng)絡(luò)實現(xiàn)
通信方式
4、外部訪問集群
從集群外訪問集群有多種方式,比如loadbalancer,Ingress,nodeport,nodeport和loadbalancer是service的兩個基本類型,是將service直接對外暴露的方式,ingress則是提供了七層負(fù)載均衡,其基本原理將外部流量轉(zhuǎn)發(fā)到內(nèi)部的service,再轉(zhuǎn)發(fā)到后端endpoints,在平時的使用中,我們可以依據(jù)具體的業(yè)務(wù)需求選用不同的方式。這里主要介紹nodeport和ingress方式。
Nodeport
通過將 Service 的類型設(shè)置為 NodePort,就可以在 Cluster 中的主機(jī)上通過一個指定端口暴露服務(wù)。注意通過 Cluster 中每臺主機(jī)上的該指定端口都可以訪問到該服務(wù),發(fā)送到該主機(jī)端口的請求會被 Kubernetes 路由到提供服務(wù)的 Pod 上。采用這種服務(wù)類型,可以在 Kubernetes cluster 網(wǎng)絡(luò)外通過主機(jī) IP:端口的方式訪問到服務(wù)。
?influxdb 例子:
kind: Service
apiVersion: v1
metadata:
name: influxdb
spec:
type: NodePort
ports:
- port: 8086
nodePort: 31112
selector:
name: influxdb
Ingress(重點(diǎn))
Ingress 是推薦在生產(chǎn)環(huán)境使用的方式,它起到了七層負(fù)載均衡器和 Http 方向代理的作用,可以根據(jù)不同的 url 把入口流量分發(fā)到不同的后端Service。外部客戶端只看到 http://foo.bar.com 這個服務(wù)器,屏蔽了內(nèi)部多個 Service 的實現(xiàn)方式。采用這種方式,簡化了客戶端的訪問,并增加了后端實現(xiàn)和部署的靈活性,可以在不影響客戶端的情況下對后端的服務(wù)部署進(jìn)行調(diào)整。
其部署的 yaml 可以參考如下模板:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: test.name.com
http:
paths:
- path: /test
backend:
serviceName: service-1
servicePort: 8118
- path: /name
backend:
serviceName: service-2
servicePort: 8228
ingress模板,定義通過 http://test.name.com 來訪問服務(wù),在虛擬主機(jī)http://test.name.com下面定義了兩個Path,其中/test被分發(fā)到后端服務(wù)s1,/name被分發(fā)到后端服務(wù)s2。?文章來源:http://www.zghlxwxcb.cn/news/detail-727636.html
集群中可以定義多個ingress,來完成不同服務(wù)的轉(zhuǎn)發(fā),這里需要一個ingress controller來管理集群中的Ingress規(guī)則。Ingress Contronler 通過與 Kubernetes API 交互,動態(tài)的去感知集群中 Ingress 規(guī)則變化,然后讀取它,按照自定義的規(guī)則,規(guī)則就是寫明了哪個域名對應(yīng)哪個service文章來源地址http://www.zghlxwxcb.cn/news/detail-727636.html
到了這里,關(guān)于3.Kubernetes—pod通信網(wǎng)絡(luò)原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!