我的kubernetes服务怎么找不到端点?

问题描述 投票:0回答:6

我正在 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
6个回答
29
投票

需要检查的额外事项。

仅当您的部署被认为是健康的时才会创建端点。如果您错误地定义了

readinessProbe
(我有过错)或者部署未对其做出正确反应,则不会创建端点。


21
投票

您可以尝试使用

kubectl get ep
kubectl describe ep
检查端点。如果您在端点描述中看到 pod IP 位于
NotReadyAddresses
旁边,这表明 pod 存在问题,导致其未准备好,在这种情况下,它将无法针对端点进行注册。

如果 Pod 未准备好,可能是因为运行状况/活性探测失败。

服务上的“选择器” (

kubectl get services
kubectl describe myServiceName
) 应与 Pod 上的标签 (
kubectl get pods
kubectl describe po myPodName
) 相匹配。例如。选择器 =
app=myAppName
,pod 标签 =
app=myAppName
。这就是服务确定应尝试连接到哪个端点的方式。


6
投票

有几件事对我来说看起来很有趣,其中前两件事是最重要的:

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

4
投票

对于您的特定情况,如果您在 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 代理等需要注意的事项。


0
投票

添加到投票最高的答案... Kubernetes 有这个有趣的行为(bug?)

场景一: 如果一个 Pod 中有多个容器,其中一个容器以“原因:已完成”终止(这应该完全没问题),则该 Pod 不再被视为“就绪”,并且服务将无法再将其作为端点来访问

场景2: 如果一个 pod 中有多个正在运行的容器,该 pod 将处于“就绪”状态,但服务不会到达所有容器

底线...如果您想将这些容器公开为端点,请不要将多个容器放入一个 Pod 中


0
投票

对于您的特定情况,如果您在 Pod 规范中指定了容器端口,请确保服务规范具有容器端口。查看详细信息:https://kubernetes.io/docs/tasks/debug/debug-application/debug-pods/

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

https://kubernetes.io/docs/tasks/debug/debug-application/debug-service/

它有一个逐步检查清单,列出了从服务到 DNS 到网络到 kube 代理等需要注意的事项。

© www.soinside.com 2019 - 2024. All rights reserved.