kubernets nodeportはアクセスできません

2191 ワード

Environment

Os: centos7.1
Kubelet: 1.6.7
Docker: 17.06-ce
Calico: 2.3

K8s Cluster: master, node-1, node-2

Problem


既存のサービスAは、外部アクセスを可能にするためにサービスtypeをNodePortとしている.ポートは31246です.Aに対応するpodはnode-1上で動作する.
テストにより、master:31246およびnode-2:31246への外部アクセスに失敗し、node-1:31246を介してのみ正常にアクセスできることが分かった.

Reason


安全のため、dockerは1.13バージョンの後、システムiptablesのFOrWARDチェーンのデフォルトポリシーをDROPに設定し、docker 0ブリッジに接続されたコンテナに放行ルールを追加しました.ここでmoby issue#14041の説明を参照する.
When docker starts, it enables net.ipv4.ip_forward without changing the iptables FORWARD chain default policy to DROP. This means that another machine on the same network as the docker host can add a route to their routing table, and directly address any containers running on that docker host.
For example, if the docker0 subnet is 172.17.0.0/16 (the default subnet), and the docker host’s IP address is 192.168.0.10 , from another host on the network run:
   $ ip route add 172.17.0.0/16 via 192.168.0.10
$ nmap 172.17.0.0/16

The above will scan for containers running on the host, and report IP addresses & running services found.
To fix this, docker needs to set the FORWARD policy to DROP when it enables the net.ipv4.ip_forward sysctl parameter.
kubernetesが使用するcniプラグインは影響を受け(cniはFOrWARDチェーンで対応するルールを生成しない)、podが存在するhost以外のノードがメッセージを転送できずアクセスに失敗します.

Solution


セキュリティ要件が低い場合は、FOrWARDチェーンのデフォルトルールをACCEPTに設定できます.
iptables -P FORWARD ACCEPT

その他の方法を参照してください.
kubernetes issues#40182