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