您好,登录后才能下订单哦!
这篇文章给大家介绍如何体验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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。