私は、kubernetes サーバーの外部で、jupyter ノートブックと docker サービスを使用して kubernetes (kubeflow + k8s) ポッドを実行しています。現在、sql サービスに接続しようとしていますが、ConnectionResetError が発生し続けます。ファイアウォールと docker の両方が必要なポートを公開していますが、k8s が接続できない状態が続いています。何が問題なのでしょうか? (詳細が必要な場合はお知らせください)。
ありがとう。
答え1
コメントで述べたように
istioの観点からこれを機能させるには、以下を追加する必要がありますサービスエントリそのため、istio が挿入されたポッドは外部データベースと通信できるようになります。
ServiceEntry を使用すると、Istio の内部サービス レジストリにエントリを追加できるため、メッシュ内の自動検出されたサービスがこれらの手動で指定されたサービスにアクセスしたり、ルーティングしたりできます。サービス エントリは、サービスのプロパティ (DNS 名、VIP、ポート、プロトコル、エンドポイント) を記述します。これらのサービスは、メッシュ外部のサービス (Web API など) や、プラットフォームのサービス レジストリの一部ではないメッシュ内部のサービス (Kubernetes 内のサービスと通信する VM のセットなど) である可能性があります。さらに、workloadSelector フィールドを使用して、サービス エントリのエンドポイントを動的に選択することもできます。これらのエンドポイントは、WorkloadEntry オブジェクトを使用して宣言された VM ワークロードまたは Kubernetes ポッドにすることができます。1 つのサービスでポッドと VM の両方を選択できるため、サービスに関連付けられている既存の DNS 名を変更することなく、VM から Kubernetes にサービスを移行できます。
istioに例がありますドキュメンテーション。
注意してくださいIstio をインストールした後、MySQL に接続できないこれは、MySQLでは機能しないPERMISSIVEモードによるものです。次のようなエラーメッセージが表示される場合があります。ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0.
この問題を解決するには 2 つの選択肢があります。
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