您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何體驗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僅對外暴露一個域名;
盡管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
的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所提供的功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。