Kubernetes - Невозможно соединиться с модулем redis из другого модуля в том же кластере - PullRequest
0 голосов
/ 21 ноября 2018

Не удается установить соединение между модулями в одном кластере.

Из того, что я понимаю, по умолчанию - модули открыты для порта, указанного в файле 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:

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

Iеще не создал ни одного сервиса.Но нужно ли это?К нему будет обращаться другой модуль, который является частью той же схемы рулевого управления.При такой настройке во втором модуле возникают ошибки, которые пытаются получить доступ к redis:

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 через порт 6379?

---- ОБНОВЛЕНИЕ ----

Вот как сейчас выглядят мои графики:

# 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

Примечание : Iя использую миникуб как кластер kubernetes

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Поскольку вы не создали никакой службы для redis pod, вам необходимо (01) имя pod dns или (02) podIP, а затем порт (6379) для подключения к нему.См. dns-pod-service , чтобы узнать, как получить имя DNS для pod.

Вы можете получить имя DNS в этом формате <pod_name>.namespace.pod.cluster.local, а uri соединения - <pod_name>.namespace.pod.cluster.local:6379.

Вы можете получить podIP от .status.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

Обновление:

Однако вы можете проверить соединение redis, используя двоичный файл redis-cli в вашем модуле изкоторый вы хотите проверить соединение.Если у вас есть это redis-cli, тогда запустите $ redis-cli -h <host>, где

host = redis_service_host or pod_host or redis_servce_ip or pod_ip
0 голосов
/ 21 ноября 2018

Вам понадобится Service, чтобы получить доступ к модулю Redis.С вашими текущими ресурсами redis:6379 просто не существует, Сервис с metadata.name: redis и соответствующими spec.selector сделает его доступным.

Имейте в виду, что 2 опубликованных вами развертывания имеют одинаковое значение metadata.labels.appmyapp так что вам нужно изменить один, например, на myapp-redis, чтобы служба нацеливалась на нужные модули (с metadata.name: myapp-redis в этом примере), а не на модули из вашего HTTP-приложения.

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 с redis-master:6379 и любому ведомому только для чтения с redis-slave:6379.Вы можете избежать использования рабов, если они вам не нужны / не нужны, просто пройдите конфигурацию , чтобы узнать как.

...