0

问题

我正在尝试NodePort在我的 Kubernetes 集群中创建一个类型的服务,但它没有按预期工作,我怀疑它必须这样做,因为我已经禁用了我的主节点上使用的 IAM 角色的 ELB 权限。我不认为 ELB 权限应该重要NodePort,但我看到一条错误消息让我想到这一点。难道我做错了什么?这是其他人以前见过的已知问题吗?

试图

向我的集群部署了一个类型的服务NodePort,期望能够在任何节点的公共 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 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
    
  • 从主节点卷曲端点(有效,因此 pod 运行良好):

    $ curl 100.96.2.4
    <html ng-app="redis">
      <head>
    ---SNIP---
      </body>
    </html>
    

预期结果

NodePort卷曲服务分配的任何节点的外部 IP 时,预计会看到与卷曲端点相同的结果30095

额外细节:

  • $ 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

  • 邮件列表帖子:https ://groups.google.com/forum/#!topic/kubernetes-dev/JNC_bk1L3iI
4

1 回答 1

1

Kubernetes 这样做是因为它假设一个新NodePort服务以前可能是一个LoadBalancer服务,因此它可能需要清理云负载均衡器。打开了一个可以解决此问题的PR,但随后关闭。同时,为master角色切换 IAM 策略elasticloadbalancing:DescribeLoadBalancers而不是elasticloadbalancing:*解决问题,即包括NodePort服务在内的集群的其余部分工作正常,但仍然限制人们创建 ELB。

于 2016-12-26T19:33:24.943 回答