2017-05-02 84 views
1

我有一个在本地运行的minikube集群(v0.17.1),有两个部署:一个是Redis实例,另一个是试图连接到Redis实例的自定义应用程序。我的配置或多或少从官方文档和Kubernetes guestbook example复制/粘贴。Kubernetes不提供服务

服务定义和部署:

apiVersion: v1 
kind: Service 
metadata: 
    name: poller-redis 
    labels: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
spec: 
    selector: 
    app: poller 
    tier: backend 
    role: service 
    ports: 
    - port: 6379 
    targetPort: 6379 

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: poller-redis 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: poller-redis 
     tier: backend 
     role: database 
     target: poller 
    spec: 
     containers: 
     - name: poller-redis 
     image: gcr.io/jmen-1266/jmen-redis:a67b5f4bfd8ea8441ed66a8fcb6596f276017a1c 
     ports: 
     - containerPort: 6379 
     env: 
     - name: GET_HOSTS_FROM 
      value: dns 
     imagePullSecrets: 
     - name: gcr-json-key 

应用程序部署:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: poller 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: poller 
     tier: backend 
     role: service 
    spec: 
     containers: 
     - name: poller 
     image: gcr.io/jmen-1266/poller:a96a452292e894e46339309cc024cac67647cc25 
     imagePullPolicy: Always 
     imagePullSecrets: 
     - name: gcr-json-key 

相关的(我希望)Kubernetes信息:

$ kubectl get services 
NAME   CLUSTER-IP EXTERNAL-IP PORT(S) AGE 
kubernetes  10.0.0.1  <none>  443/TCP 24d 
poller-redis 10.0.0.137 <none>  6379/TCP 20d 

$ kubectl get deployments 
NAME   DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 
poller   1   1   1   1   12d 
poller-redis 1   1   1   1   4d 

$ kubectl get endpoints 
NAME   ENDPOINTS   AGE 
kubernetes  10.0.2.15:8443  24d 
poller-redis 172.17.0.7:6379  20d 

里面的poller吊舱(自定义应用程序),我为Redis创建了环境变量:

# env | grep REDIS 
POLLER_REDIS_SERVICE_HOST=10.0.0.137 
POLLER_REDIS_SERVICE_PORT=6379 
POLLER_REDIS_PORT=tcp://10.0.0.137:6379 
POLLER_REDIS_PORT_6379_TCP_ADDR=10.0.0.137 
POLLER_REDIS_PORT_6379_TCP_PORT=6379 
POLLER_REDIS_PORT_6379_TCP_PROTO=tcp 
POLLER_REDIS_PORT_6379_TCP=tcp://10.0.0.137:6379 

但是,如果我尝试连接到该端口,我不能。做类似:

nc -vz poller-redis 6379 

失败。

我注意到,我无法通过它的ClusterIP访问Redis服务,但我可以通过运行Redis的pod的IP。

有什么想法吗?

+0

如何设置你的redis?你是否正确设置了身份验证?你有没有尝试使用Redis客户端连接?在尝试重现您的问题时,我发现'nc'不起作用,但redis客户端可以正常工作,但返回'(错误)NOAUTH身份验证要求。“ – Rod

+0

您是否已经部署了集群网络?像织网,法兰绒或类似的东西?你可以包含输出'kubectl get pod,svc,ep,deploy,rc --all-namespaces'吗?如果可以从另一个容器连接'10.0.0.137:6379'(不使用名称),你还可以测试吗? –

回答

0

最终发现,看起来我误解了服务选择器在Kubernetes中的工作方式。

我已经发布,我的服务定义为:

apiVersion: v1 
kind: Service 
metadata: 
    name: poller-redis 
    labels: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
spec: 
    selector: 
    app: poller 
    tier: backend 
    role: service 
    ports: 
    - port: 6379 
    targetPort: 6379 

的问题是,metadata.labelsspec.selector是不同的,当他们实际上应该是相同的。我仍然不完全明白为什么这是由Kubernetes文档判断的情况,但是你有它。现在我的服务定义是这样的:

apiVersion: v1 
kind: Service 
metadata: 
    name: poller-redis 
    labels: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
spec: 
    selector: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
    ports: 
    - port: 6379 
    targetPort: 6379 

我现在还用直线上升DNS查找(即ping poller-redis),而不是试图从我的目标吊舱连接到localhost:6379

0

这可能与kube-dns可能不运行有关。

从poller pod中可以验证poller-redis能够解析吗?

以下是否从容器内工作?在kube-system运行

nc -v 10.0.0.137
+0

kube-dns是否应该在每个命名空间运行?它运行在'kube-system'中,但不是'default'(这是我正在使用的那个)。 – cgf

+0

不可以。你只需要在kube-system命名空间中有kube-dns。这是一个集群服务。不要再部署它。 –

0

一个KUBE-DNS服务是不够的。您是否在与redis服务具有相同namespace的pod中运行nc -vz poller-redis 6379poller-redis简化了dns同名域中resdis服务的名称。它不会在不同的命名空间中工作。 由于kube-dns在节点上不可用。因此,如果您想在节点中运行ncredisclient,请使用redis服务的clusterIP替换DNS名称。