带有 Kops 的 AWS 上的 Kubernetes 集群 - NodePort 服务不可用

Kubernetes Cluster on AWS with Kops - NodePort Service Unavailable

我无法访问我的 Kubernetes 集群上的 NodePort 服务。

目标

设置 ALB Ingress 控制器以便我可以使用 websockets 和 http/2

根据该控制器的要求设置 NodePort 服务

已走步数

之前在 AWS eu-west-1 上创建了一个 Kops(版本 1.6.2)集群。添加了用于 nginx 入口的 kops 插件以及 Kube-lego。 ELB 入口工作正常。

使用该项目指定的 IAM 配置文件使用自定义 AWS 密钥设置 ALB 入口控制器。

使用 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 端口的卷曲应该 return 200 "Ok"(服务对根的 http 响应)

更新: 在 github 上创建的问题在某些情况下引用了上面的一些进一步的细节:

默认情况下,Kops 不会将 EC2 实例配置为允许来自外部的 NodePort 流量。

为了让集群外部的流量到达 NodePort,您必须在 AWS 上的 EC2 控制台中编辑作为 Kubernetes 节点的 EC2 实例的配置。

进入 EC2 控制台后,单击 "Security groups." Kops 应该将它为您的集群创建的原始安全组注释为 nodes.<your cluster name>master.<your cluster name>

我们需要修改这些安全组以将流量从 NodePorts 的默认端口范围转发到实例。

点击安全组,点击规则,添加以下规则。

在节点和主机上打开的端口范围:30000-32767

这将允许 Internet 上的任何人访问您集群上的 NodePort,因此请确保您希望公开这些端口。

或者,您可以只允许来自 alb-ingress-controller 为 ALB 创建的安全组,而不是允许它来自任何来源。但是,由于可以重新创建这些,因此可能需要修改有关修改 kubernetes 服务的规则。我建议明确指定 NodePort 是预先确定的已知 NodePort,而不是随机分配的。

master 的 SG 不需要打开 nodeport 范围来使 : 工作。

所以只有Worker的SG需要开放端口范围