K8S学习之基础十九:k8s的四层代理Service
K8S四层代理Service
-
四层负载均衡Service
在k8s中,访问pod可以通过ip+端口的方式,但是pod是由生命 周期的,pod在重启的时候ip地址往往会发生变化,访问pod就需要新的ip地址,这样就会很麻烦,每次pod地址改变就要修改访问ip。Service的引进解决了这种问题,通过定义Service资源对象,Service定义一个服务访问的入口,客户端可以通过这个入口访问对应的pod,就算pod重新生成,ip发生变化,Service依旧通过pod标签关联到这个pod,避免连接失败,这样看来,Service可以看做是一组Pod的逻辑组合。
从下图可以看出客户端通过Service访问pod的方式
pid的ip经常变化,service是pod的代理,只要访问service,就能代理到对应的pod
pod的ip在集群外部是无法访问的,通过service,可以在集群之外的机器访问pod
Service是一个固定接入层,客户端可以通过访问Service的ip+port访问到其关联的后端pod。这个service工作以来与k8s集群之上部署的dns附件,现在的版本都是用的coredns。k8s要给客户端提供网络功能,还需要依赖第三方网络插件(flannel、calico等)。每个k8s几点上都有一个组件kube-proxy,始终监视着apiserver中有关service资源的变动信息,跟master上的apiserver交互,随时连接到apiserver获取任何一个与service资源相关的资源变动情况,通过k8s中固有的请求方式watch实现,一旦service资源内容发生变动(如创建删除等),kube-proxy都会将它转化成当前几点之上能够实现service资源调度,把请求调度到后端特定pod资源之上的规则,可能是iptables,也可能是ipvs,这个取决于service的实现方式。
k8s在创建Service的时候,会根据标签选择器selector来查找pod,据此创建与Service同名的endpoint对象,当pod地址发生变化时,endpoint也会随之发生变化,service接收全段client请求时,就会通过endpoint,找到转发到哪个pod进行访问的地址,至于转发到哪个节点的pod,有负载均衡kube-proxy决定 -
k8s集群中的三类ip地址
Node Network(节点网络):物理节点或者虚拟节点的网络
Pod network(pod网络):创建的pod的ip地址,在创建集群时指定网段
ClusterNetwork(集群地址):也成为service network,这是个虚拟的ip地址,没有配置在某个接口上,只是出现在service规则当中。
-
service的四种类型
ClusterIP:
默认类型:创建 Service 时,默认类型为 ClusterIP。
作用:为集群内部提供访问,Service 会分配一个内部 IP,只能在集群内部访问。
适用场景:适用于集群内部服务间的通信。
bash apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 9376
NodePort:
作用:在 ClusterIP 基础上,通过每个节点的 IP 和静态端口(NodePort)暴露服务,外部可通过 : 访问。
端口范围:默认范围为 30000-32767。
适用场景:适用于需要从集群外部访问的服务。
LoadBalancer:
作用:在 NodePort 基础上,使用云服务商的负载均衡器将服务暴露到外部,自动分配外部 IP。
适用场景:适用于在云环境中需要外部访问的服务。
ExternalName:
作用:将 Service 映射到外部 DNS 名称,不提供负载均衡或代理,仅返回 CNAME 记录。
适用场景:适用于将服务指向外部资源。