NodePort 服务无法在 AWS 上按预期工作,可能是由于 IAM ELB 权限
NodePort services not working as expected on AWS, possibly due to IAM ELB permissions
问题
我正在尝试在我的 Kubernetes 集群中创建一个 NodePort
类型的服务,但它没有按预期工作,我怀疑它必须这样做,因为我已经禁用了 ELB 权限IAM 角色正在我的主节点上使用。我不认为 ELB 权限对 NodePort
应该很重要,但我看到一条错误消息让我想到了这一点。难道我做错了什么?这是其他人以前见过的已知问题吗?
尝试
已将 NodePort
类型的服务部署到我的集群,希望能够在任何节点的 public IP 和给定端口上访问我的服务,但我做不到。有 1 个主节点和 2 个非主节点,除主节点外,甚至没有进程绑定到端口 30095(分配的 NodePort
)。通过 SSH 连接到主机并以各种方式卷曲该端口什么都不做(curl
只是挂起)。卷曲与服务关联的端点工作正常。 kubectl describe
服务提示创建负载均衡器时出现错误,但我不知道为什么会这样。
我要重申,我特别禁用了主节点使用的 IAM 角色,使其无法执行任何 ELB 操作。我不希望使用我的 Kubernetes 集群的开发人员能够在我的账户中启动 ELB,或者为此做任何会在我的账户中创建 AWS 资源的事情。
实际结果
有关服务的信息(来自本地工作站的命令 运行)-- 注意 CreatingLoadBalancerFailed
kubectl describe service
:
输出中的错误
$ kubectl get services frontend -oyaml
apiVersion: v1
kind: Service
---SNIP---
ports:
- nodePort: 30095
port: 80
protocol: TCP
targetPort: 80
selector:
app: guestbook
tier: frontend
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
$ kubectl describe services frontend
Name: frontend
Namespace: default
Labels: app=guestbook
tier=frontend
Selector: app=guestbook,tier=frontend
Type: NodePort
IP: 100.67.10.125
Port: <unset> 80/TCP
NodePort: <unset> 30095/TCP
Endpoints: 100.96.1.2:80,100.96.2.2:80,100.96.2.4:80
Session Affinity: None
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
1h 4m 15 {service-controller } Warning CreatingLoadBalancerFailed (events with common reason combined)
寻找绑定到非主节点端口的进程:
$ netstat -tulpn | grep 30095
# no output
寻找绑定到主节点端口的进程:
$ netstat -tulpn | grep 30095
tcp6 0 0 :::30095 :::* LISTEN 1540/kube-proxy
正在尝试 curl 服务(只是挂起):
$ curl localhost:30095
# just hangs
^C
$ curl -g -6 http://[::1]:30095
# just hangs
^C
$ curl -vvvg -6 http://[::1]:30095
* Rebuilt URL to: http://[::1]:30095/
* Hostname was NOT found in DNS cache
* Trying ::1...
* Connected to ::1 (::1) port 30095 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.38.0
> Host: [::1]:30095
> Accept: */*
>
# just hangs after that
^C
$ curl 100.67.10.125:30095
# just hangs
^C
从主节点卷曲一个端点(有效,所以 pods 运行 宁没问题):
$ curl 100.96.2.4
<html ng-app="redis">
<head>
---SNIP---
</body>
</html>
预期结果
在卷曲服务上分配给 30095
的任何节点的外部 IP 时,卷曲端点预计会看到相同的结果。
其他详细信息:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.1+82450d0", GitCommit:"82450d03cb057bab0950214ef122b67c83fb11df", GitTreeState:"not a git tree", BuildDate:"2016-12-14T04:09:31Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"4", GitVersion:"v1.4.6", GitCommit:"e569a27d02001e343cb68086bc06d47804f62af6", GitTreeState:"clean", BuildDate:"2016-11-12T05:16:27Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"}
GitHub 问题:https://github.com/kubernetes/kubernetes/issues/39214
- 邮件列表post:https://groups.google.com/forum/#!topic/kubernetes-dev/JNC_bk1L3iI
Kubernetes 这样做是因为它假定新的 NodePort
服务以前可能是 LoadBalancer
服务,因此它可能需要清理云负载平衡器。已打开 PR 以解决此问题,但随后关闭。同时,将 master
角色的 IAM 策略切换为 elasticloadbalancing:DescribeLoadBalancers
而不是 elasticloadbalancing:*
解决了这个问题,即集群的其余部分包括 NodePort
服务工作正常,但仍然限制人们创建 ELB。
问题
我正在尝试在我的 Kubernetes 集群中创建一个 NodePort
类型的服务,但它没有按预期工作,我怀疑它必须这样做,因为我已经禁用了 ELB 权限IAM 角色正在我的主节点上使用。我不认为 ELB 权限对 NodePort
应该很重要,但我看到一条错误消息让我想到了这一点。难道我做错了什么?这是其他人以前见过的已知问题吗?
尝试
已将 NodePort
类型的服务部署到我的集群,希望能够在任何节点的 public IP 和给定端口上访问我的服务,但我做不到。有 1 个主节点和 2 个非主节点,除主节点外,甚至没有进程绑定到端口 30095(分配的 NodePort
)。通过 SSH 连接到主机并以各种方式卷曲该端口什么都不做(curl
只是挂起)。卷曲与服务关联的端点工作正常。 kubectl describe
服务提示创建负载均衡器时出现错误,但我不知道为什么会这样。
我要重申,我特别禁用了主节点使用的 IAM 角色,使其无法执行任何 ELB 操作。我不希望使用我的 Kubernetes 集群的开发人员能够在我的账户中启动 ELB,或者为此做任何会在我的账户中创建 AWS 资源的事情。
实际结果
有关服务的信息(来自本地工作站的命令 运行)-- 注意
输出中的错误CreatingLoadBalancerFailed
kubectl describe service
:$ kubectl get services frontend -oyaml apiVersion: v1 kind: Service ---SNIP--- ports: - nodePort: 30095 port: 80 protocol: TCP targetPort: 80 selector: app: guestbook tier: frontend sessionAffinity: None type: NodePort status: loadBalancer: {} $ kubectl describe services frontend Name: frontend Namespace: default Labels: app=guestbook tier=frontend Selector: app=guestbook,tier=frontend Type: NodePort IP: 100.67.10.125 Port: <unset> 80/TCP NodePort: <unset> 30095/TCP Endpoints: 100.96.1.2:80,100.96.2.2:80,100.96.2.4:80 Session Affinity: None Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1h 4m 15 {service-controller } Warning CreatingLoadBalancerFailed (events with common reason combined)
寻找绑定到非主节点端口的进程:
$ netstat -tulpn | grep 30095 # no output
寻找绑定到主节点端口的进程:
$ netstat -tulpn | grep 30095 tcp6 0 0 :::30095 :::* LISTEN 1540/kube-proxy
正在尝试 curl 服务(只是挂起):
$ curl localhost:30095 # just hangs ^C $ curl -g -6 http://[::1]:30095 # just hangs ^C $ curl -vvvg -6 http://[::1]:30095 * Rebuilt URL to: http://[::1]:30095/ * Hostname was NOT found in DNS cache * Trying ::1... * Connected to ::1 (::1) port 30095 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: [::1]:30095 > Accept: */* > # just hangs after that ^C $ curl 100.67.10.125:30095 # just hangs ^C
从主节点卷曲一个端点(有效,所以 pods 运行 宁没问题):
$ curl 100.96.2.4 <html ng-app="redis"> <head> ---SNIP--- </body> </html>
预期结果
在卷曲服务上分配给 30095
的任何节点的外部 IP 时,卷曲端点预计会看到相同的结果。
其他详细信息:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.1+82450d0", GitCommit:"82450d03cb057bab0950214ef122b67c83fb11df", GitTreeState:"not a git tree", BuildDate:"2016-12-14T04:09:31Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"4", GitVersion:"v1.4.6", GitCommit:"e569a27d02001e343cb68086bc06d47804f62af6", GitTreeState:"clean", BuildDate:"2016-11-12T05:16:27Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"}
GitHub 问题:https://github.com/kubernetes/kubernetes/issues/39214
- 邮件列表post:https://groups.google.com/forum/#!topic/kubernetes-dev/JNC_bk1L3iI
Kubernetes 这样做是因为它假定新的 NodePort
服务以前可能是 LoadBalancer
服务,因此它可能需要清理云负载平衡器。已打开 PR 以解决此问题,但随后关闭。同时,将 master
角色的 IAM 策略切换为 elasticloadbalancing:DescribeLoadBalancers
而不是 elasticloadbalancing:*
解决了这个问题,即集群的其余部分包括 NodePort
服务工作正常,但仍然限制人们创建 ELB。