【问题标题】:How to connect to kubernetes endpoint?如何连接到 Kubernetes 端点?
【发布时间】:2015-12-10 06:57:37
【问题描述】:

我已经创建了一个 Kubernetes 服务:

[root@Infra-1 kubernetes]# kubectl describe service gitlab 
Name:           gitlab
Namespace:      default
Labels:         name=gitlab
Selector:       name=gitlab
Type:           NodePort
IP:         10.254.101.207
Port:           http    80/TCP
NodePort:       http    31982/TCP
Endpoints:      172.17.0.4:80
Port:           ssh 22/TCP
NodePort:       ssh 30394/TCP
Endpoints:      172.17.0.4:22
Session Affinity:   None
No events.

但是,我无法连接到端点,甚至无法从节点主机上的 shell:

 [root@Infra-2 ~]# wget 172.17.0.4:80
 --2015-12-08 20:22:27--  http://172.17.0.4:80/
 Connecting to 172.17.0.4:80... failed: Connection refused.

在 NodePort 上调用 wget localhost:31982 也会得到 Recv failure: Connection reset by peer 并且 kube-proxy 会记录错误消息:

 Dec 08 20:13:41 Infra-2 kube-proxy[26410]: E1208 20:13:41.973209   26410 proxysocket.go:100] Dial failed: dial tcp 172.17.0.4:80: connection refused
 Dec 08 20:13:41 Infra-2 kube-proxy[26410]: E1208 20:13:41.973294   26410 proxysocket.go:100] Dial failed: dial tcp 172.17.0.4:80: connection refused
 Dec 08 20:13:41 Infra-2 kube-proxy[26410]: E1208 20:13:41.973376   26410 proxysocket.go:100] Dial failed: dial tcp 172.17.0.4:80: connection refused
 Dec 08 20:13:41 Infra-2 kube-proxy[26410]: E1208 20:13:41.973482   26410 proxysocket.go:100] Dial failed: dial tcp 172.17.0.4:80: connection refused
 Dec 08 20:13:41 Infra-2 kube-proxy[26410]: E1208 20:13:41.973494   26410 proxysocket.go:134] Failed to connect to balancer: failed to connect to an endpoint.

这次失败的原因可能是什么?

这里是我的服务配置文件http://pastebin.com/RriYPRg7,对https://github.com/sameersbn/docker-gitlab/blob/master/kubernetes/gitlab-service.yml稍作修改

【问题讨论】:

  • wget 172.17.0.4:80 给你什么?
  • @MichaelHausenblas 抱歉,连接被拒绝。我不知道为什么我在问题的原始版本中检查了 :82,我现在更正了。
  • 我开始认为该错误可能是由 gitlab - pod 的故障引起的。这意味着网络工作正常,但 gitlab-server 没有运行。

标签: kubernetes


【解决方案1】:

实际上是 Pod 或复制控制器出现问题,因为它没有转发到服务。也许发布该配置或确保它已指定端口并且其容器的进程正在侦听正确的端口

原创

实际上暴露在 pod 外面的是 NodePortPort 是节点内 NAT 网络上的端口,Port 是容器内的进程应该绑定的端口,通常使用服务发现。其他 pod 将在 NodePort 上与该 pod 对话。如果您想为 Web 服务器显式设置 NodePort,那么在 Pod 的定义或复制控制器或服务定义中,将 NodePort 显式设置为所需的端口。

Port: 80 表示容器内的 nginx 在侦听端口 80,然后 NodePort: 4980 将是暴露的端口。所以你会wget <Node IP>:4980

就解决您的特定情况而言,我建议不要将其复杂化并明确设置TargetPortNodePort

【讨论】:

  • 但是wget localhost:<NodePort> 也给了我一个connection refused。我已经更新了我的问题以澄清这一点。
  • 你能告诉我应该如何更改我的服务配置文件吗?对wget ... 的调用会成功吗?
  • 实际上是 Pod 或复制控制器有问题,因为它没有转发到服务。也许发布该配置或确保它已指定端口并且其容器的进程正在侦听正确的端口。
  • 你是对的。 pod/rc 是问题所在。事实证明,由于其他问题,gitlab 无法启动。您能否将其包含在您的答案中(并更新它以便立即包含“更正”?然后我可以接受它。:)
  • 已修复。很高兴能帮上忙。
【解决方案2】:

除了“NodePort”类型的服务之外,还有一些额外的方法可以与集群外部的 kubernetes 服务进行交互。也许它们会更“自然”和容易:

  • 使用服务类型“LoadBalancer”。它仅适用于某些云提供商,例如不适用于 virtualbox,但我认为了解该功能会很好。在这种情况下,您不仅会获得服务的“仅限内部集群”IP 地址,还会获得外部配置的负载均衡器来访问它(在 aws/gce 等中)Link to the documentation
  • 使用称为“入口”的最新功能之一。这是手册中的描述 “Ingress 是允许入站连接到达集群服务的规则集合。它可以配置为为服务提供外部可访问的 url、负载平衡流量、终止 SSL、提供基于名称的虚拟主机等等”Link to the documentation
  • 如果 kubernetes 要求不严格,您可以切换到最新的 openshift origin(即“kubernetes on steroids”),您可以使用名为“router”的 origin 功能。

【讨论】:

  • 我使用的 kubernetes 安装在我们自己的裸机上运行,​​所以没有机会使用外部提供的 LoadBalancer,对吧?
  • 我计划在其中一个节点上设置一个 nginx 代理,将传入流量引导到正确服务的 NodePort。
  • 在裸机安装的情况下,没有机会使用外部 LoadBalancer。但是您仍然可以使用入口/原始路线,这将是更容易/更强大的解决方案。例如部署基本的 openshift 路由器只需要几个命令
猜你喜欢
  • 1970-01-01
  • 2016-12-19
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多