【问题标题】:Kubernetes: external service is not available from all minions on Azure cloudKubernetes:Azure 云上的所有 Minion 都无法使用外部服务
【发布时间】:2015-06-09 13:42:38
【问题描述】:

我在 Azure 云上有以下 3 台 Ubuntu 机器集群:

172.16.0.7 (master)
172.16.0.4 (kube-01)
172.16.0.5 (kube-02)

172.16.0.4 (kube-01) 上,我有一个名为 publisher 的 pod,其中暴露了端口 8080。为了让全世界都能使用它,我定义了以下服务:

"id": "publisher-service",
  "kind": "Service",
  "apiVersion": "v1beta1",
  "port": 8181,
  "containerPort": 8080,
  "publicIPs": ["172.16.0.4", "172.16.0.5"],
  "selector": {
    "group": "abc",
    "component": "publisher"
  },
  "labels": {
    "group": "abc"
  }
  • 172.16.0.4172.16.0.5 分别是 kube-01kube-02 的内部 IP 地址(Azure 术语)

  • 172.16.0.4 (kube-01) 上,我定义了一个 Azure 端点,其中公共端口设置为 8181,专用端口设置为 8181

    李>
  • 172.16.0.5 (kube-02) 上,我定义了一个 Azure 端点,其中公共端口设置为 8182,专用端口设置为 8181

    李>

通过这样的设置,我可以使用我的 VM 公共虚拟 IP (VIP) 地址和端口 8181 成功访问 publisher-service

但是我希望也能够使用相同的 VIP 地址和端口 8182 访问 publisher-service(因为它映射到 @987654334 上的端口 8181 @)。而是curl 报告Recv failure: Connection reset by peer

我在这里做错了吗?也许我对Kubernetes External Services 的理解不正确(因此我的期望是错误的)?

我还注意到/var/log/upstart/kube-proxy 中记录了以下条目:

E0404 17:36:33.371889    1661 proxier.go:82] Dial failed: dial tcp 10.0.86.26:8080: i/o timeout
E0404 17:36:33.371951    1661 proxier.go:110] Failed to connect to balancer: failed to connect to an endpoint.

这是在172.16.0.5 (kube-02) 上捕获的iptables -L -t nat 输出的一部分:

Chain KUBE-PORTALS-CONTAINER (1 references)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             11.1.1.2             /* kubernetes */ tcp dpt:https redir ports 45717
REDIRECT   tcp  --  anywhere             11.1.1.1             /* kubernetes-ro */ tcp dpt:http redir ports 34122
REDIRECT   tcp  --  anywhere             11.1.1.221           /* publisher-service */ tcp dpt:8181 redir ports 48046
REDIRECT   tcp  --  anywhere             172.16.0.4           /* publisher-service */ tcp dpt:8181 redir ports 48046
REDIRECT   tcp  --  anywhere             172.16.0.5           /* publisher-service */ tcp dpt:8181 redir ports 48046

Chain KUBE-PORTALS-HOST (1 references)
target     prot opt source               destination
DNAT       tcp  --  anywhere             11.1.1.2             /* kubernetes */ tcp dpt:https to:172.16.0.5:45717
DNAT       tcp  --  anywhere             11.1.1.1             /* kubernetes-ro */ tcp dpt:http to:172.16.0.5:34122
DNAT       tcp  --  anywhere             11.1.1.221           /* publisher-service */ tcp dpt:8181 to:172.16.0.5:48046
DNAT       tcp  --  anywhere             172.16.0.4           /* publisher-service */ tcp dpt:8181 to:172.16.0.5:48046
DNAT       tcp  --  anywhere             172.16.0.5           /* publisher-service */ tcp dpt:8181 to:172.16.0.5:48046

我正在使用 Kubernetes v0.12.0。我跟着this guide 设置了我的集群(即我正在使用法兰绒)。


更新 #1:添加了 publisher pod 状态信息。

apiVersion: v1beta1
creationTimestamp: 2015-04-04T13:24:47Z
currentState:
  Condition:
  - kind: Ready
    status: Full
  host: 172.16.0.4
  hostIP: 172.16.0.4
  info:
    publisher:
      containerID: docker://6eabf71d507ad0086b37940931aa739534ef681906994a6aae6d97b8b213
      image: xxxxx.cloudapp.net/publisher:0.0.2
      imageID: docker://5a76329ae2d0dce05fae6f7b1216e346cef2e5aa49899cd829a5dc1f6e70
      ready: true
      restartCount: 5
      state:
        running:
          startedAt: 2015-04-04T13:26:24Z
  manifest:
    containers: null
    id: ""
    restartPolicy: {}
    version: ""
    volumes: null
  podIP: 10.0.86.26
  status: Running
desiredState:
  manifest:
    containers:
    - capabilities: {}
      command:
      - sh
      - -c
      - java -jar publisher.jar -b $KAFKA_SERVICE_HOST:$KAFKA_SERVICE_PORT
      image: xxxxx.cloudapp.net/publisher:0.0.2
      imagePullPolicy: PullIfNotPresent
      name: publisher
      ports:
      - containerPort: 8080
        hostPort: 8080
        protocol: TCP
      resources: {}
      terminationMessagePath: /dev/termination-log
    dnsPolicy: ClusterFirst
    id: ""
    restartPolicy:
      always: {}
    version: v1beta2
    volumes: null
generateName: rc-publisher-
id: rc-publisher-ls6k1
kind: Pod
labels:
  group: abc
namespace: default
resourceVersion: 22853
selfLink: /api/v1beta1/pods/rc-publisher-ls6k1?namespace=default
uid: f746555d-dacd-11e4-8ae7-000d3a101fda

【问题讨论】:

    标签: azure load-balancing kubernetes


    【解决方案1】:

    外部网络实际上似乎工作正常——您在日志中看到的消息是因为 kube-proxy 确实收到了您发送给它的请求。

    不过,它失败的原因是 kube-proxy 无法与您的 pod 通信。 flannel 无法正确路由到您的 pod 的 IP,或者 pod 不健康。由于向 172.16.0.4 发送请求有效,因此您的 flannel 设置可能有问题。您可以通过尝试从 node-2 卷曲 10.0.86.26:8080 来确认这一点。

    如果 pod 的健康状况可能出现问题,您可以通过运行 kubectl.sh get pod $POD_NAME --output=yaml 查看其详细状态。

    抱歉给大家带来了困难!

    【讨论】:

    • 确实卷曲到10.0.86.26:8080 超时。我已将 pod 状态信息添加到问题正文中。请注意,restartCount: 5 不是问题 - 我在尝试不同的设置时自己重新启动了这个 pod。还有一件事:我还检查了奴才的状态——那里没有任何可疑之处。
    • 任何想法如何检查法兰绒设置?
    • 仅供参考,虽然我发现我的publisher-service 的 k8s 定义不使用选择器而是使用固定端点时,但我没有找到解决此问题的方法。
    • @begie 那么你现在的设置是什么?你能从外部获得你的服务吗?你介意分享你有什么吗?
    • 我刚刚添加了自己的答案。请看下文。
    【解决方案2】:

    使用 k8s v0.14.2 重新安装集群后,一切都开始按预期工作。我关注了 Brendan Burns Docker Guide

    【讨论】:

    • 好的。对于外部访问,您是否有请求进入一个节点(通过打开的端口/端点)并让 kubernetes 服务处理负载平衡?
    • 所有请求都通过一个节点/端点,使用 nginx 代理 websocket 流量到 k8s 服务门户地址。
    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多