k8s service详解之对外暴露service详解
对外暴露service详解1. 外界连通service说明上一节说明了service机制的相关原理,但service的服务发现机制是在k8s集群内部的,外部访问是无效的。所以我们需要额外的手段解决外部访问k8s创建的service。k8s在1.18中主要提供了3种方式:NodePort,LoadBalancer,ExternalName。2. NodePort详解以hostnames为例,修改其s
对外暴露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. my−svc.my-namespace.svc.cluster.local。
更多推荐
所有评论(0)