为什么我的 kubernetes 服务找不到端点?
How come my kubernetes' service can't find an endpoint?
我是 运行 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"
但我有一个针对所述复制控制器的 pods 的服务,如下所示:
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 端点来进行轮询?
有几件事对我来说很有趣,前两个最重要:
- 看起来该服务不存在。您确定它已正确创建吗?当你 运行
kubectl get svc
时它会出现吗?
- 您服务上的选择器看起来不正确。选择器应该是与复制控制器模板中的匹配的键值标签对。您的 rc 模板中的标签是
name: "rediscontroller"
,因此您也应该将其用作您的服务选择器。
- 每个对象开头的 id 字段是什么? look like 这不是 v1beta3 中的有效字段。
对于您的特定情况,如果您在 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 代理等需要注意事项的分步清单。
需要检查的额外内容。
只有当您的部署被认为是健康的时候才会创建端点。如果您错误地定义了 readinessProbe(mea culpa)或部署没有正确响应它,则不会创建端点。
您可以尝试使用 kubectl get ep
kubectl describe ep
检查端点。如果您在端点描述中的 NotReadyAddresses
旁边看到 Pod IP,这表明 Pod 存在问题导致它未就绪,在这种情况下,它将无法针对端点注册。
如果 pod 未就绪,可能是因为 health/liveness 探测失败。
您服务 (kubectl get services
kubectl describe myServiceName
) 上的 'selector' 应与 pods (kubectl get pods
kubectl describe po myPodName
) 上的标签匹配。例如。选择器 = app=myAppName
,广告连播标签 = app=myAppName
。这就是服务如何确定它应该尝试连接到哪个端点。
我是 运行 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"
但我有一个针对所述复制控制器的 pods 的服务,如下所示:
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 端点来进行轮询?
有几件事对我来说很有趣,前两个最重要:
- 看起来该服务不存在。您确定它已正确创建吗?当你 运行
kubectl get svc
时它会出现吗? - 您服务上的选择器看起来不正确。选择器应该是与复制控制器模板中的匹配的键值标签对。您的 rc 模板中的标签是
name: "rediscontroller"
,因此您也应该将其用作您的服务选择器。 - 每个对象开头的 id 字段是什么? look like 这不是 v1beta3 中的有效字段。
对于您的特定情况,如果您在 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 代理等需要注意事项的分步清单。
需要检查的额外内容。
只有当您的部署被认为是健康的时候才会创建端点。如果您错误地定义了 readinessProbe(mea culpa)或部署没有正确响应它,则不会创建端点。
您可以尝试使用 kubectl get ep
kubectl describe ep
检查端点。如果您在端点描述中的 NotReadyAddresses
旁边看到 Pod IP,这表明 Pod 存在问题导致它未就绪,在这种情况下,它将无法针对端点注册。
如果 pod 未就绪,可能是因为 health/liveness 探测失败。
您服务 (kubectl get services
kubectl describe myServiceName
) 上的 'selector' 应与 pods (kubectl get pods
kubectl describe po myPodName
) 上的标签匹配。例如。选择器 = app=myAppName
,广告连播标签 = app=myAppName
。这就是服务如何确定它应该尝试连接到哪个端点。