kubernetes 上的 Jupyter 笔记本无法连接到外部 docker 服务

kubernetes 上的 Jupyter 笔记本无法连接到外部 docker 服务

我正在运行一个 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

相关内容