这篇文章主要为大家展示了“kubernetes中Service是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes中Service是什么”这篇文章吧。
一:Service概念
Kubernetes里的每个Service其实就是微服务架构中的一个微服务。 它产生的背景在于:一是Pod的IP地址不是固定的,需要一个代理来确保需要使用Pod的应用不需要知道pod的真实IP地址;另一个是RC创建多个Pod副本时,需要一个代理来为这些pod做负载均衡。
Service 主要由一个IP地址和一个label selector组成。
Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。Service与其后端Pod副本集群直接则是通过Label Selector来实现无缝对接的。而RC的作用实际上是保证Service的服务能力和服务质量始终处于预期的标准。
二:Service工作原理
Kubernetes集群的每个节点上都运行着一个kube-proxy,它是负责整个Service实现的主要组件。
对应每个Service(无论其Pod 是否在该节点上),kube-proxy都会在宿主机上监听一个端口与Service对应起来。它会在宿主机上建立iptables规则。 Service请求经过iptables重定向到它对应的随机端口,再经过kube-proxy的代理到某个后端pod. kube-proxy里会维护端口和Service的映射关系,以及Service代理的Pod清单。
kube-proxy还会实时监测Master节点上etcd中service和Endpoints对象的增加和删除信息,从而保证后端被代理pod的IP和端口变化可以及时更新到它维护的路由信息中。
三:Service发现机制
一旦一个Service被创建,该Service的信息都可以被注入到Pod中工他们使用。
环境变量方式: kubelet创建pod时会自动添加所有可用的service环境变量到该pod中,如果有需要,这些环境变量就被注入pod内的容器里。
DNS方式:DNS服务器使用kubernetes的WatchAPI,不间断地监测新Service的创建并为每个Service新建一个DNS记录。如果DNS在整个集群范围内都可用,那么所有的Pod都能够自动解析Service的域名。
四:Service外部访问
Node IP:Node节点的IP地址。每个节点的物理网卡的IP地址,这是一个真实存在的物理网络。Kubernetes集群之外的节点访问集群之内的某个节点或者TCP/IP服务的时候,必须通过Node IP进行通信。
Pod IP:每个Pod的IP地址,它是Docker Engine 根据docker0网桥的IP地址段进行分配的。通常是一个虚拟的二层网络。kubernetes要求位于不同Node上的Pod能够彼此直接通信,所有Kubernetes里一个pod里的容器访问另外一个Pod里的容器,就是通过pod ip所在的虚拟二层网络进行通信的,而真实的tcp/ip流量则是通过node ip所在的物理卡流出的。
Cluseter IP: 一个虚拟的IP 仅仅作用域Service这个对象,由kubernetes管理和分配IP地址。 它是无法ping通的。只能结合Service Port组成一个具体的通信端口,她属于kubernetes集群这样一个封闭的空间。集群之外的节点如果要访问这个通信端口,则需要做一些额外的工作。
采用NodePort解决外部对集群内服务的访问时最直接,最有效,最常用的方法。
NodePort的实现方式是在k8s集群里的每个Node上为需要外部访问的service开启一个对应的TCP监听端口,外部系统只要用任意一个Node的IP地址+具体的Node Port端口号即可访问此服务。
但NodePort还没有完全解决外部访问Service的所有问题,比如负载均衡问题,假如我们集群中有10个Node,则此时最好有一个负载均衡器,外部只需要访问此负载均衡器的IP地址,由负载均衡器转发流量到后面某个Node的NodePort上。
负载均衡器可以采用硬件或软件(HAProxy,Nginx)的方式来实现。但这样又带来了另外一个问题,对于每个Service都需要手动配置一个对应的负载转发实例。
以上是“kubernetes中Service是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!