Проблема соединения между сервисами в kubernetes - PullRequest
0 голосов
/ 26 марта 2019

У меня есть три разных изображения, связанных с моим приложением, которое отлично работает в docker-compose и имеет проблемы с работой в кластере kubernetes в GCP.

Ниже приведен файл развертывания.

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql-database
spec:
  type: NodePort
  ports:
    - port: 3306
      targetPort: 3306      
  selector:
    app: mysql-database
    tier: database
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql-database
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql-database
        tier: database
    spec:
      hostname: mysql
      containers:
        - image: mysql/mysql-server:5.7
          name: mysql
          env:
            - name: "MYSQL_USER"
              value: "root"
            - name: "MYSQL_HOST"
              value: "mysql"
            - name: "MYSQL_DATABASE"
              value: "xxxx"
            - name: "MYSQL_PORT"
              value: "3306"
            - name: "MYSQL_PASSWORD"
              value: "password"
            - name: "MYSQL_ROOT_PASSWORD"
              value: "password"
            - name: "RAILS_ENV"
              value: "production"
          ports:
            - containerPort: 5432
              name: db
---
apiVersion: v1
kind: Service
metadata:
  name: dgservice
  labels:
    app: dgservice
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    name: dgservice
    tier: dgservice
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dgservice
  labels:
    app: dgservice
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: dgservice
        tier: dgservice
    spec:
      hostname: dgservice
      containers:
        - image: gcr.io/sample/sample-image:check_1
          name: dgservice
          ports:
            - containerPort: 8080
              name: dgservice
---
apiVersion: v1
kind: Service
metadata:
  name: dg-ui
  labels:
    name: dg-ui
spec:
  type: NodePort
  ports:
    - nodePort: 30156 
      port: 8000
      protocol: TCP
      targetPort: 8000
  selector:
    app: dg-ui
    tier: dg
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dg-ui
  labels:
    app: dg-ui
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: dg-ui
        tier: dg
    spec:
      hostname: dg-ui
      containers:
        - image: gcr.io/sample/sample:latest
          name: dg-ui
          env:
            - name: "MYSQL_USER"
              value: "root"
            - name: "MYSQL_HOST"
              value: "mysql"
            - name: "MYSQL_DATABASE"
              value: "xxxx"
            - name: "MYSQL_PORT"
              value: "3306"
            - name: "MYSQL_PASSWORD"
              value: "password"
            - name: "MYSQL_ROOT_PASSWORD"
              value: "password"
            - name: "RAILS_ENV"
              value: "production"
            - name: "DG_SERVICE_HOST"
              value: "dgservice"
          ports:
            - containerPort: 8000
              name: dg-ui

Изображение также успешно извлекается из GCR.

Соединение между MySQL и UI-сервисом также работает нормально, и мои данные переносятся без проблем.Но связь между сервисом и пользовательским интерфейсом не установлена.

Почему пользовательский интерфейс не может получить доступ к службе в моем приложении?

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Поскольку в вашем развертывании есть следующие метки, сервису необходимо иметь одинаковые метки для создания объекта конечной точки

конечные точки являются объектами API, стоящими за службой. Конечные точки - это то место, куда служба направляет соединения, когда устанавливается соединение с ClusterIP службы

Ниже приведены метки развертываний

      labels:
        app: dgservice
        tier: dgservice

Новое определение сервиса с правильными метками

apiVersion: v1
kind: Service
metadata:
  name: dgservice
  labels:
    app: dgservice
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: dgservice
    tier: dgservice
0 голосов
/ 26 марта 2019

Я предполагаю, что под "service" вы ссылаетесь на "dgservice".С yaml, представленным выше, я полагаю, что вам также нужно указать DG_SERVICE_PORT (порт 8080) для правильного доступа к "dgservice".

Как упомянуто Сурешем в комментариях, вы должны предоставлять внутренние сервисы, используя ClusterIP тип.NodePort - это расширенный набор ClusterIP, который будет предоставлять службу внутри вашего кластера на service-name:port, а внешнюю на node-ip:nodeport, ориентируясь на ваше развертывание / модуль на targetport.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...