說明
一個基于Spring Boot 3 + Druid + 外部PostgreSQL的Kubernetes Pod YAML詳細解析,包含最佳實踐和關鍵配置說明:
YAML
apiVersion: apps/v1
kind: Deployment
metadata:name: springboot-applabels:app: springboot-app
spec:replicas: 2selector:matchLabels:app: springboot-apptemplate:metadata:labels:app: springboot-appspec:containers:- name: app-containerimage: your-registry/springboot-app:1.0.0imagePullPolicy: IfNotPresentports:- containerPort: 8080name: httpprotocol: TCP# 環境變量配置(敏感信息應通過Secret注入)env:- name: SPRING_DATASOURCE_URLvalue: jdbc:postgresql://external-postgres:5432/mydb- name: SPRING_DATASOURCE_USERNAMEvalueFrom:secretKeyRef:name: db-secretkey: username- name: SPRING_DATASOURCE_PASSWORDvalueFrom:secretKeyRef:name: db-secretkey: password# Druid監控配置(需在應用配置中開啟)- name: SPRING_DATASOURCE_DRUID_STAT_VIEW_SERVLET_ENABLEDvalue: "true"- name: SPRING_DATASOURCE_DRUID_WEB_STAT_FILTER_ENABLEDvalue: "true"# 資源限制resources:requests:memory: "512Mi"cpu: "500m"limits:memory: "1024Mi"cpu: "1000m"# 健康檢查livenessProbe:httpGet:path: /actuator/health/livenessport: 8080initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /actuator/health/readinessport: 8080initialDelaySeconds: 20periodSeconds: 5# 可選:當使用私有鏡像倉庫時添加imagePullSecretsimagePullSecrets:- name: regcred---
# Service暴露(根據需要選擇類型)
apiVersion: v1
kind: Service
metadata:name: springboot-service
spec:type: ClusterIPselector:app: springboot-appports:- name: httpport: 8080targetPort: 8080
關鍵配置解析:
-
Deployment基礎結構
-
replicas: 2
:保證至少兩個Pod實例 -
使用
apps/v1
?API版本(最新穩定版) -
明確的標簽選擇器(
app: springboot-app
)
-
-
容器配置
-
鏡像規范:建議使用具體版本號而非latest
-
端口暴露:明確命名端口(port 8080 → http)
-
環境變量:
-
PostgreSQL連接信息通過Secret注入
-
Druid監控配置通過環境變量開啟
-
JDBC URL指向外部數據庫服務(需確保網絡可達)
-
-
-
Secret集成
# 創建Secret的命令示例 kubectl create secret generic db-secret \--from-literal=username=admin \--from-literal=password='S3cret!'
-
敏感數據與配置分離
-
通過secretKeyRef動態注入
-
-
健康檢查
-
Liveness Probe:檢測應用存活狀態
-
Readiness Probe:檢測服務就緒狀態
-
使用Spring Boot Actuator端點
-
合理的延遲設置(適應應用啟動時間)
-
-
資源限制
-
明確設置請求/限制值
-
防止資源爭用和OOM問題
-
根據實際負載調整數值
-
-
服務暴露
-
ClusterIP類型適合內部訪問
-
需要外部訪問時可使用NodePort或LoadBalancer
-
保持端口命名一致性
-
-
Druid特殊配置
-
需要在應用配置中啟用相關端點:
properties
-
# application.properties spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-password=druid123 spring.datasource.druid.filter.stat.enabled=true
-
建議通過Ingress配置訪問限制
-
-
外部數據庫連接
-
確保Kubernetes集群可以訪問外部PostgreSQL
-
可能需要配置:
-
網絡策略(NetworkPolicy)
-
外部DNS解析
-
SSL連接配置(推薦)
-
-
最佳實踐建議:
-
配置分離
-
將變化頻率不同的配置分層:
-
環境變量 → 頻繁變化配置
-
ConfigMap → 普通配置
-
Secret → 敏感信息
-
-
-
健康檢查優化
livenessProbe:failureThreshold: 3successThreshold: 1 readinessProbe:failureThreshold: 3httpHeaders:- name: Custom-Headervalue: HealthCheck
-
多環境配置
使用Kustomize或Helm管理不同環境的差異化配置 -
連接池優化
-
根據實際負載調整Druid參數:
properties
spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=20
-
-
安全加固
-
添加Pod安全上下文:
securityContext:runAsNonRoot: truerunAsUser: 1000allowPrivilegeEscalation: false
-
-
監控集成
-
暴露Prometheus指標端點
-
配置合適的ServiceMonitor(如使用Prometheus Operator)
-
-
更新策略
strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0
部署步驟:
-
構建Docker鏡像并推送至倉庫
-
創建必要的Secret和ConfigMap
-
應用Deployment和Service配置:
kubectl apply -f deployment.yaml
-
驗證部署狀態:
kubectl get pods -l app=springboot-app kubectl logs -f <pod-name>
注意事項:
-
確保數據庫白名單包含Pod IP范圍
-
生產環境建議使用連接池監控和自動恢復機制
-
定期輪換數據庫憑證(Secret更新策略)
-
考慮使用Service Mesh進行數據庫連接管理
通過以上配置,您可以獲得一個高可用、可監控且安全的Spring Boot應用部署方案,能夠有效管理數據庫連接并與外部PostgreSQL服務穩定通信。