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