如何通过Kubernetes配置实现数据库仅被应用Pod访问?
当然可以!纯Kubernetes配置就能实现数据库仅对内访问
完全不需要额外工具,只靠K8s的原生组件就能搞定这个需求,核心思路是限制数据库Service的暴露范围,再通过**网络策略(NetworkPolicy)**精准控制访问来源,具体步骤如下:
1. 确保数据库Service仅集群内部可见
首先,数据库的Service要使用ClusterIP类型(这其实是K8s Service的默认类型,不过显式声明更稳妥)。这种类型的Service只会在集群内部分配一个虚拟IP,不会通过NodePort或LoadBalancer对外暴露,集群外的请求根本触达不了它。
举个MySQL Service的配置示例:
apiVersion: v1 kind: Service metadata: name: mysql-service namespace: default spec: type: ClusterIP # 显式指定为集群内访问 selector: app: mysql # 匹配你的数据库Deployment标签 ports: - protocol: TCP port: 3306 targetPort: 3306 # 对应数据库Pod的端口
2. 用NetworkPolicy锁定仅应用Pod可访问
光靠ClusterIP还不够——集群内其他无关Pod还是能访问数据库。这时候就需要NetworkPolicy来做精准的访问控制,它相当于K8s集群内部的防火墙,只允许指定来源的流量访问数据库Pod。
下面是一个针对性的NetworkPolicy配置:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: mysql-restrict-access namespace: default spec: podSelector: matchLabels: app: mysql # 要保护的目标:数据库Pod policyTypes: - Ingress # 只控制流入流量 ingress: - from: # 仅允许带有`app: web-app`标签的Pod访问 - podSelector: matchLabels: app: web-app ports: - protocol: TCP port: 3306 # 数据库的服务端口
注意事项
- 你的K8s集群需要支持NetworkPolicy:比如使用Calico、Weave Net或者开启了NetworkPolicy支持的Flannel等CNI插件,部分默认CNI(比如原生Flannel)可能不支持,需要提前确认。
- 应用Pod连接数据库时,直接用数据库Service的名称作为域名即可(K8s内置DNS会自动解析到ClusterIP),比如同命名空间下直接写
mysql-service:3306就行。 - 绝对不要给数据库配置NodePort或LoadBalancer类型的Service,否则会绕开ClusterIP的限制对外暴露。
这样配置完成后,你的数据库就只能被带有指定标签的应用Pod访问,集群内其他Pod和外部请求都无法触达它,完全通过K8s原生配置实现了隔离需求。
内容的提问来源于stack exchange,提问作者aiguy
相关产品推荐
相关产品推荐

