Проблема с подключением между службами в kubernetes

#docker #kubernetes #google-kubernetes-engine

#docker #kubernetes #google-kubernetes-engine

Вопрос:

У меня есть три разных образа, связанных с моим приложением, которое отлично работает в 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 и службой пользовательского интерфейса также работает нормально, и мои данные переносятся без каких-либо проблем. Но соединение не установлено между службой и пользовательским интерфейсом.

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

Комментарии:

1. Привет, если связь между службами является внутренней, тогда значение должно быть type: ClusterIP больше type: NodePort

2. С какой ошибкой вы столкнулись? можете ли вы выполнить curl для служб?

3. @SureshVishnoi curl не работает нормально. kubectl exec -it dg-ui-586c69fdb8-8wvdn bash root@dg-ui:/home/app/webapp# curl http://dgservice:8080/fieldTypes/metadata curl: (7) Failed to connect to dgservice port 8080: Connection timed out root@dg-ui:/home/app/webapp# command terminated with exit code 137 . Но тот же curl работает нормально, когда я запускаю его с узла dgservice

4. @SureshVishnoi Я тоже пробовал с ClusterIP. все еще это не работает

5. Привет, можешь запустить kubectl describe service dgservice и kubectl get endpoints dgservice

Ответ №1:

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

конечные точки — это объект 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
  

Ответ №2:

Я предполагаю, что под «сервисом» вы имеете в виду свой «dgservice». Я полагаю, что с помощью yaml, представленного выше, вам также необходимо указать DG_SERVICE_PORT (порт 8080) для правильного доступа к «dgservice».

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