【问题标题】:How come my kubernetes' service can't find an endpoint?为什么我的 kubernetes 服务找不到端点?
【发布时间】:2015-09-24 04:41:11
【问题描述】:

我在 coreos 上运行一个 kubernetes 集群。

我有一个运行良好的 kubernetes 复制控制器。它看起来像这样:

id: "redis-controller"
kind: "ReplicationController"
apiVersion: "v1beta3"
metadata:
  name: "rediscontroller"
  lables:
    name: "rediscontroller"
spec:
  replicas: 1
  selector:
    name: "rediscontroller"
  template:
    metadata:
      labels:
        name: "rediscontroller"
    spec:
      containers:
        - name: "rediscontroller"
          image: "redis:3.0.2"
          ports:
            - name: "redisport"
              hostPort: 6379
              containerPort:  6379
              protocol: "TCP"

但我为所述复制控制器的 pod 提供了一项服务,如下所示:

id: "redis-service"
kind: "Service"
apiVersion: "v1beta3"
metadata:
  name: "redisservice"
spec:
  ports:
    - protocol: "TCP"
      port: 6379
      targetPort: 6379
  selector:
    name: "redissrv"
  createExternalLoadBalancer: true
  sessionAffinity: "ClientIP"

关于 kube-proxy 的日志有这样的说法:

Jul 06 21:18:31 core-01 kube-proxy[6896]: E0706 21:18:31.477535    6896 proxysocket.go:126] Failed to connect to balancer: failed to connect to an endpoint.
Jul 06 21:18:41 core-01 kube-proxy[6896]: E0706 21:18:41.353425    6896 proxysocket.go:81] Couldn't find an endpoint for default/redisservice:: missing service entry

据我了解,我的服务确实指向正确的 pod 和正确的端口,但我错了吗?

更新 1

我注意到另一个可能的问题,在修复了 Alex 提到的问题后,我注意到在其他使用 websockets 的服务中,该服务找不到端点。这是否意味着服务需要一个 http 端点来轮询?

【问题讨论】:

  • 你有一个错字:标签而不是标签。

标签: proxy docker coreos kubernetes


【解决方案1】:

我觉得有几件事很有趣,前两件事最重要:

  1. 该服务似乎不存在。你确定它是正确创建的吗?运行kubectl get svc 时会显示吗?
  2. 您的服务上的选择器看起来不正确。选择器应该是与复制控制器模板中的匹配的键值标签对。您的 rc 模板中的标签是 name: "rediscontroller",因此您也应该使用它作为您的服务选择器。
  3. 每个对象开头的 id 字段是什么? look like 不是 v1beta3 中的有效字段。

【讨论】:

  • 1.它确实出现在kubectl get svc 2. 很好的捕获 3. 另一个很好的捕获
  • 即使更改选择器以匹配复制控制器,错误仍然存​​在。
  • 这很奇怪,因为 kube-proxy 日志中的错误消息表明它不知道该服务。如果您运行kubectl get endpoints redisservice,您会看到任何端点吗?
  • 我修复了一部分,没有端点的问题是 pod 会死掉,如果没有另一个被启动,服务就没有端点,这是有道理的。不存在的东西很奇怪,但在说服务过时后我就明白了。
【解决方案2】:

对于您的特定情况,如果您在 Pod 规范中指定了服务规范,请确保它具有 containerPort。查看详情:http://kubernetes.io/docs/user-guide/debugging-services/#my-service-is-missing-endpoints

否则请通过K8s官方服务调试指南进行设置:

http://kubernetes.io/docs/user-guide/debugging-services/

它有一个从服务到 DNS 到网络到 kube 代理等的分步检查清单。

【讨论】:

  • 谢谢,但我很久以前就已经解决了这个问题,这是 1.0 之前的版本
  • 酷!根本原因是什么?仅仅是因为 1.0 之前的 kubernetes 稳定性问题吗?想详细说明吗?
  • Alex Robinson 指出的错配选择器和 1.0 之前的稳定性。
【解决方案3】:

需要检查的额外内容。

只有在您的部署被认为是健康的情况下才会创建端点。如果您错误地定义了您的 readinessProbe (mea culpa) 或部署未正确响应它,则不会创建端点。

【讨论】:

    【解决方案4】:

    您可以尝试使用 kubectl get ep kubectl describe ep 检查端点。如果您在端点描述中看到 NotReadyAddresses 旁边的 pod IP,则表明 pod 存在问题导致其未准备好,在这种情况下,它将无法在端点上注册。

    如果 pod 没有准备好,可能是因为健康/活跃度探测失败。

    服务上的“选择器”(kubectl get serviceskubectl describe myServiceName)应该与 pod 上的标签(kubectl get podskubectl describe po myPodName)匹配。例如。选择器 = app=myAppName,吊舱标签 = app=myAppName。这就是服务确定它应该尝试连接到哪个端点的方式。

    【讨论】:

    • 非常有帮助的解释!我的问题与部署和 svc 之间的标签不匹配有关
    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2017-03-25
    相关资源
    最近更新 更多