1.什么是service服務(wù)
Service
Kubernetes(K8s)中的Service是一種抽象,用于定義一組Pod的訪問方式和網(wǎng)絡(luò)規(guī)則。它提供了一個穩(wěn)定的網(wǎng)絡(luò)終結(jié)點,使得應(yīng)用程序能夠通過Service名稱來訪問后端的Pod實例。
Service為一組具有相同功能的Pod提供了一個統(tǒng)一的入口,隱藏了Pod背后的具體細(xì)節(jié)。通過Service,應(yīng)用程序可以使用DNS名稱或Cluster IP來訪問后端Pod,而不需要直接暴露Pod的IP地址。這樣,當(dāng)Pod的IP地址發(fā)生變化時,應(yīng)用程序仍然可以通過Service來訪問后端的Pod。
Service還支持負(fù)載均衡,可以將請求均勻地分發(fā)到后端的多個Pod實例,從而實現(xiàn)高可用和水平擴(kuò)展。它可以根據(jù)不同的負(fù)載均衡策略(如輪詢、IP哈希等)將請求路由到不同的Pod。
Kubernetes中有多種類型的Service,包括ClusterIP、NodePort和LoadBalancer。每種類型都提供了不同的訪問方式和網(wǎng)絡(luò)配置,以滿足不同的應(yīng)用需求。
總之,Kubernetes的Service是一種抽象層,用于定義和管理應(yīng)用程序的網(wǎng)絡(luò)訪問方式,并提供負(fù)載均衡和穩(wěn)定的網(wǎng)絡(luò)終結(jié)點。它是構(gòu)建在Pod之上的一種網(wǎng)絡(luò)抽象,為應(yīng)用程序提供了方便的訪問和可擴(kuò)展性。
Service分類
- ClusterIP 是默認(rèn)類型的Service,它將Service暴露在集群內(nèi)部的虛擬IP上。其他Pod或Service可以通過該虛擬IP和指定的端口與Service進(jìn)行通信。ClusterIP類型的Service僅在集群內(nèi)部可訪問,對外部網(wǎng)絡(luò)是不可見的。
- NodePort 對外訪問應(yīng)用使用,在ClusterIP基礎(chǔ)上為Service在每臺機(jī)器上綁定一個端口,就可以通過: ip+NodePort來訪問該服務(wù)
- LoadBalancer(付費方案) 使在NodePort的基礎(chǔ)上,借助公有云創(chuàng)建一個外部負(fù)載均衡器,并將請求轉(zhuǎn)發(fā)到NodePort
可以實現(xiàn)集群外部訪問服務(wù)的另外一種解決方案,不過并不是所有的k8s集群都會支持,大多是在公有云托管集群中會支持該類型 - ExternalName(很少使用)把集群外部的服務(wù)引入到集群內(nèi)部來,在集群內(nèi)部直接使用。沒有任何類型代理被創(chuàng)建,這只有 Kubernetes 1.7或更高版本的kube-dns才支持。
Service和pod的關(guān)系
service和pod之間是通過 selector.app進(jìn)行關(guān)聯(lián)的
yaml示例:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: svc
spec:
ports:
- port: 80 # service服務(wù)端口
protocol: TCP
targetPort: 80 # pod端口,常規(guī)和容器內(nèi)部端口一致
selector: # 標(biāo)簽選擇器,確定當(dāng)前service代理控制哪些pod
app: nginx-pod
status:
loadBalancer: {}
2.多種port端口區(qū)分
關(guān)于K8S中端口的概念區(qū)分
- port 是service端口,即k8s中服務(wù)之間的訪問端口 ,clusterIP:port 是提供給集群內(nèi)部客戶訪問service的入口
- nodePort 容器所在node節(jié)點的端口,通過nodeport類型的service暴露給集群節(jié)點,外部可以訪問的端口
- targetPort 是pod的端口 ,從port和nodePort來的流量經(jīng)過kube-proxy流入到后端pod的targetPort上,最后進(jìn)入容器。
- containerPort 是pod內(nèi)部容器的端口,targetPort映射到containerPort。
總結(jié):
- 4種端口作用不一樣,port和nodePort都是service的端口
- port暴露給集群內(nèi)客戶訪問服務(wù),nodePort暴露給集群外客戶訪問服務(wù)
- 這兩個端口到來的數(shù)據(jù)都需要經(jīng)過反向代理kube-proxy流入后端pod的targetPod,從而到達(dá)pod中的容器
yaml示例;
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 #容器端口,不指定則為默認(rèn)
---
apiVersion: apps/v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort # 有配置NodePort,外部可訪問k8s中的服務(wù) ,
ports:
- name: nginx
port: 80 # 服務(wù)service的訪問端口
protocol: TCP
targetPort: 80 # pod端口,映射到容器端口
nodePort: 30015 # NodePort,通過nodeport類型的service暴露給集群外部訪問
selector:
app: nginx
3.K8S服務(wù)Service的ClusterIP
在Kubernetes中使用ClusterIP類型的Service非常簡單。你可以按照以下步驟進(jìn)行操作:
創(chuàng)建和使用方式:
1.創(chuàng)建一個Service的定義文件(YAML格式),指定Service的名稱、選擇器、端口等信息。以下是一個示例
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
2.使用kubectl命令創(chuàng)建Service:
kubectl apply -f service-definition.yaml
3.等待Service創(chuàng)建成功。你可以使用以下命令來檢查Service的狀態(tài):
kubectl get service my-service
通過Service的ClusterIP來訪問相關(guān)的Pod。在集群內(nèi)部,你可以使用Service的ClusterIP作為訪問目標(biāo),而不需要直接暴露Pod的IP地址。
例如,在同一命名空間內(nèi)的Pod中,你可以使用Service的ClusterIP來訪問其他Pod,如下所示:
curl <cluster-ip>:<port>
請將<cluster-ip>和<port>替換為實際的Service的ClusterIP和端口。
注意:ClusterIP類型的Service默認(rèn)只在集群內(nèi)部可用,無法從集群外部訪問。如果你需要從集群外部訪問Service,可以考慮使用其他類型的Service,如NodePort或LoadBalancer。
4.K8S服務(wù)Service的NodePort和EndPoint
NodePort
特點:
NodePort是Kubernetes中一種類型的Service,它允許通過集群節(jié)點的特定端口將流量轉(zhuǎn)發(fā)到Service中的Pod。
1.NodePort是Service的一種類型,它公開了一個固定的端口(NodePort),并將流量轉(zhuǎn)發(fā)到Service中定義的端口(TargetPort)。
2.當(dāng)創(chuàng)建一個NodePort類型的Service時,Kubernetes會為每個節(jié)點分配一個隨機(jī)的端口號(30000-32767范圍),并將此端口映射到Service的TargetPort。
3.NodePort類型的Service可以從集群外部訪問。通過訪問集群的任何節(jié)點的IP地址和NodePort端口,可以將流量轉(zhuǎn)發(fā)到Service中的Pod。
創(chuàng)建和使用方式:
4.創(chuàng)建NodePort類型的Service的示例定義文件如下:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
nodePort: 30080
上述示例中的nodePort字段指定了NodePort的端口號為30080。
5.使用kubectl命令創(chuàng)建NodePort類型的Service:
kubectl apply -f service-definition.yaml
6.從集群外部訪問NodePort類型的Service時,可以使用任何節(jié)點的IP地址和指定的NodePort端口。例如:
curl <node-ip>:<node-port>
請注意,NodePort類型的Service通常用于測試或開發(fā)環(huán)境,并不適合在生產(chǎn)環(huán)境中直接使用。在生產(chǎn)環(huán)境中,建議使用LoadBalancer類型的Service或使用Ingress控制器來實現(xiàn)更靈活和可靠的流量管理。
Endpoint(ep)
概述:
1.是k8s中的一個資源對象,存儲在etcd(存儲數(shù)據(jù)庫)中,記錄service對應(yīng)的所有pod的訪問地址
2.里面有個Endpoints列表,就是當(dāng)前service可以負(fù)載到的pod服務(wù)入口
3.service和pod之間的通信是通過endpoint實現(xiàn)的
4.查看endpoint列表 kubectl get ep svc-nodeport-nginx1 -n dev -o wide
kubernetes提供了兩種負(fù)載均衡策略
-
Round Robin(輪詢):在輪詢負(fù)載均衡策略下,每個請求按照順序依次分發(fā)到后端的Pod。當(dāng)有多個后端Pod時,每個請求會按照輪詢的方式依次發(fā)送到不同的Pod上,確保每個Pod都能平均地處理請求。
-
Session Affinity(會話親和):在會話親和負(fù)載均衡策略下,Kubernetes會根據(jù)客戶端的源IP地址將一段時間內(nèi)的請求路由到同一個后端Pod上。這樣做的目的是為了保持與同一客戶端的會話連續(xù)性,確保客戶端在同一個Pod上處理的請求都屬于同一個會話。文章來源:http://www.zghlxwxcb.cn/news/detail-460009.html
這兩種負(fù)載均衡策略可以在Service的配置中進(jìn)行指定。對于Round Robin策略,可以將Service的.spec.sessionAffinity字段設(shè)置為None(默認(rèn)值),表示不啟用會話親和;對于Session Affinity策略,可以將.spec.sessionAffinity字段設(shè)置為ClientIP,表示根據(jù)客戶端的源IP地址進(jìn)行會話親和。文章來源地址http://www.zghlxwxcb.cn/news/detail-460009.html
到了這里,關(guān)于(七)K8S核心資源Service的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!