对外暴露service详解

1. 外界连通service说明

上一节说明了service机制的相关原理,但service的服务发现机制是在k8s集群内部的,外部访问是无效的。所以我们需要额外的手段解决外部访问k8s创建的service。k8s在1.18中主要提供了3种方式:NodePort,LoadBalancer,ExternalName。

2. NodePort详解
  • 以hostnames为例,修改其service的yaml配置如下,此时访问这个service只需要访问,k8s集群任一节点ip:30376即可访问到该pod。

  • 查看30376的iptables规则可知,目标端口为30376匹配到两条规则,其中KUBE-MARK-MASQ打了0x400的标志,该标志的目的是做SNAT操作,在client->node2->node1这个调用链中,如果未打该标志,则在node1直接返回client。对于client端来说,请求的是node2,但从node1返回结果。

  • 而KUBE-SVC-ODX2UBAZM7RQWOIU规则在上一章节已做解释,主要是基于负载均衡策略权重到目标pod。

apiVersion: v1
kind: Service
metadata:
  name: hostnames
spec:
  selector:
    app: hostnames
  ports:
    - name: default
      nodePort: 30376
      port: 80
      targetPort: 9376
      protocol: TCP
  type: NodePort
  
[root@k8s-node1 ~]# iptables-save | grep  30376
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/hostnames:default" -m tcp --dport 30376 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/hostnames:default" -m tcp --dport 30376 -j KUBE-SVC-ODX2UBAZM7RQWOIU
[root@k8s-node1 ~]# iptables-save | grep  "A KUBE-MARK-MASQ"
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
[root@k8s-node1 ~]# iptables-save | grep  "KUBE-SVC-ODX2UBAZM7RQWOIU"
:KUBE-SVC-ODX2UBAZM7RQWOIU - [0:0]
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/hostnames:default" -m tcp --dport 30376 -j KUBE-SVC-ODX2UBAZM7RQWOIU
-A KUBE-SERVICES -d 10.101.229.38/32 -p tcp -m comment --comment "default/hostnames:default cluster IP" -m tcp --dport 80 -j KUBE-SVC-ODX2UBAZM7RQWOIU
-A KUBE-SVC-ODX2UBAZM7RQWOIU -m comment --comment "default/hostnames:default" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-ESCSO4DZ6QJFDVPZ
-A KUBE-SVC-ODX2UBAZM7RQWOIU -m comment --comment "default/hostnames:default" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-P5WZKF5SFCHMY4QQ
-A KUBE-SVC-ODX2UBAZM7RQWOIU -m comment --comment "default/hostnames:default" -j KUBE-SEP-7ZEX5NM4FNAFXYKX
3. LoadBalancer详解

公有云提供的k8s服务里,通过CloudProvider的转接层来跟公有云的API对接,在公有云上创建一个负载均衡服务,并把被代理的POD IP地址配置给负载均衡服务作为后端。

4. ExternalName详解

可以通过在service中指定externalName=mydomain.com字段,该字段的主要目的把公司的域名或外部域名地址的访问与k8s的dns对等起来。访问mydomain.com到k8s内部就变换成 m y − s v c . my-svc. mysvc.my-namespace.svc.cluster.local。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐