Как подключить кластер kubernetes к внешней базе данных SQL Server с помощью рабочего стола Docker? - PullRequest
1 голос
/ 13 июня 2019

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

В настоящее время в моем кластере работают два модуля, каждый из которых имеет свой образ, созданный из основных приложений asp.net. Существует совершенно отдельный (за пределами Kubernetes, но работающий локально на моем компьютере localhost, 1433) образ докера, на котором размещена база данных SQL Server. Мне нужны приложения в моих модулях Kubernetes, чтобы иметь возможность обращаться к этой базе данных и манипулировать ею. Я попытался создать файл YAML и настроить различные порты, но я не знаю, как заставить это работать или как проверить, что он действительно работает после его настройки. Мне нужны точные шаги / команды для создания службы, способной маршрутизировать соединение от образов в моем кластере к БД и обратно.

  • Создание Docker SQL Server (рабочий стол с повышенными возможностями PowerShell / Docker):

    docker pull mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -d -p 1433:1433 --name sql -v "c:/Temp/DockerShared:/host_mount" -e SA_PASSWORD="aPasswordPassword" -e ACCEPT_EULA=Y mcr.microsoft.com/mssql/server:2017-latest
    
  • definitions.yaml

    #Pods in the cluster
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-1
      labels:
        app: podnet
        type: module
    spec:
      containers:
       - name: container1
         image: username/image1
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-2
      labels:
        app: podnet
        type: module
    spec:
      containers:
       - name: container2
         image: username/image2
    
    ---
    #Service created in an attempt to contact external SQL Server DB
    apiVersion: v1
    kind: Service
    metadata:
     name: ext-sql-service
    spec:
     ports:
     - port: 1433
       targetPort: 1433
    type: ClusterIP
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
     name: ext-sql-service
    subsets:
     - addresses:
         - ip: (Docker IP for DB Instance)
       ports:
         - port: 1433
    

В идеале я хотел бы, чтобы приложения в моем кластере kubernetes могли манипулировать уже установленным сервером SQL (работающим вне кластера, но локально на моем компьютере).

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Проблема может быть в том, что вы поставили услугу. ClusterIP позволяет вам подключаться между модулями внутри кластера. Чтобы подключиться к внешнему сервису, вам просто нужно изменить определение вида сервиса на NodePort .

Попробуйте изменить определение сервиса:

#Service created in an attempt to contact external SQL Server DB
apiVersion: v1
kind: Service
metadata:
 name: ext-sql-service
spec:
 type: NodePort
 ports:
 - port: 1433
   targetPort: 1433

и выполнить команду:

$ kubectl apply -f your_service_definition_file_name.yaml 

Не забудьте выполнить эту команду в правильном пространстве имен, где настроено ваше развертывание.

Плохая практика - накладывать переменную среды на контейнер. И при «запуске Docker» передайте эту переменную среды VALUE в контейнер.

Конечно, в контексте выполнения команды docker

$ docker run -d -p 1433:1433 --name sql -v "c:/Temp/DockerShared:/host_mount" -e SA_PASSWORD="aPasswordPassword" -e ACCEPT_EULA=Y mcr.microsoft.com/mssql/server:2017-latest

Размещение видимого пароля в БД небезопасно. Используйте секреты Kubernetes.

Более подробную информацию вы можете найти здесь: kubernetes-secret .

0 голосов
/ 13 июня 2019

При запуске из локального докера строка подключения НЕ является вашей локальной машиной.Это локальный «мир» докера, который работает на вашем компьютере.

host.docker.internal: 1433

Выше контейнер докера взаимодействует с вашим локальным компьютером.Очевидно, порт может отличаться в зависимости от того, как вы его выставили.

......

Если вы пытаетесь заставить ваш работающий контейнер общаться с sql-сервером, которыйТАКЖЕ работает в мире докеров, эта строка подключения выглядит следующим образом:

ServerName:

my-mssql-service-deploy-name. $ _ CUSTOMNAMESPACENAME.svc.cluster.local

Там, где $ _CUSTOMNAMESPACENAME, вероятно, "default", но вы, возможно, используете другое пространство имен.

my-mssql-service-deploy-name - это имя ВАШЕГО развертывания (у меня оно здесь указано)

Обратите внимание, что здесь нет номера порта.

Это задокументировано здесь:

https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services

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