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

时间:2015-07-06 21:27:01

标签: proxy docker coreos kubernetes

我在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端点进行轮询?

4 个答案:

答案 0 :(得分:2)

有些事情对我来说很有趣,前两个是最重要的:

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

答案 1 :(得分: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代理等的一些逐步检查清单。

答案 2 :(得分:2)

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

如果吊舱尚未准备就绪,可能是由于健康/活力探测失败。

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

答案 3 :(得分:1)

要检查的额外事项。

仅在部署被视为健康时才会创建端点。如果您已正确定义了readinessProbe(mea culpa)或部署未对其做出正确反应,则不会创建端点。