k8s集群內(nèi)部服務(wù)發(fā)現(xiàn)的方式有兩種:
1、通過(guò)變量發(fā)現(xiàn)
只能獲取相同namespace里的變量
變量的獲取有先后順序,引用的變量必須要先創(chuàng)建
2、通過(guò)DNS的方式發(fā)現(xiàn)
在kube-system里有dns,可以自動(dòng)發(fā)現(xiàn)所有命名空間里的服務(wù)的clusterIP
所以,在同一個(gè)命名空間里,一個(gè)服務(wù)訪問(wèn)另外一個(gè)服務(wù)的時(shí)候,可以直接通過(guò)服務(wù)名來(lái)訪問(wèn)
只要?jiǎng)?chuàng)建了一個(gè)服務(wù)(不管在哪個(gè)ns里創(chuàng)建的),都會(huì)自動(dòng)向kube-system里的DNS注冊(cè)
如果是不同的命名空間,可以通過(guò) 服務(wù)名.命名空間名 來(lái)訪問(wèn)
Service是一種抽象的對(duì)象,它定義了一組Pod的邏輯集合和一個(gè)用于訪問(wèn)它們的策略。
service主要實(shí)現(xiàn)集群內(nèi)部通信,以及基于四層的內(nèi)外通信(如端口)。
service用于為pod提供一個(gè)固定,統(tǒng)一的訪問(wèn)接口及負(fù)載均衡的能力,并借助新一代DNS的服務(wù)發(fā)現(xiàn)功能,解決客戶端發(fā)現(xiàn)并訪問(wèn)容器化應(yīng)用的難題。
service的地址是不會(huì)發(fā)生改變的,它通過(guò)標(biāo)簽選擇器和后端的pod關(guān)聯(lián)。
k8s集群中的3種ip:
1、Node IP:Node節(jié)點(diǎn)的IP地址
2、Pod IP: Pod的IP地址
3、Cluster IP: Service的IP地址,不能ping通
k8s集群中的service類(lèi)型
$ kubectl explain svc.spec.type
Defaults to ClusterIP. Valid options are ExternalName, ClusterIP, NodePort, and LoadBalancer.
不使用type字段的話,默認(rèn)就是ClusterIP類(lèi)型
1、ClusterIP:通過(guò)集群的內(nèi)部 IP 暴露服務(wù),選擇該值,服務(wù)只能夠在集群內(nèi)部可以訪問(wèn),這也是默認(rèn)的ServiceType。
k8s集群內(nèi)部流量走向:
內(nèi)部客戶端--service(ClussterIp:Port)--endpoint(ip和port列表)--應(yīng)用pod(port)
2、NodePort:通過(guò)每個(gè) Node 節(jié)點(diǎn)上的 IP 和靜態(tài)端口(NodePort)暴露服務(wù)。NodePort 服務(wù)會(huì)路由到 ClusterIP 服務(wù),這個(gè) ClusterIP 服務(wù)會(huì)自動(dòng)創(chuàng)建。通過(guò)請(qǐng)求 :,可以從集群的外部訪問(wèn)一個(gè) NodePort 服務(wù)。
NodePort類(lèi)型的service數(shù)據(jù)流向:
外部用戶--外部LB--nodePort(集群入口)--service--endpoint--應(yīng)用pod
3、LoadBalancer類(lèi)型的service應(yīng)用在公有云環(huán)境中
4、ExternalName類(lèi)型的service用于實(shí)現(xiàn)集群內(nèi)部pod訪問(wèn)集群外部的服務(wù)
數(shù)據(jù)流向:內(nèi)部pod--service--外部服務(wù)
該類(lèi)型的service沒(méi)有serviceIP,沒(méi)有nodeport,沒(méi)有標(biāo)簽選擇器,需要CNAME解析記錄
完成內(nèi)部流量轉(zhuǎn)發(fā)工作的是各工作節(jié)點(diǎn)的kube-proxy
proxy工作模式有3種:
1、userspace代理模式
2、iptables代理模式
3、ipvs代理模式
ipvs模式和iptables模式的區(qū)別僅僅是:請(qǐng)求流量的調(diào)度功能由ipvs完成,其他功能仍由iptables完成
創(chuàng)建service的兩種方式:
1、使用kubectl expose命令
2、定義資源清單文件
$ kubectl explain svc.metadata
FIELDS:
labels
name #svc的名字
namespace
$ kubectl explain svc.spec
FIELDS:
clusterIP #svc的ip地址
ports
selector
type
$ kubectl explain svc.spec.clusterIP
clusterIP is the IP address of the service and is usually assigned randomly by the master.
Valid values are "None", empty string (""), or a valid IP address.
"None" can be specified for headless services when proxying is not required.
Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if type is ExternalName.
clusterIP表示svc的ip地址,一般自動(dòng)獲取,不用手動(dòng)指定。如果不使用該字段或者指定其值為空,都表示自動(dòng)獲取ip地址。
如果指定其值為None,表示該svc是無(wú)頭服務(wù)。
當(dāng)svc的type是ExternalName時(shí),不能使用該字段。
$ kubectl explain svc.spec.ports
FIELDS:
1、port:
指該service暴露的端口,用yaml文件創(chuàng)建svc時(shí)是必選項(xiàng),用命令創(chuàng)建時(shí)可以不指定,如果不指定,會(huì)繼承pod中的containerPort。
2、nodePort:
指node節(jié)點(diǎn)端口(只有當(dāng)type為NodePort或LoadBalancer時(shí)才需要該參數(shù),一般自動(dòng)生成),用于對(duì)外通信。
3、targetPort:
指后端pod暴露的端口,就是pod中的containerPort。
如果既不指定port又不指定targetPort,那么port和targetPort都會(huì)繼承pod中的containerPort。
如果指定了port而沒(méi)有指定targetPort,那么targetPort會(huì)繼承port值,所以此時(shí)必須指定targetPort值為pod中的containerPort,不能隨便指定端口號(hào),除非port值和pod中的containerPort相同(這種情況可以不指定targetPort)。
當(dāng)type為ClusterIP時(shí),流量經(jīng)過(guò)的端口走向是:
svc端口(port)----pod端口(targetPort)----容器端口(containerPort)
當(dāng)type為NodePort時(shí),流量經(jīng)過(guò)的端口走向是:
節(jié)點(diǎn)端口(NodePort)----svc端口(port)----pod端口(targetPort)----容器端口(containerPort)
使用命令創(chuàng)建svc(containerPort是8080)
$ kubectl get deploy
$ kubectl expose deploy deploy_name1
$ kubectl get svc
$ kubectl delete svc svc_name
$ kubectl expose deploy deploy_name2 --port=8080
$ kubectl expose deploy deploy_name3--port=80 --target-port=8080
$ kubectl expose deploy deploy_name4 --port=80 --target-port=8080 --type=NodePort
$ kubectl get svc svc_name -o yaml
spec:
clusterIP: 10.97.153.130
externalTrafficPolicy: Cluster
ports:
- nodePort: 30693
port: 80
protocol: TCP
targetPort: 8080
$ curl http://10.97.153.130
$ curl http://192.168.1.243:30693 #243是master地址
$ kubectl delete svc svc_name
用yaml文件創(chuàng)建svc
apiVersion: v1
kind: Service
metadata:
labels:
ame: mysvc
name: mysvc
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: mysvc #匹配標(biāo)簽為app: mysvc的后端pod
type: NodePort
Headless無(wú)頭類(lèi)型的service:
該service沒(méi)有IP,客戶端不經(jīng)過(guò)service,而是直接訪問(wèn)后端的pod
無(wú)頭服務(wù)的type不能是NodePort。
kind: Service
spec:
clusterIP: None #(該參數(shù)設(shè)置為None即可成為無(wú)頭service)
查看某個(gè)服務(wù)下有哪些pod:
$ kubectl get svc
$ kubectl get svc svc_name -o yaml
$ kubectl describe svc svc_name
Selector: run=nginx1
$ kubectl get pod -l run=nginx1
驗(yàn)證通過(guò)DNS發(fā)現(xiàn)服務(wù)
$ kubectl get pod -n kube-system |grep dns
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP
$ yum install bind-utils -y
$ dig -t A svc_name.default.svc.cluster.local. @10.96.0.10
$ kubectl get svc svc_name -o yaml
在pod中驗(yàn)證dns服務(wù)發(fā)現(xiàn)
$ kubectl run busybox --rm -it --image=busybox sh
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local example.com
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁(yè)名稱(chēng):k8s集群中的service-創(chuàng)新互聯(lián)
標(biāo)題URL:http://www.rwnh.cn/article32/dsohpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、服務(wù)器托管、網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、App開(kāi)發(fā)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容