Kubernetes-无法从同一集群上的另一个Pod连接到Redis Pod

时间:2018-11-21 16:34:38

标签: redis kubernetes minikube kubernetes-helm

同一群集上的Pod之间的连接失败。

据我所知,默认情况下-pod暴露在yaml文件中指定的端口上。例如,我已经为我的redis配置了部署文件,如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis
  labels:
    app: myapp
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - env:
        - name: REDIS_PASS
          value: '**None**'
        image: tutum/redis
        ports:
        - containerPort: 6379
        name: redis
      restartPolicy: Always

以下是容器尝试访问Redis的Pod的部署文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jks
  labels:
    app: myapp
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      imagePullSecrets:
      - name: myappsecret
      containers:
      - env:
        - name: JOBQUEUE
          value: vae_jobqueue
        - name: PORT
          value: "80"
        image: repo.url
        name: jks
        ports:
        - containerPort: 80
        volumeMounts:
          - name: config-vol
            mountPath: /etc/sys0
      volumes:
        - name: config-vol
          configMap:
            name: config

      restartPolicy: Always

我尚未创建任何服务。但这是必需的吗?该吊舱将被同一头盔图表中的另一个吊舱访问。使用此设置,尝试访问redis的第二个pod中有错误:

2018-11-21T16:12:31.939Z - [33mwarn[39m:  Error: Redis connection to redis:6379 failed - getaddrinfo ENOTFOUND redis redis:6379
    at errnoException (dns.js:27:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:78:26)

如何确保我的Pod能够连接到端口6379上的Redis Pod?

----更新----

这是我的图表现在的样子:

# Source: mychartv2/templates/redis-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  selector:
    app: myapp-redis
  clusterIP: None
  ports:
  - name: redis
    port: 6379
    targetPort: 6379
---
# Source: mychartv2/templates/redis-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis
  labels:
    app: myapp-redis
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp-redis
    spec:
      containers:
      - env:
        - name: REDIS_PASS
          value: '**None**'
        image: tutum/redis
        ports:
        - containerPort: 6379
        name: redis
      restartPolicy: Always
---
# Source: mychartv2/templates/jks-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jks
  labels:
    app: myapp-jks
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp-jks
    spec:
      imagePullSecrets:
      - name: jkssecret
      containers:
      - env:
        - name: JOBQUEUE
          value: jks_jobqueue
        - name: PORT
          value: "80"
        image: repo.url
        name: jks
        ports:
        - containerPort: 80
        volumeMounts:
          - name: config-vol
            mountPath: /etc/sys0
      volumes:
        - name: config-vol
          configMap:
            name: jksconfig

      restartPolicy: Always

注意:我正在使用minikube作为我的kubernetes集群

2 个答案:

答案 0 :(得分:1)

您需要Service才能访问Redis窗格。在您当前的资源redis:6379不存在的情况下,具有metadata.name: redis和适当的spec.selector的服务将使其可用。

请注意,您发布的2个部署的metadata.labels.app值与myapp相同,因此您必须将其更改为myapp-redis,以便该服务将定位到正确的吊舱(在该示例中为metadata.name: myapp-redis),而不是HTTP应用程序中的Pod。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis
  labels:
    app: myapp
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp-redis
    spec:
      containers:
      - env:
        - name: REDIS_PASS
          value: '**None**'
        image: tutum/redis
        ports:
        - containerPort: 6379
        name: redis
      restartPolicy: Always

apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  selector:
    app: myapp-redis
  ports:
  - protocol: TCP
    port: 6379

此外,您还向问题中添加了标签kubernetes-helm,因此,如果您使用Helm,我强烈建议您使用this stable chart:只需将其与helm install stable/redis一起安装,便可以使用redis-master:6379访问您的Redis主服务器,以及使用redis-slave:6379访问任何只读从服务器。如果您不需要/想要奴隶,则可以避免,只要通过the configuration了解如何。

答案 1 :(得分:0)

由于您没有为redis Pod创建任何服务,因此需要(01)Pod dns名称或(02)podIP,然后需要端口(6379)才能连接到该服务。有关如何获取Pod的dns名称的信息,请参见dns-pod-service

您可以使用<pod_name>.namespace.pod.cluster.local格式获取dns名称,并且连接uri为<pod_name>.namespace.pod.cluster.local:6379

您可以从.status.podIP获取podIP,连接uri为podIP:6379

在集群中,podIP可能会由于任何原因而发生更改。因此,使用podIP是不明智的。如果创建服务并使用它的dns名称和服务端口(最好是在yaml之后是6379),则更好。我们可以使用以下配置创建服务:

apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  selector:
    app: myapp
  clusterIP: None
  ports:
  - name: redis # Actually, no port is needed.
    port: 6379
    targetPort: 6379

更新

但是,您可以通过在要检查连接的Pod中使用redis-cli二进制文件来检查Redis连接。如果您有redis-cli,请运行$ redis-cli -h <host>,其中

host = redis_service_host or pod_host or redis_servce_ip or pod_ip
相关问题