首页 > 解决方案 > 通过 eks 中的 nginx 入口访问 MySQL 端点时出错

问题描述

我在 aws eks 上有 3 个节点。

我想使用 mysql 客户端并通过 Nginx Ingress 访问数据库。

这是我的 yaml。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: ext-nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ext-nginx-ingress
  namespace: ext-nginx-ingress
spec:
  rules:
    - host: mysql.***********.com
      http:
        paths:
          - backend:
              serviceName: mysql-svc
              servicePort: 3306
            path: /
            pathType: ImplementationSpecific
          - backend:
              serviceName: nginx-svc
              servicePort: 80
            path: /nginx
            pathType: ImplementationSpecific

描述我的入口服务

tes.io/name=ingress-nginx
Type:                     LoadBalancer
IP:                       172.20.209.228
LoadBalancer Ingress:     ************.elb.ap-northeast-2.amazonaws.com
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  31218/TCP
Endpoints:                10.11.53.243:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  31308/TCP
Endpoints:                10.11.53.243:443
Port:                     proxie-tcp-mysql  3306/TCP
TargetPort:               mysql/TCP
NodePort:                 proxie-tcp-mysql  32514/TCP
Endpoints:                
Session Affinity:         None
External Traffic Policy:  Cluster

配置图

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ext-nginx-ingress
data:
  3306: ext-nginx-ingress/mysql-svc:3306

可通过 telnet 80 端口访问,但不能通过 mysql 客户端访问。

telnet mysql.*****.com 80                          
Trying 3.******...
Connected to mysql.******.com.

在与 nlb 关联的目标组中,与 3306 端口关联的节点端口处于不健康状态。

Port:                     proxie-tcp-mysql  3306/TCP
TargetPort:               mysql/TCP
NodePort:                 proxie-tcp-mysql  32514/TCP

感谢您的阅读。MYSQL Pod 和 Service 创建良好的端点。

标签: mysqlkubernetesamazon-eksnginx-ingress

解决方案


我想使用 mysql 客户端并通过 Nginx Ingress 访问数据库。

你不能。Nginx 是一个 HTTP 服务器,但 MySQL 通过 TCP 使用自己的二进制协议。

通常,您根本不希望您的数据库在集群之外发布,因为任何可以访问数据库的人都可以绕过应用程序中的所有检查和限制。为数据库设置一个 ClusterIP 服务,如果你确实需要作为操作员连接到它,使用kubectl port-forward它来连接它。

如果确实需要在集群外发布,则需要使用 NodePort 或 LoadBalancer 服务。由于它不是 HTTP 服务,因此不能使用 Kubernetes 入口系统。


推荐阅读