Kubernetes:外部服务不适用于 Azure 云上的所有 minions
Kubernetes: external service is not available from all minions on Azure cloud
我在 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.4
和 172.16.0.5
分别是 kube-01
和 kube-02
的内部 IP 地址(Azure 术语)
在 172.16.0.4 (kube-01)
我有一个 Azure 端点定义 public 端口设置为 8181 和私有端口设置为 8181
在 172.16.0.5 (kube-02)
我有一个 Azure 端点定义 public 端口设置为 8182 和私有端口设置为 8181
通过这样的设置,我可以使用我的 VM public 虚拟 IP (VIP) 地址和端口 8181.[=33= 成功访问 publisher-service
]
但是我希望也能够使用相同的 VIP 地址和端口 8182 到达 publisher-service
(因为它映射到端口 8181 在 kube-02
上)。相反 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 设置了我的集群(即我使用的是 flannel)。
更新 #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
外部网络实际上似乎工作正常——您在日志中看到的消息是因为 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
.
查看其详细状态
抱歉给您带来了困难!
使用 k8s v0.14.2 重新安装集群后,一切都开始按预期工作。我关注了 Brendan Burns Docker Guide.
我在 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.4
和172.16.0.5
分别是kube-01
和kube-02
的内部 IP 地址(Azure 术语)在
172.16.0.4 (kube-01)
我有一个 Azure 端点定义 public 端口设置为 8181 和私有端口设置为 8181在
172.16.0.5 (kube-02)
我有一个 Azure 端点定义 public 端口设置为 8182 和私有端口设置为 8181
通过这样的设置,我可以使用我的 VM public 虚拟 IP (VIP) 地址和端口 8181.[=33= 成功访问 publisher-service
]
但是我希望也能够使用相同的 VIP 地址和端口 8182 到达 publisher-service
(因为它映射到端口 8181 在 kube-02
上)。相反 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 设置了我的集群(即我使用的是 flannel)。
更新 #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
外部网络实际上似乎工作正常——您在日志中看到的消息是因为 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
.
抱歉给您带来了困难!
使用 k8s v0.14.2 重新安装集群后,一切都开始按预期工作。我关注了 Brendan Burns Docker Guide.