一 externalTrafficPolicy 属性再探
K8s中的external-traffic-policy是什么?
说明: 阿里云的 'EDAS 和ACK'的默认行为'不一样' eg:EDAS创建的'cm'不会同步到ACK
Kubernetes(二十三)Service(二)会话保持和获取客户端的ip
访问 externalTrafficPolicy 为 Local 的 Service 对应 LB 有时超时
k8s svc的externalTrafficPolicy属性 跨node不通 保留客户端源IP
kubernetes svc设置externalTrafficPolicy无法访问题
现象: 在'没有对应pod'所落的worker节点上,通过'svc'访问'该pod'报错'Connected Refuse'
备注: 但是直接访问'pod'是通的
原因: 因为节点上'没有'相关的'ipvs转发规则',所以'无法'进行dnat,访问会'失败'
说明: 常见有'两种'行为
备注:
1、当externalTrafficPolicy取值为'Local'时
2、通过'节点IP:服务端口'的请求只会转发给'本节点上的Pod',如果节点'没有Pod'话请求会'挂起'
观察点: '没有' endpoint的节点的 'SLB IP' 的IPVS 的'规则' --> SLB的'规则'后端节点
引申: 'ECMP'等价路由、提供服务的'集群节点有差异 [没有健康检查]'等
+++++++++++ "分割线" +++++++++++
现象: 通过k8s的'svc提供的域名 或CLuster IP',竟然'时通时不通' --> '两个实例'
补充: pod内访问'Service'地址偶现不通
原因: net.bridge.bridge-nf-call-iptables = 0 '导致'
k8s 中为什么要开启bridge-nf-call-iptables k8s安装和配置先决条件有该内核参数讲解
kubernetes - "externalTrafficPolicy"设置为 "Local"时'无响应'导致超时、或者'连接拒绝'
抓包分析当svc externalTrafficPolicy=Local 时,进入容器中的包是否进行源地址转换
① Local值和Cluster值的差异性
kubectl explain svc.spec.externalTrafficPolicy
1、集群级别 'Cluster' --> "默认","不会保留源ip"
2、节点级别 'Local'
外部策略为'Local/Cluster',所有集群节点创建'ipvs规则'是有'区别'的
ServiceInternalTrafficPolicy特性在'1.22'的K8s中'默认'开启
Service'选择一个Pod'转发到该Pod,但Service选择的Pod'不一定在接收请求的节点上'
思考1: 'Local'可以获取到客户端源ip的'原因?'
思考2: 在集群内'没有对应endpoint'的'节点上或pod内'通过'svc ip'访问,为什么'时通时不通'?
原因: curl svc_ip:port 时,由于是'Local','ep有两个实例',但是'接收'流量的节点上没有pod
注意: 访问 svc 'Local' 的服务时,一定要注意'访问节点ip上'面要有svc关联 Pod 调度
k8s中的'实例'通常称之为'endpoint'
首先在'Cluster'模式下,ipvs模式下,流量到达'非pod 所在的节点'时,会再做一次'FULL-NAT'
细节:
1、 Kube-proxy在做'转发'时候,会做一次'SNAT' (source network address translation)
2、 所以'源IP'变成了'首先接收请求'的'节点' ip地址
② k8s ipvs模式常用命令
需求: 查询某个 '虚拟ip' 地址的详细信息
ipvsadmn -ln -t vip:port
-g: --gatewaying, 指定LVS工作模式为'Direct-routing 直接路由'方式,是'LVS'默认工作模式
-i: --ipip, 指定LVS的工作模式为'隧道封装'模式
-m:--masquerading, 指定LVS的工作模式为'MAT'模式 --> 'NAT'和'Full-Nat'模式
conntrack -L | grep 'ip'
误区: pod服务'启动'有这个端口,但是没有通过任何形式'暴露'端口,所以'除了该pod内'都无法访问
③ ACK云产品的Service
说明: 以下讲解ACK 的'flannel' 网络插件
每一个pod里面'/etc/resolv.conf' 会'添加'一个东西: ns.svc.cluster.ip
阿里云负载均衡'SLB'服务'现在叫CLB'
遗留: kubectl explain svc.spec.sessionAffinity