我在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端点进行轮询?
答案 0 :(得分:2)
有些事情对我来说很有趣,前两个是最重要的:
kubectl get svc
时会显示吗?name: "rediscontroller"
,因此您也应将其用作服务选择器。答案 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)或部署未对其做出正确反应,则不会创建端点。