Почему моя конфигурация службы типа externalName не работает в Kubernetes?

Я создал два пространства имен и службы в каждом пространстве имен:

  • Пространство имен: слой приложения
    • отдых-приложение
    • db-service-externalname
  • Пространство имен: уровень данных
    • db-сервис

Когда я пытаюсь подключиться к базе данных MySQL в службе БД из rest-app, Я получаю сообщение об ошибке:

MySql.Data.MySqlClient.MySqlException (0x80004005): невозможно подключиться к любому из указанных хостов MySQL. ---> System.AggregateException: произошла одна или несколько ошибок. (Название или услуга неизвестны)

Я распечатал в журналах, и он правильно db-service в качестве имени службы и имеет право пользователя / пароль.

Вот что я определил:

db-сервис

apiVersion: v1
kind: Service
metadata:
  name: db-service
  namespace: data-layer
spec:
  selector:
    app: db-service
  ports:
   - port: 3306
  clusterIP: None

db-service-externalname

apiVersion: v1
kind: Service
metadata:
  name: db-service
  namespace: app-layer
spec:
  type: ExternalName
  externalName: db-service.data-layer.service.cluster.local
  ports:
    - port: 3306

отдых-приложение

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rest-app
  namespace: app-layer
  labels:
    app: rest-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rest-app
  template:
    metadata:
      labels:
        app: rest-app
    spec:
      containers:
        - name: rest-app
          image: restapp:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 5000
          env:
            # These are from a secret I defined, and the logs show
            # the rest app gets them correctly
            - name: MYSQL_ROOT_USERNAME
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: db-username
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: db-password
            # I hard-coded this to the externalName I created. 
            # Is that right?
            - name: MYSQL_URL
              value: db-service

Вопросов:

  • Правильно ли я сделал externalName в пространстве имен уровня приложения?
  • Нужно ли мне определять это иначе?
  • Может ли приложение C# в контейнере докера не ссылаться на db-service какое имя у службы externalName?

1 ответ

Решение

Служба типа ExternalName должна быть такой, как показано ниже. Обратите внимание на использование svc вместо service.

apiVersion: v1
kind: Service
metadata:
  name: db-service
  namespace: app-layer
spec:
  type: ExternalName
  externalName: db-service.data-layer.svc.cluster.local
  ports:
    - port: 3306
Другие вопросы по тегам