Kubernetes 内部服务转发配置
Kubernetes 内部服务转发配置 (MySQL 跨命名空间访问)
要在 cbp-test 命名空间下的应用访问 cbp-db 命名空间中的 MySQL 服务,你可以使用以下几种方法。我将为你提供最常用的几种解决方案的 YAML 配置。
方法1: 使用 Service 直接跨命名空间访问
这是最简单的方法,只需确保 MySQL 服务在 cbp-db 命名空间中已正确暴露。
# 在 cbp-test 命名空间中的应用可以直接使用以下服务名访问 MySQL:
# mysql.cbp-db.svc.cluster.local# 例如在应用配置中连接字符串可以是:
# jdbc:mysql://mysql.cbp-db.svc.cluster.local:3306/your_database
不需要额外配置,Kubernetes 内置的 DNS 服务会自动解析跨命名空间的服务。
方法2: 创建 NetworkPolicy (如果集群支持)
如果需要更精细的网络控制,可以创建 NetworkPolicy:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-mysql-accessnamespace: cbp-test
spec:podSelector:matchLabels:app: your-app-label # 替换为你的应用标签policyTypes:- Egressegress:- to:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: cbp-dbpodSelector:matchLabels:app: mysql # 替换为MySQL的实际标签ports:- protocol: TCPport: 3306
方法3: 创建 Service 导入 (ServiceImport) - 适用于多集群场景
如果使用的是服务网格或需要更复杂的路由,可以考虑 ServiceImport (需要集群支持):
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: mysql-cbp-dbnamespace: cbp-test
spec:hosts:- mysql.cbp-db.svc.cluster.localports:- number: 3306name: mysqlprotocol: TCPresolution: DNSlocation: MESH_INTERNAL
方法4: 创建 Endpoints 和 Service (手动方式)
如果自动服务发现有问题,可以手动创建:
# 首先在 cbp-test 命名空间创建 endpoints
apiVersion: v1
kind: Endpoints
metadata:name: mysql-cbp-dbnamespace: cbp-test
subsets:
- addresses:- ip: <mysql-pod-ip> # 替换为实际MySQL Pod IPports:- port: 3306
---
# 然后创建无selector的service
apiVersion: v1
kind: Service
metadata:name: mysql-cbp-dbnamespace: cbp-test
spec:ports:- port: 3306targetPort: 3306
最佳实践建议
最简单方法:直接在应用中使用完整DNS名称 mysql.cbp-db.svc.cluster.local:3306
如果需要更简洁的连接字符串,可以在 cbp-test 命名空间创建一个别名服务:
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: cbp-test
spec:type: ExternalNameexternalName: mysql.cbp-db.svc.cluster.localports:- port: 3306
这样你的应用可以直接连接 mysql:3306,Kubernetes 会自动解析到正确的端点。
选择哪种方法取决于你的具体需求和集群配置。第一种方法通常是最简单直接的解决方案。