Jupyter Notebook на Kubernetes не может подключиться к внешнему сервису Docker

Jupyter Notebook на Kubernetes не может подключиться к внешнему сервису Docker

Я запускаю модуль Kubernetes (kubeflow + k8s) с блокнотом Jupyter и службой Docker за пределами сервера Kubernetes. В настоящее время я пытаюсь подключиться к службе SQL, но она постоянно получает ошибку ConnectionResetError. И брандмауэр, и Docker предоставляют необходимый порт, но K8s по-прежнему не может подключиться. В чем может быть проблема? (сообщите мне, если вам нужны дополнительные сведения).

Спасибо.

решение1

Как упоминалось в комментариях

С точки зрения istio, чтобы это работало, вам придется добавитьServiceEntryчтобы внедренные модули istio могли взаимодействовать с внешней базой данных.

ServiceEntry позволяет добавлять дополнительные записи во внутренний реестр служб Istio, чтобы автоматически обнаруженные службы в сетке могли получать доступ/маршрутизировать эти вручную указанные службы. Запись службы описывает свойства службы (имя DNS, VIP, порты, протоколы, конечные точки). Эти службы могут быть внешними по отношению к сетке (например, веб-API) или внутренними службами сетки, которые не являются частью реестра служб платформы (например, набор виртуальных машин, взаимодействующих со службами в Kubernetes). Кроме того, конечные точки записи службы также могут выбираться динамически с помощью поля workloadSelector. Эти конечные точки могут быть рабочими нагрузками виртуальных машин, объявленными с помощью объекта WorkloadEntry или модулей Kubernetes. Возможность выбора как модулей, так и виртуальных машин в рамках одной службы позволяет выполнять миграцию служб из виртуальных машин в Kubernetes без необходимости изменения существующих имен DNS, связанных со службами.

Есть пример в istioдокументация.

Обратите внимание, что вы можете обнаружить,MySQL не может подключиться после установки Istio. Это из-за режима PERMISSIVE, который не работает с MySQL. Вы можете увидеть сообщения об ошибках, такие какERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0.

Есть два варианта решения проблемы.

1.Отключите взаимный TLS.

Выберите этот вариант, если вам не нужен Istio mutual TLS. Это достигается путем явного отключения mutual TLS на службе MySQL.

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: mysql-nomtls-peerauthn
spec:
  selector:
    matchLabels:
      app: <YOUR-MYSQL-SERVICE>     # The label of *your* K8s Service
  mtls:
    mode: DISABLE
EOF

2.Включите взаимный TLS в СТРОГОМ режиме.

Если вам нужна взаимная защита TLS для MySQL, включите взаимную защиту TLS, используя правило назначения и политику аутентификации.

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: mysql-mtls-peerauthn
spec:
  selector:
    matchLabels:
      app: <YOUR-MYSQL-SERVICE>     # The label of *your* K8s Service
  mtls:
    mode: STRICT
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: mysql-mtls-dr
spec:
  host: YOUR-MYSQL-SERVICE     # The name of *your* K8s Service
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
EOF

Связанный контент