
k8s集群升级了双协议栈后,从集群内无法访问外部ipv6服务,已经确认部署了Endpoint和Service。而同样采用ipv4是没问题的。
apiVersion: v1
kind: Service
metadata:
  name: myep
  namespace: default
  labels:
    app: myep
spec:
  ports:
  - name: http-8080
    port: 8080
    protocol: TCP
    targetPort: 8080
  ipFamilies:
  - IPv6
---
apiVersion: v1
kind: Endpoints
apiVersion: v1
metadata:
  name: myep  #此名字需与 Service 中的 metadata.name 的值一致
  namespace: default
  labels:
    app: myep
subsets:
  - addresses:
      - ip: 1002:003B:456C:678D:890E:0012:234F:56G7   ## 集群外Ip
    ports:
      - port: 8080
        name: http-8080然后在集群的Pod中访问myep:8080不通。
tcpdump -i eth0 host 1002:003B:456C:678D:890E:0012:234F:56G7 tcp -vv发现可以收到发来的请求,但是并没有回包。
这里采用了一种比较简单的解决方案,最终方案应该通过集群的cni配置解决。
为所有的宿主机添加iptables策略:
ip6tables -t nat -A POSTROUTING -s 2000:100:100:100::/64 -o eth0 -j SNAT --to-source FC00:0:130F::9C0:876A:130B参数  | 说明  | 
|---|---|
-s  | 要处理的源IP段  | 
-o  | 规则绑定的接口  | 
--to-source  | 替换的IP(本机IP)  | 
增加iptables策略后服务就可以访问了。
最初在服务所在主机上通过增加静态路由的方式也可以临时性达到目的:
ip -6 route add 2000:100:100:100::/64 via FC00:0:130F::9C0:876A:130B相当于把Pod所在宿主机作为Pod内部网段的网关,这样可以临时解决问题,当时由于Pod会在集群的Node上漂移,所以这不是一个好的方法。
最好的方式还是通过修改CNI的配置解决,以Calico为例,需要修改IpPool的配置,将ipv6下面的NATOutgoing设置为true即可。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。