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

Kubernetes-无法从同一集群上的另一个pod连接到redis pod,redis,kubernetes,minikube,kubernetes-helm,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

同一群集上的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
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)
我还没有创建任何服务。但这是必需的吗?该吊舱将被另一个吊舱访问,该吊舱是同一舵图的一部分。通过此设置,尝试访问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
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集群

您需要一个服务器才能访问Redis吊舱。在您当前的资源
redis:6379
不存在的情况下,具有
metadata.name:redis
和相应的
spec.selector
的服务将使其可用

请注意,您发布的两个部署具有相同的
元数据.标签.app
myapp
,因此您必须将其中一个更改为
myapp redis
,例如,这样服务将针对正确的POD(在该示例中为
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,我强烈建议:只需使用
helm-install-stable/redis
安装它,您就可以使用
redis-master:6379
访问您的redis-master,使用
redis-slave:6379访问任何只读从机。如果您不需要/不想要从站,您可以避免使用从站。只需了解如何使用从站。

因为您没有为redis
pod创建任何服务,您需要(01)pod dns名称或(02)podIP,然后是端口(6379)来连接到它。有关如何获取pod的dns名称,请参阅

您可以使用以下格式获取dns名称
.namespace.pod.cluster.local
,连接uri为
.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 = redis_service_host or pod_host or redis_servce_ip or pod_ip

你能提供你使用的图表模板吗?@ShudiptaSharma更新了我的问题,就是我按照建议尝试的两个。但我仍然得到同样的错误,它无法连接。有没有办法检查另一个redis吊舱与redis吊舱的连接?有一些事情需要知道为什么它没有发生。(01)
redis.conf
,(02)你所说的是什么意思?我是说,你可以进入第二个pod并检查从那里到redis pod的连接,以了解为什么它无法连接?我已经用我使用的图表更新了我的问题,更新了我的ans。检查itI进入我要检查连接的pod内,并执行:
redis cli-h redis
,我能够连接:
redis:6379>
。我似乎无法理解为什么容器会抛出错误,尽管我只安装了主机。但我的第二个吊舱试图连接到redis:6379。我如何配置主机以实现此目的?另外,我想安装一个头盔来安装所有东西(包括redis),这可能吗?太好了
redis master:6379
是默认的“连接字符串/url”,如果您使用上述Helm图表,其中
redis master
是创建的服务的名称。如果您更改了Helm发布名称或有疑问,请通过
kubectl get services
获取服务名称,然后使用适当的url更新连接到Redis的代码。