k8s?Service?實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡
前言
本文將介紹 Kubernetes 的資源對(duì)象 Service,內(nèi)容包括 Service 介紹、Service 的四種類型及使用方式、不指定 Selectors 的服務(wù)、Headless 服務(wù)、Service 工作原理及原理圖。同時(shí)也會(huì)講解 Ingress 和集群外部如何訪問(wèn)服務(wù)。
在容器編排系統(tǒng)中,如 Kubernetes,Pod 是最小的部署單元。而一組 Pod 通常對(duì)外提供某種服務(wù)。在 Kubernetes 中,Service 就是用來(lái)對(duì)外暴露一組 Pod 的服務(wù)的資源對(duì)象。Service 可以通過(guò) IP 地址和端口號(hào)訪問(wèn),從而對(duì)外提供服務(wù)。
Service 介紹
Service 是 Kubernetes 中一個(gè)非常重要的概念,它可以將一組 Pod 封裝成一個(gè)邏輯服務(wù)單元。
Service 可以通過(guò)定義的 Label Selector,將一組 Pod 綁定到一起,形成一個(gè) Service。通過(guò) Service,用戶可以方便地訪問(wèn)這個(gè)服務(wù),不需要關(guān)心 Pod 的具體 IP 地址和端口號(hào),也不需要擔(dān)心 Pod 的數(shù)量變化會(huì)影響服務(wù)的訪問(wèn)。
Service 的四種類型及使用方式
Kubernetes 中的 Service 一共有四種類型,分別是 ClusterIP、NodePort、LoadBalancer 和 ExternalName。
- ClusterIP:是 Service 的默認(rèn)類型,它會(huì)為 Service 創(chuàng)建一個(gè) Cluster IP,這個(gè) IP 只能在集群內(nèi)部訪問(wèn)。通過(guò) ClusterIP,用戶可以訪問(wèn)該 Service 關(guān)聯(lián)的 Pod。
- NodePort:在每個(gè)節(jié)點(diǎn)上綁定一個(gè)端口,從而將 Service 暴露到集群外部。用戶可以通過(guò)任意一個(gè)節(jié)點(diǎn)的 IP 地址和該端口號(hào)來(lái)訪問(wèn) Service。
- LoadBalancer:在云廠商提供的負(fù)載均衡器上創(chuàng)建一個(gè) VIP,從而將 Service 暴露到集群外部。用戶可以通過(guò)該 VIP 地址來(lái)訪問(wèn) Service。
- ExternalName:可以將 Service 映射到集群外部的一個(gè) DNS 名稱上,從而將 Service 暴露到集群外部。
另外,也可以將已有的服務(wù)以 Service 的形式加入到 Kubernetes 集群中來(lái),只需要在創(chuàng)建 Service 的時(shí)候不指定 Label selector,而是在 Service 創(chuàng)建好后手動(dòng)為其添加 endpoint。
Service 的定義和使用
Service 也是可以通過(guò) yaml 來(lái)定義的。
以下是帶有 selector 和 type 的 YAML 文件定義一個(gè)名為 nginx 的 Service,將服務(wù)的 80 端口轉(zhuǎn)發(fā)到 default namespace 中帶有標(biāo)簽 run=nginx 的 Pod 的 80 端口:
apiVersion: v1 kind: Service metadata: name: nginx spec: selector: run: nginx type: ClusterIP ports: - protocol: TCP port: 80 targetPort: 80
其中,type 為 Service 的類型,可以取值為 ClusterIP、NodePort、LoadBalancer 和 ExternalName。
本例中的 type 為 ClusterIP,表示該 Service 的類型為 ClusterIP。
以下是通過(guò)命令創(chuàng)建及查看創(chuàng)建的服務(wù)情況的操作步驟和預(yù)期的展示內(nèi)容。
通過(guò)命令創(chuàng)建服務(wù)
使用 kubectl create
命令創(chuàng)建一個(gè)名為 nginx
的服務(wù),并將服務(wù)的 80 端口轉(zhuǎn)發(fā)到 default namespace 中帶有標(biāo)簽 run=nginx
的 Pod 的 80 端口。運(yùn)行以下命令:
kubectl create service clusterip nginx --tcp=80:80 --dry-run=client -o yaml > nginx-service.yaml
這個(gè)命令將在當(dāng)前目錄下生成一個(gè)名為 nginx-service.yaml
的 YAML 文件,其中包含了創(chuàng)建 Service 所需的配置信息。
預(yù)期展示內(nèi)容:
service/nginx created (dry run)
使用 kubectl apply
命令創(chuàng)建 Service。運(yùn)行以下命令:
kubectl apply -f nginx-service.yaml
這個(gè)命令將根據(jù) YAML 文件中的配置信息創(chuàng)建一個(gè)名為 nginx
的 Service。
預(yù)期展示內(nèi)容:
service/nginx created
查看創(chuàng)建的服務(wù)情況
使用 kubectl get
命令查看已經(jīng)創(chuàng)建的 Service。運(yùn)行以下命令:
kubectl get services
這個(gè)命令將顯示所有已經(jīng)創(chuàng)建的 Service,包括它們的名稱、類型、Cluster IP、端口等信息。
預(yù)期展示內(nèi)容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h19m nginx ClusterIP 10.96.58.173 <none> 80/TCP 1m
使用 kubectl describe
命令查看指定 Service 的詳細(xì)信息。運(yùn)行以下命令:
kubectl describe service nginx
這個(gè)命令將顯示名為 nginx
的 Service 的詳細(xì)信息,包括它的類型、Cluster IP、端口、Selector 等信息。
預(yù)期展示內(nèi)容:
Name: nginx Namespace: default Labels: run=nginx Annotations: <none> Selector: run=nginx Type: ClusterIP IP: 10.96.58.173 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.0.7:80 Session Affinity: None Events: <none>
不指定 Selectors 的服務(wù)
當(dāng)用戶創(chuàng)建 Service 的時(shí)候,可以不指定 Label Selector,這種 Service 被稱為無(wú)選擇器服務(wù)(no selector service)。無(wú)選擇器服務(wù)不能和 Pod 綁定,而只是提供一個(gè)固定的 IP 和端口,用于訪問(wèn)后端服務(wù)。這種服務(wù)通常用于代理到外部的服務(wù),如數(shù)據(jù)庫(kù)、消息隊(duì)列等。
Headless 服務(wù)
Kubernetes 中的 Service 還有一個(gè)特殊的類型,叫做 Headless 服務(wù)。Headless 服務(wù)的 ClusterIP 為 None,它不會(huì)為 Service 創(chuàng)建 Cluster IP。通過(guò) Headless 服務(wù),用戶可以直接訪問(wèn)該 Service 關(guān)聯(lián)的 Pod,而不需要通過(guò) Service 進(jìn)行訪問(wèn)。
Service 工作原理及原理圖
Service 的工作原理是通過(guò)代理模式實(shí)現(xiàn)的,即 kube-proxy 負(fù)責(zé)將 service 負(fù)載均衡到后端 Pod 中。
當(dāng)用戶通過(guò) Service 的 IP 和端口訪問(wèn) Service 時(shí),請(qǐng)求會(huì)先到達(dá) Service 代理,然后由代理將請(qǐng)求轉(zhuǎn)發(fā)給后端的 Pod。
當(dāng) Pod 發(fā)生變化時(shí),Service 會(huì)自動(dòng)更新 Endpoint,從而保證請(qǐng)求能夠正確地到達(dá)后端 Pod。
以下是 Service 工作原理的原理圖:
Ingress 講解
Ingress 是 Kubernetes 中另一個(gè)重要的資源對(duì)象,它用于將集群外部的 HTTP(S) 流量路由到集群內(nèi)部的 Service。通過(guò) Ingress,用戶可以在集群外部定義一個(gè)域名,然后將該域名路由到 Service 中。Ingress 可以實(shí)現(xiàn)灰度發(fā)布、負(fù)載均衡、SSL 終止等功能。
集群外部如何訪問(wèn)服務(wù)
當(dāng)用戶需要從集群外部訪問(wèn) Kubernetes 中的 Service 時(shí),可以通過(guò) NodePort、LoadBalancer 或 Ingress 來(lái)實(shí)現(xiàn)。具體方式如下:
- NodePort
用戶可以通過(guò)任意一個(gè)節(jié)點(diǎn)的 IP 地址和該節(jié)點(diǎn)上綁定的端口號(hào)來(lái)訪問(wèn) Service。例如,如果 NodePort 的端口為 30080,節(jié)點(diǎn) IP 地址為 192.168.0.10,則用戶可以通過(guò) http://192.168.0.10:30080 訪問(wèn)該 Service。
- LoadBalancer
當(dāng) Service 的類型為 LoadBalancer 時(shí),云廠商會(huì)在其提供的負(fù)載均衡器上為 Service 創(chuàng)建一個(gè) VIP,用戶可以通過(guò)該 VIP 地址來(lái)訪問(wèn) Service。
- Ingress
通過(guò) Ingress,用戶可以在集群外部定義一個(gè)域名,并將該域名路由到 Service 中。用戶可以通過(guò)該域名來(lái)訪問(wèn) Service。
總結(jié)
以上是關(guān)于 Kubernetes 中的 Service 的介紹,包括 Service 介紹和定義、Service 的四種類型 Service 工作原理、Ingress 講解以及集群外部如何訪問(wèn)服務(wù)。
在使用 Service 時(shí),用戶不需要關(guān)心 Pod 的具體 IP 地址和端口號(hào),也不需要擔(dān)心 Pod 的數(shù)量變化會(huì)影響服務(wù)的訪問(wèn)。
通過(guò) Ingress,用戶可以在集群外部定義一個(gè)域名,然后將該域名路由到 Service 中,從而實(shí)現(xiàn)灰度發(fā)布、負(fù)載均衡、SSL 終止等功能。
以上就是k8s Service 實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡的詳細(xì)內(nèi)容,更多關(guān)于k8s Service服務(wù)發(fā)現(xiàn)負(fù)載均衡的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Kubernetes?權(quán)限管理認(rèn)證鑒權(quán)詳解
這篇文章主要為大家介紹了Kubernetes?權(quán)限管理認(rèn)證鑒權(quán)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Rainbond使用Dockerfile構(gòu)建便捷應(yīng)用運(yùn)行流程
這篇文章主要為大家介紹了Rainbond使用Dockerfile構(gòu)建便捷應(yīng)用運(yùn)行流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04在AWS-EC2中安裝Minikube集群的詳細(xì)過(guò)程
這篇文章主要介紹了在AWS-EC2中安裝Minikube集群,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06詳解kubelet?創(chuàng)建pod流程代碼圖解及日志說(shuō)明
這篇文章主要為大家介紹了詳解kubelet?創(chuàng)建pod流程代碼圖解及日志說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09k8s編排之StatefulSet知識(shí)點(diǎn)詳解一
這篇文章主要為大家介紹了k8s編排之StatefulSet知識(shí)點(diǎn)的部分詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Kubernetes控制器中DaemonSet與Job的使用教程
這篇文章主要介紹了Kubernetes控制器中DaemonSet與Job的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解
這篇文章主要為大家介紹了Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09