如何体验Service所提供的功能

64次阅读
没有评论

共计 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 所提供的功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-17发表,共计2658字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)