我在kubernetes 伺服器外部運行一個帶有jupyter 筆記本和docker 服務的kubernetes (kubeflow + k8s) pod,我目前正在嘗試連接到sql 服務,但它不斷收到ConnectionResetError,防火牆和docker 都暴露了所需的端口,但k8s一直無法連接,可能是什麼問題? (如果您需要更多詳細資訊請告訴我)。
謝謝。
答案1
正如評論中所提到的
從 istio 的角度來看,要使這項工作有效,您必須添加服務入口因此 Istio 注入的 Pod 可以與外部資料庫通訊。
ServiceEntry 允許在 Istio 的內部服務註冊表中新增額外的條目,以便在網格中自動發現的服務可以存取/路由到這些手動指定的服務。服務條目描述服務的屬性(DNS 名稱、VIP、連接埠、協定、端點)。這些服務可以是網格外部的(例如,Web API),也可以是不屬於平台服務註冊表一部分的網格內部服務(例如,與 Kubernetes 中的服務通訊的一組虛擬機器)。此外,也可以使用workloadSelector欄位動態選擇服務條目的端點。這些端點可以是使用 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