Вот мой образ докера

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine3.8 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY ./xyz/publish .
ENV ASPNETCORE_URLS=https://+:443;http://+80
ENTRYPOINT ["dotnet","abc/xyz.dll"]

Вот мой файл Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xyzdemo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      papi: web
  template:
    metadata:
      labels:
        papi: web
    spec:
      containers:
      - name: xyzdemo-site
        image: xyz.azurecr.io/abc:31018
        ports:
        - containerPort: 443
      imagePullSecrets:
      - name: secret
---
apiVersion: v1
kind: Service
metadata:
  name: xyzdemo-entrypoint
  namespace: default
spec:
  type: LoadBalancer
  selector:
    papi: web
  ports:
  - port: 44328
    targetPort: 443

Вот мой файл настроек приложения

 "Server": "xyz.database.windows.net",
  "Database": "pp",
  "User": "ita",
  "Password": "password",

Используя все это, я развернул приложение в кластере k8s и могу открыть приложение из браузера, однако, когда я пытаюсь получить информацию из базы данных, приложение через некоторое время получает ошибку, связанную с сетью.

System.Data.SqlClient.SqlException (0x80131904): при установке соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром.

Я попытался зайти внутрь POD и выполнил команду ls, я вижу свой файл настроек приложения, а также, когда Cat настройки приложения, я вижу правильные учетные данные, и я не знаю, что делать, и не уверен, почему не могу подключиться в базу данных.

Итак, наконец, я попытался добавить соединения sql в качестве переменных env в модуль, после чего он начал работать. когда я удаляю те, которые не подключаются.

Теперь я удалил переменные env, которые имеют соединения sql, а затем сделал журнал на модуле.
он говорит, что не может подключиться к базе данных: «Пусто» и сервер: «Пусто» не уверен, почему он берет пустое, когда у него есть детали внутри файла applicationsettings.json.

0
sumanth d 10 Дек 2019 в 22:56

2 ответа

Я подозреваю, что для этого нужно разрешить соединения на брандмауэре SQL Azure. Использование портала было бы самым простым способом. Вы можете просто allow all или allow Azure services для начала (при условии, что ваши Kubernetes находятся внутри Azure). И сузить это позже (если это виновник).

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-firewall-configure#use-the-azure-portal-to-manage-server-level-ip-firewall-rules

0
4c74356b41 11 Дек 2019 в 08:38
Спасибо за ответ, но я исправил кое-что в своем файле докеров. Я установил рабочий каталог в app / abc, и он начал работать.
 – 
sumanth d
11 Дек 2019 в 19:09
Если вам удалось его решить, можете ли вы опубликовать его в качестве ответа для большей наглядности? Это может быть полезно для других пользователей.
 – 
Mariusz K.
12 Дек 2019 в 15:55

Ну, я не вижу, что такое конфигурация для вашего приложения K8 для подключения к базе данных. Важно, где находится ваша база данных? Как можно papi:web подключиться к базе данных?

Я также подозреваю, что ваша служба не имеет соответствующего перенаправления порта. Из вашего service.yaml выше, https порт 443 внутренне сопоставлен с 44328. Что такое 44328? Что слушает на этом порту? Похоже, в вашем приложении нет упоминания о 44328.

Я бы импровизировал ваш service.yaml, чтобы он выглядел примерно так:

apiVersion: v1
kind: Service
metadata:
  name: xyzdemo-entrypoint
  namespace: default //This is inferred anyways
spec:
  selector:
    papi: web
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: xxxx //Where your web-server is listening. (From your dockerfile, this is also 80 but it can be any valid TCP port)
    - name: https
      protocol: TCP
      port: 443
      targetPort: xxxx //https for your web-server. (From your dockerfile, this is also 443. Again, can be any TCP port)

Открытие сервера базы данных в Интернете не является хорошей практикой. Это большая угроза безопасности. Хорошим примером является упрощение взаимодействия вашего веб-сервера с сервером базы данных через внутренние DNS, которые поддерживает k8 (Предполагается, что ваш сервер базы данных также является контейнером - что-то вроде kubedb. Если нет, ваш сервер базы данных должен быть доступен через своего рода прокси, списки известных хостов и позволяет только хосты , например, - . cloudsql прокси в GCP ) .

В зависимости от того, как размещен ваш сервер базы данных, вам придется настроить конфигурацию базы данных, чтобы разрешить или внести в белый список ваше приложение в контейнере (IP-адрес, который вы получите после применения service.yaml). Только тогда приложение вашего k8 сможет говорить / достигать. подключение к соответствующей БД .

0
Pruthvi Kumar 11 Дек 2019 в 02:39