service (5)

service:
service是一类pod的抽象,在一个k8s集群中,不同的pod会提供不同的服务,例如,一些典型的应用中通常会包括前端服务和后台服务。这个时候,我们会把前端服务和后台服务定义为两个服务。通常,每一类服务都包含若干个相同的pod(除了服务更新的时候)。一类pod会统一的对外提供一类服务。

服务间的通信
pod的ip地址通常是会因为pod的销毁和生成不断变化的,如果前段pods和后端pods是直接使用各自pod的ip地址来进行通信的,那么这个显然是行不通的。服务的这一抽象概念的使用,让互相访问的前端pods和后端pods进行了松耦合。Kubernete原生的应用,都提供了一个Endpoint API,它的作用是当一个服务中的pod发生变化时,Endpoints API随之变化,持续的跟踪pod的变化,那么访问服务的请求就不需要知道具体的pod的ip地址。而只需要和Endpoint API交互就好了。那些非原生的程序,Kubernetes提供了一个基于虚拟IP的网桥服务,请求会通过网桥转发到对应的后台pod。

服务的端口问题

一类运行着相同服务的pod,其暴露的端口通常也是一样的。在服务的层面上,这一些端口一般都会起一个名字,其他的服务只需要知道当前服务的服务端口名就可以和当前服务通信,不用关心具体的pod暴露的端口号是多少。这样也带来了管理上的便捷,如果我们后期修改pod中暴露的端口号,这样是不会影响其他服务和当前服务的通信。

一个定义服务的配置

kind: Service
apiVersion: v1
metadata:
 name: my-service
spec:
 selector:
   app: MyApp
 ports:
   - protocol: TCP
     port: 80
     targetPort: 9376

以上脚本定义了一个服务,该服务的服务名是my-service,选择器是my-select,将80端口映射给9376端口。

Type 的取值有以下几种,每一种取值就代表着一种服务类型

  1. ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。
  2. NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 :,可以从集群的外部访问一个 NodePort 服务。
  3. LoadBalancer:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
  4. ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建,这只有 Kubernetes 1.7 或更高版本的 kube-dns 才支持。

NodePort 类型


如果设置 type 的值为 “NodePort”,Kubernetes master 将从给定的配置范围内(默认:30000-32767)分配端口,每个 Node 将从该端口(每个 Node 上的同一端口)代理到 Service。该端口将通过 Service 的 spec.ports[*].nodePort 字段被指定。
如果需要指定的端口号,可以配置 nodePort 的值,系统将分配这个端口,否则调用 API 将会失败(比如,需要关心端口冲突的可能性)。
这可以让开发人员自由地安装他们自己的负载均衡器,并配置 Kubernetes 不能完全支持的环境参数,或者直接暴露一个或多个 Node 的 IP 地址。
需要注意的是,Service 将能够通过 <NodeIP>:spec.ports[*].nodePortspec.clusterIp:spec.ports[*].port 而对外可见。


LoadBalancer 类型


使用支持外部负载均衡器的云提供商的服务,设置 type 的值为 “LoadBalancer”,将为 Service 提供负载均衡器。 负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过 Service 的 status.loadBalancer 字段被发布出去。
这里写图片描述
来自外部负载均衡器的流量将直接打到 backend Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。 在这些情况下,将根据用户设置的 loadBalancerIP 来创建负载均衡器。 某些云提供商允许设置 loadBalancerIP。如果没有设置 loadBalancerIP,将会给负载均衡器指派一个临时 IP。 如果设置了 loadBalancerIP,但云提供商并不支持这种特性,那么设置的 loadBalancerIP 值将会被忽略掉。


外部 IP


如果外部的 IP 路由到集群中一个或多个 Node 上,Kubernetes Service 会被暴露给这些 externalIPs。 通过外部 IP(作为目的 IP 地址)进入到集群,打到 Service 的端口上的流量,将会被路由到 Service 的 Endpoint 上。 externalIPs 不会被 Kubernetes 管理,它属于集群管理员的职责范畴。
根据 Service 的规定,externalIPs 可以同任意的 ServiceType 来一起指定。 在上面的例子中,my-service 可以在 80.11.12.10:80(外部 IP:端口)上被客户端访问。
这里写图片描述


参考:
https://mp.weixin.qq.com/s?__biz=MzI5NTM5NjcwMA==&tempkey=OTU3X3ZjUXJaM1d2QzdpdEpHT3FBdnlXRGJ3LVJyejNvUmRkY2Zlc1ZXdm5Ndlo1TVkzQ0JQczV0WWl2amZDZFFma2YyQUgxOGJicTdTT3NocV9lVXpjTkVLcTJsazZqaGxPdzYyd2FzY0s4WE93Q2ZXRldKV21UUlMwVkxwQkMyZGE3UTNwRmozb21qb3ZzZHY4d25sd0pxZ19kbnhxa2NIc1M3ZWZ0aHd%2Bfg%3D%3D&chksm=6c5575495b22fc5f6cf180609fde9fae78e09fe80dec0a99ddd3b2470958bf0866b5d1be300c#rd

猜你喜欢

转载自blog.csdn.net/u012999810/article/details/80406090
今日推荐