![kubernetes 上的 Jupyter 笔记本无法连接到外部 docker 服务](https://linux22.com/image/760912/kubernetes%20%E4%B8%8A%E7%9A%84%20Jupyter%20%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%E5%A4%96%E9%83%A8%20docker%20%E6%9C%8D%E5%8A%A1.png)
我正在运行一个 kubernetes(kubeflow + k8s)pod,里面有一个 jupyter 笔记本和一个 kubernetes 服务器之外的 docker 服务,我目前正试图连接到一个 sql 服务,但它一直出现 ConnectionResetError,防火墙和 docker 都公开了所需的端口,但 k8s 一直无法连接,这可能是什么问题?(如果您需要更多详细信息,请告诉我)。
谢谢。
答案1
正如评论中提到的
从 istio 的角度来看,要实现这一点,你必须添加服务入口因此 istio 注入的 pod 可以与外部数据库对话。
ServiceEntry 允许在 Istio 的内部服务注册表中添加其他条目,以便网格中自动发现的服务可以访问/路由到这些手动指定的服务。服务条目描述服务的属性(DNS 名称、VIP、端口、协议、端点)。这些服务可以是网格外部的(例如,Web API),也可以是平台服务注册表之外的网格内部服务(例如,与 Kubernetes 中的服务通信的一组 VM)。此外,还可以使用工作负载选择器字段动态选择服务条目的端点。这些端点可以是使用 WorkloadEntry 对象或 Kubernetes pod 声明的 VM 工作负载。在单个服务下同时选择 pod 和 VM 的能力允许将服务从 VM 迁移到 Kubernetes,而无需更改与服务关联的现有 DNS 名称。
istio 中有一个例子文档。
请注意,您可能会发现安装 Istio 后 MySQL 无法连接。这是因为 PERMISSIVE 模式不适用于 MySQL。您可能会看到以下错误消息:ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0.
有两种方法可以解决这个问题。
1.禁用相互 TLS。
如果您不想要 Istio 双向 TLS,请选择此选项。您可以通过在 MySQL 服务上明确禁用双向 TLS 来实现这一点。
$ 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. 在 STRICT 模式下启用双向 TLS。
如果您希望 MySQL 具有相互 TLS 保护,请使用目标规则和身份验证策略启用相互 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