Не удается подключиться к базе данных SQL Server, размещенной на локальном хосте из Kubernetes, как я могу это отладить? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь развернуть приложение asp.net core 2.2 в Kubernetes.Это приложение представляет собой простую веб-страницу, для доступа к которой требуется доступ к базе данных SQL Server.Эта база данных размещена на моем локальном компьютере разработки (localhost), а веб-приложение развернуто в кластере мини-кубов для моделирования производственной среды, в которой мое веб-приложение может быть развернуто в облаке, и доступа к удаленной базе данных.

Мне удалось отобразить свое веб-приложение, открыв порт 80. Однако я не могу понять, как подключить мое веб-приложение к базе данных SQL Server, размещенной на моем локальном компьютере, изнутри кластера.

Я предполагаю, что строка подключения верна, поскольку мое веб-приложение может подключаться к базе данных SQL Server, когда я развертываю ее на локальном сервере IIS, в контейнере Docker (запуск Docker) или службе Docker (служба создания Docker)но не тогда, когда он развернут в кластере Kubernetes.Я понимаю, что кластер находится в другой сети, поэтому я попытался создать службу без селектора, как описано в этот вопрос , но не повезло ... Я даже попытался изменить IP-адрес строки подключения, чтобы он соответствовалодин из созданных сервисов, но тоже не удалось.

Мой брандмауэр настроен на прием входящего соединения с портом 1433.

Моя база данных SQL Server настроена для разрешения удаленного доступа.

Вот строка подключения, которую я использую:

"Server=172.24.144.1\\MyServer,1433;Database=TestWebapp;User Id=user_name;Password=********;"

И вот файл, который я использую для развертывания моего веб-приложения:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: <private_repo_url>/webapp:db
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        - containerPort: 443
        - containerPort: 1433
      imagePullSecrets:
      - name: gitlab-auth
      volumes:
      - name: secrets
        secret:
          secretName: auth-secrets
---
apiVersion: v1
kind: Service
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  type: NodePort
  selector:
    app: webapp  
  ports:
  - name: port-80
    port: 80
    targetPort: 80
    nodePort: 30080
  - name: port-443
    port: 443
    targetPort: 443
    nodePort: 30443
---
apiVersion: v1
kind: Service
metadata:
  name: sql-server
  labels:
    app: webapp
spec:
  ports:
    - name: port-1433
      port: 1433
      targetPort: 1433
---
apiVersion: v1  
kind: Endpoints  
metadata: 
  name: sql-server
  labels:
    app: webapp
subsets: 
  - addresses: 
    - ip: 172.24.144.1 <-- IP of my local computer where SQL Server is running
    ports: 
      - port: 1433

Итак, я получаю развертывание с именем «webapp», содержащее только один модуль, две службы с именем «webapp»и «sql-сервер» и две конечные точки, также называемые «webapp» и «sql-server».Вот их данные:

> kubectl describe svc webapp
Name:                     webapp
Namespace:                default
Labels:                   app=webapp
Annotations:              <none>
Selector:                 app=webapp
Type:                     NodePort
IP:                       10.108.225.112
Port:                     port-80  80/TCP
TargetPort:               80/TCP
NodePort:                 port-80  30080/TCP
Endpoints:                172.17.0.4:80
Port:                     port-443  443/TCP
TargetPort:               443/TCP
NodePort:                 port-443  30443/TCP
Endpoints:                172.17.0.4:443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

> kubectl describe svc sql-server
Name:              sql-server
Namespace:         default
Labels:            app=webapp
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.107.142.32
Port:              port-1433  1433/TCP
TargetPort:        1433/TCP
Endpoints:
Session Affinity:  None
Events:            <none>

> kubectl describe endpoints webapp
Name:         webapp
Namespace:    default
Labels:       app=webapp
Annotations:  <none>
Subsets:
  Addresses:          172.17.0.4
  NotReadyAddresses:  <none>
  Ports:
    Name      Port  Protocol
    ----      ----  --------
    port-443  443   TCP
    port-80   80    TCP

Events:  <none>

> kubectl describe endpoints sql-server
Name:         sql-server
Namespace:    default
Labels:       app=webapp
Annotations:  <none>
Subsets:
  Addresses:          172.24.144.1
  NotReadyAddresses:  <none>
  Ports:
    Name     Port  Protocol
    ----     ----  --------
    <unset>  1433  TCP

Events:  <none>

Я ожидаю подключения к базе данных SQL Server, но когда мое приложение пытается открыть соединение, я получаю эту ошибку:

SqlException:При установке соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром.Сервер не найден или не был доступен.Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений.(провайдер: провайдер TCP, ошибка: 40 - не удалось открыть соединение с SQL Server)

Я новичок в Kubernetes, и мне не очень комфортно работать в сети, поэтому любая помощь приветствуется.Лучшая помощь - дать мне несколько советов / инструментов для отладки, так как я даже не знаю, где или когда попытка подключения заблокирована ...

Спасибо!

1 Ответ

0 голосов
/ 27 декабря 2018

То, что вы считаете IP-адресом вашего хоста, является частным IP-адресом для внутренней сети.Вполне возможно, что этот IP-адрес тот, который ваша машина использует в «реальной» сети, которую вы используете.Виртуальная сеть kubernetes находится в другой подсети, поэтому внутренний IP-адрес недоступен.

subsets: 
  - addresses: 
    - ip: 172.24.144.1 <-- IP of my local computer where SQL Server is running
    ports: 
      - port: 1433

Вы можете подключиться через запись DNS host.docker.internal Чтениеподробнее здесь и здесь для windows

Я не уверен, работает ли это в мини-кубе - раньше использовалось другое DNS-имя для реализаций linux / windows для хоста,

Если вы хотите использовать IP-адрес (имейте в виду, что он со временем изменится), вы, вероятно, можете отследить его и убедиться, что он является "видимым" из виртуальной подсети.

PS: я использую kubernetes, которые теперь работают с докером, кажется, легче работать.

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