前言
在容器編排系統(tǒng)中,如 Kubernetes,Pod 是最小的部署單元。而一組 Pod 通常對外提供某種服務(wù)。在 Kubernetes 中,Service 就是用來對外暴露一組 Pod 的服務(wù)的資源對象。Service 可以通過 IP 地址和端口號訪問,從而對外提供服務(wù)。
Service 介紹
Service 是 Kubernetes 中一個非常重要的概念,它可以將一組 Pod 封裝成一個邏輯服務(wù)單元。
Service 可以通過定義的 Label Selector,將一組 Pod 綁定到一起,形成一個 Service。通過 Service,用戶可以方便地訪問這個服務(wù),不需要關(guān)心 Pod 的具體 IP 地址和端口號,也不需要擔心 Pod 的數(shù)量變化會影響服務(wù)的訪問。
Service 的四種類型及使用方式
Kubernetes 中的 Service 一共有四種類型,分別是 ClusterIP、NodePort、LoadBalancer 和 ExternalName。
- ClusterIP:是 Service 的默認類型,它會為 Service 創(chuàng)建一個 Cluster IP,這個 IP 只能在集群內(nèi)部訪問。通過 ClusterIP,用戶可以訪問該 Service 關(guān)聯(lián)的 Pod。
- NodePort:在每個節(jié)點上綁定一個端口,從而將 Service 暴露到集群外部。用戶可以通過任意一個節(jié)點的 IP 地址和該端口號來訪問 Service。
- LoadBalancer:在云廠商提供的負載均衡器上創(chuàng)建一個 VIP,從而將 Service 暴露到集群外部。用戶可以通過該 VIP 地址來訪問 Service。
- ExternalName:可以將 Service 映射到集群外部的一個 DNS 名稱上,從而將 Service 暴露到集群外部。
另外,也可以將已有的服務(wù)以 Service 的形式加入到 Kubernetes 集群中來,只需要在創(chuàng)建 Service 的時候不指定 Label selector,而是在 Service 創(chuàng)建好后手動為其添加 endpoint。
Service 的定義和使用
Service 也是可以通過 yaml 來定義的。
以下是帶有 selector 和 type 的 YAML 文件定義一個名為 nginx 的 Service,將服務(wù)的 80 端口轉(zhuǎn)發(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)建的服務(wù)情況的操作步驟和預(yù)期的展示內(nèi)容。
通過命令創(chuàng)建服務(wù)
- 使用
kubectl create
命令創(chuàng)建一個名為nginx
的服務(wù),并將服務(wù)的 80 端口轉(zhuǎn)發(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 所需的配置信息。
預(yù)期展示內(nèi)容:
service/nginx created (dry run)
- 使用 kubectl apply 命令創(chuàng)建 Service。運行以下命令:
kubectl apply -f nginx-service.yaml
這個命令將根據(jù) YAML 文件中的配置信息創(chuàng)建一個名為 nginx 的 Service。
預(yù)期展示內(nèi)容:
service/nginx created
查看創(chuàng)建的服務(wù)情況
- 使用 kubectl get 命令查看已經(jīng)創(chuàng)建的 Service。運行以下命令:
kubectl get services
這個命令將顯示所有已經(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 的詳細信息。運行以下命令:
kubectl describe service nginx
這個命令將顯示名為 nginx 的 Service 的詳細信息,包括它的類型、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ù)
當用戶創(chuàng)建 Service 的時候,可以不指定 Label Selector,這種 Service 被稱為無選擇器服務(wù)(no selector service)。無選擇器服務(wù)不能和 Pod 綁定,而只是提供一個固定的 IP 和端口,用于訪問后端服務(wù)。這種服務(wù)通常用于代理到外部的服務(wù),如數(shù)據(jù)庫、消息隊列等。
Headless 服務(wù)
Kubernetes 中的 Service 還有一個特殊的類型,叫做 Headless 服務(wù)。Headless 服務(wù)的 ClusterIP 為 None,它不會為 Service 創(chuàng)建 Cluster IP。通過 Headless 服務(wù),用戶可以直接訪問該 Service 關(guān)聯(lián)的 Pod,而不需要通過 Service 進行訪問。
Service 工作原理及原理圖
Service 的工作原理是通過代理模式實現(xiàn)的,即 kube-proxy 負責將 service 負載均衡到后端 Pod 中。
當用戶通過 Service 的 IP 和端口訪問 Service 時,請求會先到達 Service 代理,然后由代理將請求轉(zhuǎn)發(fā)給后端的 Pod。
當 Pod 發(fā)生變化時,Service 會自動更新 Endpoint,從而保證請求能夠正確地到達后端 Pod。
以下是 Service 工作原理的原理圖:
Ingress 講解
Ingress 是 Kubernetes 中另一個重要的資源對象,它用于將集群外部的 HTTP(S) 流量路由到集群內(nèi)部的 Service。通過 Ingress,用戶可以在集群外部定義一個域名,然后將該域名路由到 Service 中。Ingress 可以實現(xiàn)灰度發(fā)布、負載均衡、SSL 終止等功能。
集群外部如何訪問服務(wù)
當用戶需要從集群外部訪問 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。
總結(jié)
以上是關(guān)于 Kubernetes 中的 Service 的介紹,包括 Service 介紹和定義、Service 的四種類型 Service 工作原理、Ingress 講解以及集群外部如何訪問服務(wù)。
在使用 Service 時,用戶不需要關(guān)心 Pod 的具體 IP 地址和端口號,也不需要擔心 Pod 的數(shù)量變化會影響服務(wù)的訪問。文章來源:http://www.zghlxwxcb.cn/news/detail-415437.html
通過 Ingress,用戶可以在集群外部定義一個域名,然后將該域名路由到 Service 中,從而實現(xiàn)灰度發(fā)布、負載均衡、SSL 終止等功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-415437.html
到了這里,關(guān)于【云原生】k8s Service 實現(xiàn)服務(wù)發(fā)現(xiàn)和負載均衡的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!