在Azure Kubernetes Service中暴露MySQL数据库Pod至外部网络的技术咨询
你好!问题出在你当前的Service配置上——你用的是ClusterIP类型的Service,这种类型的Service仅允许集群内部的Pod或节点访问,外部客户端(比如MySQL Workbench)没法直接连接。要让外部能访问你的MySQL实例,需要把Service类型改成LoadBalancer或者NodePort,在AKS环境里推荐用LoadBalancer,因为它会自动创建Azure公共负载均衡器并分配公网IP,配置更简便。
解决方案步骤:
修改Service的类型为LoadBalancer
把你现有的Service YAML里的spec.type从ClusterIP改成LoadBalancer,同时建议显式指定targetPort(和容器端口保持一致,避免歧义)。修改后的Service配置如下:apiVersion: v1 kind: Service metadata: name: mysql-db-testing-service namespace: testing spec: type: LoadBalancer ports: - port: 3306 targetPort: 3306 # 和容器的containerPort对应 protocol: TCP selector: app: mysql-db-testing另外,为了安全,你可以添加
loadBalancerSourceRanges字段,只允许特定IP段访问你的数据库,比如:spec: # ... 其他配置 loadBalancerSourceRanges: - "192.168.1.1/32" # 替换成你自己的公网IP,限制仅该IP能访问应用更新后的配置
用kubectl命令重新应用修改后的YAML文件:kubectl apply -f your-updated-yaml-file.yaml -n testing获取外部访问地址
执行以下命令查看Service的状态,等EXTERNAL-IP列从<pending>变成一个公网IP:kubectl get svc mysql-db-testing-service -n testing输出大概像这样:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql-db-testing-service LoadBalancer 10.0.0.123 20.xx.xx.xx 3306:30xxx/TCP 5m配置Azure网络安全组(NSG)
AKS会自动为LoadBalancer配置NSG规则,但如果你的节点池NSG有严格限制,需要确保允许3306端口的入站流量(或者你在Service里指定的NodePort端口,如果用NodePort类型的话)。测试外部连接
现在你可以用MySQL Workbench或者其他客户端,填写以下信息连接:- Host: 上面获取的
EXTERNAL-IP - Port: 3306
- Username: root
- Password: test12345(你在Deployment里设置的密码)
- Host: 上面获取的
重要安全提醒:
- 不要明文存储密码:你当前在Deployment里直接写了
MYSQL_ROOT_PASSWORD的明文值,这非常不安全。建议用Kubernetes Secret存储密码,创建命令如下:
然后修改Deployment的env部分,从Secret读取密码:kubectl create secret generic mysql-root-secret -n testing --from-literal=MYSQL_ROOT_PASSWORD=test12345env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-root-secret key: MYSQL_ROOT_PASSWORD - 限制访问源:一定要用
loadBalancerSourceRanges限制仅信任的IP能访问数据库,避免全网暴露带来的安全风险。 - MySQL绑定地址:官方MySQL镜像默认已经设置
bind-address=0.0.0.0(允许所有地址访问),如果你有自定义配置文件,要确保不要改成仅本地访问的地址。
备注:内容来源于stack exchange,提问作者Krzysztof Michalski

