带有 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需要开放端口范围
我无法访问我的 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需要开放端口范围