KubernetesクラスターでNodePortサービスにアクセスできません。
目標
webSocketとhttp/2を使用できるように、ALBIngressコントローラーをセットアップします
そのコントローラーの必要に応じてNodePortサービスをセットアップします
実行した手順
以前は、Kops(バージョン1.6.2)クラスターがAWSeu-west-1で作成されていました。 Nginx入力用のkopsアドオンとKube-legoが追加されました。 ELB入力は正常に機能しています。
そのプロジェクトで指定されたIAMプロファイルを使用して、カスタムAWSキーでALB IngressControllerをセットアップします。
Kubectl replace --forceを使用して、サービスタイプをLoadBalancerからNodePortに変更しました
> kubectl describe svc my-nodeport-service
Name: my-node-port-service
Namespace: default
Labels: <none>
Selector: service=my-selector
Type: NodePort
IP: 100.71.211.249
Port: <unset> 80/TCP
NodePort: <unset> 30176/TCP
Endpoints: 100.96.2.11:3000
Session Affinity: None
Events: <none>
> kubectl describe pods my-nodeport-pod
Name: my-nodeport-pod
Node: <ip>.eu-west-1.compute.internal/<ip>
Labels: service=my-selector
Status: Running
IP: 100.96.2.11
Containers:
update-center:
Port: 3000/TCP
Ready: True
Restart Count: 0
(ssh into node)
$ Sudo netstat -nap | grep 30176
tcp6 0 0 :::30176 :::* LISTEN 2093/kube-proxy
結果
ALBからのカールがハングする
<public ip address of all nodes>:<node port for service>
からのカールがハングする
期待される
ALBから直接node:node-portへのカールは200 "Ok"(ルートへのサービスのhttp応答)を返す必要があります
更新:上記のgithub参照で作成された問題と、場合によってはさらに詳細な情報:
デフォルトでは、Kopsは外部からのNodePortトラフィックを許可するようにEC2インスタンスを設定しません。
クラスタ外のトラフィックがNodePortに到達するには、AWSのEC2コンソールでKubernetesノードであるEC2インスタンスの設定を編集する必要があります。
EC2コンソールで、[セキュリティグループ]をクリックします。 Kopsは、クラスター用に作成した元のセキュリティグループにnodes.<your cluster name>
およびmaster.<your cluster name>
という注釈を付ける必要があります。
NodePortsのデフォルトのポート範囲からインスタンスにトラフィックを転送するには、これらのセキュリティグループを変更する必要があります。
セキュリティグループをクリックし、ルールをクリックして、次のルールを追加します。
ノードとマスターで開くポート範囲:30000-32767
これにより、インターネット上の誰もがクラスター上のNodePortにアクセスできるようになるため、これらを公開するようにしてください。
または、任意のオリジンから許可する代わりに、alb-ingress-controllerによってALB用に作成されたセキュリティグループからのみ許可することができます。ただし、これらは再作成できるため、kubernetesサービスの変更に関するルールを変更する必要がある可能性があります。 NodePortを明示的に指定することは、ランダムに割り当てられたものではなく、事前に定義された既知のNodePortであることをお勧めします。
マスターのSGは、:を機能させるためにノードポート範囲を開く必要はありません。
したがって、ワーカーのSGのみがポート範囲を開く必要があります。