欢迎访问网易云社区,了解更多网易技术产品运营经验。
一、问题
首先,我们思考这样一个问题:
访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态。那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知?
二、k8s service
什么是service
是发现后端pod服务;
是为一组具有相同功能的容器应用提供一个统一的入口地址;
是将请求进行负载分发到后端的各个容器应用上的控制器。
对service的访问来源
访问service的请求来源有两种:k8s集群内部的程序(Pod)和 k8s集群外部的程序。
service类型
采用微服务架构时,作为服务所有者,除了实现业务逻辑以外,还需要考虑如何把服务发布到k8s集群或者集群外部,使这些服务能够被k8s集群内的应用、其他k8s集群的应用以及外部应用使用。因此k8s提供了灵活的服务发布方式,用户可以通过ServiceType来指定如何来发布服务,类型有以下几种:
● ClusterIP:提供一个集群内部的虚拟IP以供Pod访问(service默认类型)。service 定义如下:
service 结构如下:
● NodePort:在每个Node上打开一个端口以供外部访问
Kubernetes将会在每个Node上打开一个端口并且每个Node的端口都是一样的,通过\:NodePort的方式Kubernetes集群外部的程序可以访问Service。service 定义如下:
● LoadBalancer:通过外部的负载均衡器来访问
service selector
service通过selector和pod建立关联。
k8s会根据service关联到pod的podIP信息组合成一个endpoint。
若service定义中没有selector字段,service被创建时,endpoint controller不会自动创建endpoint。
service负载分发策略
service 负载分发策略有两种:RoundRobin:轮询模式,即轮询将请求转发到后端的各个pod上(默认模式);
SessionAffinity:基于客户端IP地址进行会话保持的模式,第一次客户端访问后端某个pod,之后的请求都转发到这个pod上。
三、服务发现
k8s服务发现方式
虽然Service解决了Pod的服务发现问题,但不提前知道Service的IP,怎么发现service服务呢?
k8s提供了两种方式进行服务发现:
● 环境变量: 当创建一个Pod的时候