K8S Service类型

K8S Service类型

閱讀本文約花費: 5 (分鐘)

K8S Service类型∶

● K8S 的服务 (Service)用于解决K8S 集群的网络负载分配
1.服务通过标签检索出正在运行的Pod,维护着该服务的可用Endpoints集合(kubectl get ep )
2.服务以短名字注册到集群DNS,配合namespace和svc后缀就可以进行常规DNS查询,得到该服务的唯一ClusterIP 3.如果是Headless类型的服务,K8S不分配ClusterIP,其DNS响应为一组Pod IP列表,或者一个CNAME指向外部域名
4.服务的网络实现在TCP/IP四层,通过DNAT(nodePort)或 DNAT(ClusterIP,port)两条路径之一到Pod的targetPort
5.targetPort通常是Pod内工作容器或sidecar(比如envoy代理)容器监听的端口号,需要跟pod定义保持一致

● ClusterIP类型的服务 -集群内部互访
集群内部任一 pod 可以经由 ClusterlP∶port发起访问的K8S服务类型

  • K8S服务IP即 ClusterIP,仅存在于转发规则里,不配置到任何内核网络接口- 在 ClusterIP类型 Service的定义中∶
    1.无需显式指定IP,K8S将自动分配一个独占的ClusterIP,定义type为ClusterIP,也可以省略
    2.需要显式指定一组(port, targetPort)端口,同一服务下也可以指定多组端口,共享ClusterIP
    3.协议类型, port和 targetPort需要显式指定, 组和组之间同名端口不能重叠
  • 如果用kube-proxy实现服务SVC-XXX,K8S将为每一组端口创建一条规则跳转到同一个SVC-XXX∶
    1.-A KUBE-SERVICES-d ${ClusterlP}/32 –dport ${port}-jKUBE-SVC-XXX
  • 如果用ipvs配合iptables做 DNAT,则ipysqdm -In可以显示等效转发规则
  • 如果用cilium配合或取代kube-proxy,则cilium service list可以显示等效转发规则

● NodePort类型的服务 – 外部访问集群

  • 集群外部可以经由nodelP∶nodePort发起访问的K8S服务类型(nodeIP用-m gddrtype–dst-tpeLOCAL 匹配)
    一 此服务类型建立在ClusterlP类型之上,因此集群内部pod亦可经由ClusterIP∶port访问此nodePort服务
  • 在 NodePort类型 Service的定义中∶
    1.无需显式指定IP,K8S将自动分配一个独占的ClusterlP,必须定义type为NodePort 2.若更新已有服务为 nodePort类型,需要保证targetPort不变 (容器才是干活的)
    3.需要指定一组(nodePort,port, targetPort),同一服务下也可以指定多组端口,共享ClusterIlP
    4.协议类型,port和targetPort需要显式指定, 组和组之间同名端口不能重叠
    5.nodePort不建议显式指定。如果指定,需要在30000~32767内并确保全体节点IP均无重叠分配
  • 如果用kube-proxy实现服务SVC-XXX,K8S将为每组端口按以下顺序创建两条规则跳转到同一个SVC-XXX∶
    1.-A KUBE-NODEPORTS –dport ${nodePort} -j KUBE-SVC-XXX<<=== 按节点IP 从外部访问
    2.-AKUBE-SERVICES-d${ClusterIP}32–dport ${port}-KUBE-SVC-XXX<<===按服务IP从内部访问
  • 如果用ipvs配合iptables做DNAT,则iysgdm -In可以显示等效转发规则
  • 如果用cilium配合或取代kube-proXy,则cilium service list可以显示等效转发规则

● Loadbalancer – 外部访问集群

  • 由云厂商提供的外部负载均衡器,而不是直接指定从某个Node IP进入集群
  • 必须定义type为LoadBalancer,(可选)定义一个云厂商提供的负载均衡器loadBalancerlP变量
    -其他跟nodePort完全一样

● externalName – 集群访问外部

  • 跟上面三个服务无关,访问方向相反
  • 集群内部访问的服务名字都是短名字,默认为所在集群后缀,以解耦不同集群
  • 集群内的dns服务器将服务A短名字指向一个cname,设置为外部提供的服务B长名字
  • 集群内部查询 A服务得到cname,即可继续查询和访问外部

● 关于 Headless类型的服务

  • Headless类型服务的设计目的,是直接向客户暴露每个Pod的IP地址,而不是中间层的ClusterlP
  • 在Service的配置里,必须显式定义 ClusterIP为 None,不定义type类型
  • 如果有selector定义,则以此检索出正在运行的Pod IPs作为Headless Service的Endpoints
  • 如果无selector定义,若是ExternalName类型则创建CNAME记录,否则检索出其他三种类型的所有同name的PodIP
Rate this post

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注