[英]Kubernetes — unable to connect to mysql from spring application
我有 kubernetes 集群。 我已經從 kubectl 啟動了 mysql。 我有一個 Spring Boot 應用程序的圖像。 我對要在 application.yml 中使用的 JDBC url 感到困惑。 我通過描述 pod、服務等嘗試了多個 IP 地址。它因“通信鏈接失敗”而出錯
下面是我的mysql-deployment.yml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
#type: NodePort
ports:
- port: 3306
#targetPort: 3306
#nodePort: 31000
selector:
app: mysql
clusterIP: None
---
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
MYSQL_ROOT_PASSWORD: cGFzc3dvcmQ= #password
MYSQL_DATABASE: dGVzdA== #test
MYSQL_USER: dGVzdHVzZXI= #testuser
MYSQL_PASSWORD: dGVzdDEyMw== #test123
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_DATABASE
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_PASSWORD
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
您的 K8S 服務應公開端口和目標端口 3306,並在您的 JDBC URL 中使用該服務的名稱: jdbc:mysql://mysql/database
如果您的 MySQL 是僅用於在 K8S 中運行的應用程序的后端服務,則您不需要服務清單中的 nodePort。
如果您收到SQLException: Connection refused
或Connection timed out
或 MySQL 特定的CommunicationsException: Communications link failure
,則意味着根本無法訪問數據庫。
這可能有以下一種或多種原因:
JDBC URL 中的 IP 地址或主機名錯誤。
本地 DNS 服務器無法識別 JDBC URL 中的主機名。
JDBC URL 中的端口號丟失或錯誤。
數據庫服務器已關閉。
數據庫服務器不接受 TCP/IP 連接。
數據庫服務器的連接用完了。
Java 和 DB 之間的某些東西正在阻止連接,例如防火牆或代理。
我建議執行以下步驟以更好地理解問題:
連接到 MySQL pod 並驗證/etc/mysql/my.cnf
文件的內容
從 pod 內部連接到 MySQL 以驗證它是否有效
從服務清單中刪除clusterIP: None
通過運行以下命令獲取運行 MySQL pod 的節點的 IP 地址:-
kubectl 獲取節點 -o 寬
如果 MySQL 服務暴露為 NodePort 類型,則獲取分配的節點端口:-
kubectl 獲取 svc
在您的 application.properties 中編輯 JDBC URL
節點的 ip 地址:分配給該服務的節點端口
下面是我的 kubectl get svc 輸出
kubectl 獲取 svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
mysql ClusterIP None <none> 3306/TCP 2h
registry NodePort 10.110.33.13 <none> 8761:31881/TCP 7d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.