Я запускаю модуль 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