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