共計 2658 個字符,預計需要花費 7 分鐘才能閱讀完成。
這篇文章給大家介紹如何體驗 Service 所提供的功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創建
創建 Service 對象時,Kubernetes 會根據 spec.selector 來查找擁有指定標簽的 Pod,查找到 Pod 就維護一組拓撲關系,如果查找不到也不會自動創建 Pod(配置中沒有 Pod 模版),所以本例中用到的 Pod 對象需要單獨創建,在開始之前,假定我們已使用前面介紹 Deployment 時使用的配置創建了一組 label 為 app: nginx 的 Pod 對象,這些 Pod 通過端口 80 對外提供服務。
首先,我們將以下配置保存到名為 service.yaml 的文件中:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
然后,創建 Service 對象:
[root@ecs-d8b6 manifests]# kubectl create -f service.yaml
service/nginx-service created
查看
接著查看剛剛創建的 Service 對象:
[root@ecs-d8b6 manifests]# kubectl get services nginx-service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx-service ClusterIP 10.0.0.83 none 80/TCP 56s app=nginx
命令行輸出中各字段含義如下:
NAME:Service 對象名稱,對應配置中的 metadata.name;
TYPE:Service 類型,默認為 ClusterIP 類型,更多的類型將在后面的章節中介紹;
CLUSTER-IP:自動分配的 Cluster IP;
EXTERNAL-IP:外部 IP 地址,用于接收集群外部流量的地址,在后面介紹 Service 類型時詳細介紹;
PORT(S):Service 對外暴露的端口列表,本例中只對外暴露一個端口,對應配置中的 spec.ports;
AGE:創建至今經歷的時間;
SELECTOR:標簽選擇器,Service 根據此選擇器查看后端 Pod,對應配置中的 spec.selector。
當前 Kubernetes 支持多種 Service 類型,來應對不同的使用場景:
ClusterIP:Service 通過一個只能在集群內部訪問的 Cluster IP 來暴露服務;
NodePort:Service 通過 Node 上的某個端口來暴露服務;
LoadBalancer:Service 通過具體云廠商提供的負載均衡器來暴露服務;
ExternalName:Service 僅對外暴露一個域名;
查看 Pod 拓撲
盡管 Service 會通過 selector 來查找 Pod,但查找到的 Pod 信息并不直接記錄到 Service 對象中,而是記錄到一個 Endpoints 對象中,進一步說當創建 Service 對象時,Kubernetes 還會創建一個同名的 Endpoints 對象,來記錄后端的 Pod 拓撲。關于 Endpoints,我們會在后續的章節中詳細介紹,此處僅做初步介紹。
查看隨 Service 一并創建的 Endpoints 對象:
[root@ecs-d8b6 manifests]# kubectl get endpoints nginx-service
NAME ENDPOINTS AGE
nginx-service 172.17.0.4:80,172.17.0.5:80,172.17.0.6:80 20m
可以看到,該 Endpoints 對象記錄了 Service 匹配到的所有 Pod 地址。
訪問 Service
在集群內部,可以直接訪問 Service 的 Cluster IP,流量將會被自動轉發到后端的某個 Pod 中:
[root@ecs-d8b6 manifests]# curl 10.0.0.83
!DOCTYPE html
html
head
/head
body
h2 Welcome to nginx! /h2
/body
/html
更新
當更新 Service 的 spec.selector 時,Kubernetes 會自動按照新的 spec.selector 配置查找 Pod,并更新 Endpoints 對象。
使用 kubectl edit service nginx-service 命令來修改 Service,并指定一個無法匹配到任何 Pod 的 spec.selector,可以看到 Endpoints 對象中的 Pod 拓撲信息也會相應地消失掉,如下所示:
[root@ecs-d8b6 manifests]# kubectl get endpoints nginx-service
NAME ENDPOINTS AGE
nginx-service none 31m
刪除
當刪除 Service 對象時,隨 Service 對象創建而自動創建的 Endpoints 對象也會一并刪除,后端的 Pod 不會被刪除,它仍然受相應的 Pod 控制器管理。
[root@ecs-d8b6 manifests]# kubectl delete service nginx-service
service nginx-service deleted
[root@ecs-d8b6 manifests]# kubectl get endpoints nginx-service
Error from server (NotFound): endpoints nginx-service not found
[root@ecs-d8b6 manifests]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-5f67bd6bb-9nspj 1/1 Running 0 37m
nginx-deployment-5f67bd6bb-hl8xw 1/1 Running 0 37m
nginx-deployment-5f67bd6bb-pkv7h 1/1 Running 0 37m
關于如何體驗 Service 所提供的功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。