You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:49:33