Kubernetes服务发布基础
service的概念和原理
- service概念及用途
- service用于将外部请求代理到内部Pod上,提供四层负载均衡和服务发现的功能,使得我们可以构建高可用和可扩展的应用程序
- service基本原理
- service的负载均衡机制
- 当一个Service对象在Kubernetes集群中背定义出来时,集群内的客户端应用就可以通过服务IP访问到具体的Pod容器提供的服务,从服务IP到后端Pod的负载均衡机制,是有每个node上的kube-proxy代理负责实现的
- kube-proxy的代理模式有:userspace、iptables、IPVS和kernelspace
- kube-proxy的代理模式之userspace
-
- kube-proxy为每个Service在node上打开一个随机端口做为代理端口
- 建立iptables规则,将clusterip请求重定向到代理端口(用户空间)
- 到达代理端口的请求再由kube-proxy转发到后端
- kube-proxy的代理模式之iptables
-
- 通过API Server的Watch接口实时跟踪Service和Endpoint的变更信息
- 并更新对应的iptables规则
- Client的请求流量通过iptables的NAT机制“直接路由”到目标Pod
- kube-proxy不再负责转发数据包,kube-proxy主要完成对iptables策略的动态管理
- kube-proxy的代理模式之IPVS
-
- IPVS专门用于高性能的负载均衡
- IPVS使用ipset存储iptables规则,可以将ipset简单理解为IP集合
- 减少iptables规则的数量,从而减少性能损耗
service的类型
- Service的四种类型
- ClusterIP(默认创建出来的Service,虚拟VIP只供内部使用,给k8s内其他程序使用的)(使用场景:内部程序之间访问)
- 这是最常用的Service类型,它为Pod提供了一个虚拟的IP地址,当其他的Pod需要访问钙Service时,他们只需要使用该虚拟IP地址即可。Kubernetes会自动将请求路由到相应的Pod上
- NodePort
- 这种Service类型将Pod公开为集群中所有节点上的某个端口。当外部的请求到达任何一个节点上的该端口时,Kubernetes会将请求路由到相应的Pod上。
- LoadBalancer
- LoadBalancer Service:这种Service类型使用云提供商的负载均衡器将请求路由到后端Pod。Kubernetes会自动创建和配置负载均衡器,并将其绑定到Service上。
- externalName(外部空间)
- externalName:这种Service类型允许你将Service映射到集群外部的名称。当Pod需要访问该Service时,他们将使用该名称来解析出相应的IP地址。
- ClusterIP(默认创建出来的Service,虚拟VIP只供内部使用,给k8s内其他程序使用的)(使用场景:内部程序之间访问)
service的创建
ClusterIP的创建(默认创建出来的Service就是ClusterIP)
-
- 创建一个Pod服务
-
- 查看Pod状态
-
- 查看创建Pod详细信息
-
- 访问提供的IP地址与yaml文件中提供的端口
- 【使用命令的方式创建Service】为创建的复制集的Pod服务创建出来一个Service(默认的Service就是ClusterIP)
-
- 【使用yaml文件的方式创建Service】
-
-
- 查看创建的Service
-
-
-
- 查看Service详细信息
-
-
-
- 查看Service为Pod提供的IP+端口
-
-
- 查看创建的Service
-
- 此时若使用宿主机的浏览器访问创建出来的ClusterIP是无法访问到的,因为创建出来的ClusterIP是仅供k8s内部程序之间访问时才可以使用的,属于一个内部网络,外部网络是无法与其通信的
- 删除Service
- NodePort的创建
- 创建类型为NodePort的Pod服务
-
- 查看创建的详细信息
-
- 在程序内部进行访问测试
-
- 在浏览器访问测试
-
- 删除Service
- LoadBalancer的创建
- 创建LoadBalancer
-
- 查看Service信息
-
- 分别进行内部测试和浏览器访问
- 删除LoadBalancer
- externalName的创建
- 先创建两个命名空间
-
- 分别针对两个命名空间创建后端节点(Pod)
-
- 查看创建的后端节点Pod的信息(要指定命名空间)
-
- 查看详细信息
-
- 可以登录到创建的后端Pod当中
-
- 分别为两个命名空间创建不同的无头服务(headless)
-
- 查看两个命名空间下的服务
-
- 登录到Pod当中,使用ping命令测试Pod与其他服务的连通性
-
- 创建externalname
-
- 无头服务创建出来之后,对于其他外部的 pod 来讲,该 pod 对应的名字就确定了下来,其固定的格式是:无头服务名,命名空间,svc.cluster.local
- 登录到Pod服务中,验证Pod间的通信