Подключитесь к другому модулю из модуля - PullRequest
0 голосов
/ 11 сентября 2018

По сути, у меня есть Deployment, который создает 3 контейнера, которые автоматически масштабируются: PHP-FPM, NGINX и контейнер, содержащий приложение, все из которых настроены с использованием секретов, сервисов и доступа. Приложение также совместно использует проект между PHP-FPM и NGINX, поэтому все настроено.

Поскольку я хочу больше узнать о K8s, я решил создать модуль с Redis, который также монтирует постоянный диск (но это не важно). Я также создал службу для Redis и все прекрасно работает, если я SSH в контейнере Redis и запустить redis-cli.

Самое интересное, что проект не может подключиться к модулю, на котором включен Redis. Я понимаю, что контейнеры между модулями находятся в одной и той же "локальной" сети, и к ним можно получить доступ, используя localhost.

Как мне подключить мой проект к серверу redis, работающему в другом модуле, который масштабируется независимо? Что не так с сервисом Redis?


Мой сервис Redis такой:

apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis

Мой модуль Redis работает от файла конфигурации развертывания (я не обязательно масштабирую его, но я буду ожидать его):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    app: redis
spec:
  selector:
    matchLabels:
      app: redis
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: redis
    spec:
      volumes:
        - name: redis-persistent-volume
          persistentVolumeClaim:
            claimName: redis-pvc
      containers:
        - image: redis:4.0.11
          command: ['redis-server']
          name: redis
          imagePullPolicy: Always
          resources:
            limits:
              cpu: 250m
              memory: 512Mi
            requests:
              cpu: 250m
              memory: 512Mi
          ports:
            - containerPort: 6379
              name: redis
          volumeMounts:
            - name: redis-persistent-volume
              mountPath: /data

Кроме того, когда я подключаюсь к kubectl get service, сервер Redis имеет IP-адрес кластера:

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        21h
nginx-service   NodePort    10.100.111.16   <none>        80:30312/TCP   21h
redis-service   ClusterIP   10.99.80.141    <none>        6379/TCP       6s

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Действительно, использование имени службы в качестве имени хоста сработало.Я не знал, что DNS Kubernetes также удается сделать это.Я использовал его раньше в Docker Composer, и в своем контейнеризованном приложении я использовал его для подключения к сервисам (т. Е. MySQL, Redis, Elasticsearch).

Чтобы прояснить это, в моем приложении я установилимя хоста к имени сервиса, например redis-service.Если я хочу подключиться к Postgres, я могу использовать pgsql-service или любое другое название этой службы.

СПАСИБО!

0 голосов
/ 11 сентября 2018

Как мне подключить мой проект к серверу redis, работающему в другом модуле, который масштабируется независимо?

У вас есть три возможных состояния:

  • Для подключения к модулю Redis из в пределах любого другого модуля, выполняющего в том же пространстве имен , что и модуль Redis. В этом случае вы будете использовать имя сервиса redis-service и назначать сервисный порт 6379 для доступа к нему через свой текущий ClusterIP (kube-dns делает для вас разрешение DNS). Я предполагаю, что вы просите об этом сценарии.

    • Вот лишь пример доступа к одному модулю из другого модуля (в вашем случае). Первый запуск:

      kubectl run -it --rm test --image=busybox --restart=Never -- sh
      

      это запустит новый тестовый модуль и даст вам sh в этом модуле. Теперь, если вы введете nslookup redis-service там (в тестовом модуле), вы проверите, что DNS работает правильно между модулями. Вы также можете попытаться узнать, открыт ли порт Redis с помощью nc -zv redis-service 6379. Если ваш kube-dns работает правильно, вы должны увидеть, что порт открыт.

  • Для подключения к модулю Redis из в пределах любого другого модуля, работающего в том же кластере kubernetes, но в другом пространстве имен . В этом случае вы будете использовать полное доменное имя, состоящее из имени службы и имени пространства имен, как это указано в документации .

  • Для подключения к Redis pod из за пределами кластера kubernetes. В этом случае вам понадобится какой-нибудь король входа или nodePort с аналогичным механизмом для предоставления сервиса redis для внешнего мира. Подробнее об этом вы можете прочитать в официальной документации .

...