暴力解决calico网络hostPort不工作的问题

今天在生产环境部署多个 istio Ingressgateway 的时候直接把端口以 hostPort 的方式撸了出来,在我的测试环境亲测工作得很欢快。但是撸到线上环境就各种起不来,具体情况如下:

  • 访问 pod 的 IP:Port 正常
  • 访问 host 的 IP:Port 无法正常工作,端口不监听

看来看去配置文件的问题应该是没有的,配置 hostPort 的配置如下:

apiVersion: extensions/v1beta1
kind: DaemonSet
...
spec:
  ...
  template:
    ...
     containers:
       ports:
       - containerPort: 80
         hostPort: 80
         protocol: TCP
       - containerPort: 443
         hostPort: 443
         protocol: TCP

因为测试环境是自己的集群,版本比较新,相关组件版本为

Kubernetes v1.11.1
Calico 3.1.3 (commit: 231083c2)

线上环境 Kubernetes v1.9.x, Calico 1.6.0

Google 爸爸告诉我们的资料:

关注到 https://github.com/kubernetes/kops/pull/3206/files#diff-891cbc61587adb202b66b7c9bc6896daR41

然后对比一下 线上环境的 /etc/cni/net.d/10-calico.conf 和 测试环境的 /etc/cni/net.d/10-calico.conflist 发现:

  • conf 和 conflist 的配置格式不尽相同
  • 没有关于 portmap 的配置

于是乎做出了一个大胆的想法,把线上相关节点的 10-calico.conf 改写为 10-calico.conflist 并启用相关的 plugins,然后端口正常跑起来了。

⚠️ 对这种骚操作,因为修改的节点上并没有其他业务,所以压力不大,如果要在正在跑业务的节点做这种操作请慎重。