当前位置: 首页 > 知识库问答 >
问题:

Kubernetes 1.16 Nginx入口(0.26.1)TCP Mariadb/MySQL服务不工作

司英彦
2023-03-14

我想通过以下步骤使用Nginx入口TCP服务公开我的Mariadb podhttps://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/.Mariadb在默认名称空间中运行,Mariadb服务类型为ClusterIP。我正在Nginx Ingress命名空间中运行Nginx Ingress controller,该命名空间还定义了tcp服务cofigmap formariadb服务。但我无法从集群外部连接MariaDB数据库。

从Nginx控制器日志中,我可以看到它正在读取tcp服务。

入口配置

containers:
      - args:
        - /nginx-ingress-controller
        - --default-backend-service=nginx-ingress/nginx-ingress-default-backend
        - --election-id=ingress-controller-leader
        - --ingress-class=nginx
        - --configmap=nginx-ingress/nginx-ingress-controller
        - --default-ssl-certificate=nginx-ingress/ingress-tls
        - --tcp-services-configmap=nginx-ingress/tcp-services
        - --udp-services-configmap=nginx-ingress/udp-services

配置映射:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: nginx-ingress
data:
  3306: "default/mariadb:3306"

TCP服务的入口控制器nginx配置

 # TCP services

        server {
                preread_by_lua_block {
                        ngx.var.proxy_upstream_name="tcp-default-mariadb-3306";
                }

                listen                  3306;

                proxy_timeout           600s;
                proxy_pass              upstream_balancer;

        }

当我从外部服务器连接,得到这个消息:

ERROR 2002 (HY000): Can't connect to MySQL server on 

有解决此问题的提示吗?

谢谢

我丢失了带有TCP端口信息的服务,添加后,我可以使用我的服务端口号访问MySQL。感谢伊曼纽尔·本尼奇指出这一点。

这是我的服务:

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-controller  
spec:
  externalTrafficPolicy: Cluster
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: http
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  - name: 3066-tcp
    port: 3066
    protocol: TCP
    targetPort: 3066-tcp
  selector:
    app: nginx-ingress
    component: controller
    release: nginx-ingress
  sessionAffinity: None
  type: NodePort

共有1个答案

丌官昊天
2023-03-14

请检查是否已在Pod中打开MySQL端口,因此要打开Kubernetes端口上的端口,必须创建如下Pod:

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  namespace: default
  labels:
    name: mysql
spec:
  containers:
  - name: mysql
    image: docker.io/bitnami/mariadb:10.3.20-debian-9-r19
    ports:
    - containerPort: 3306
      protocol: TCP

然后,您必须创建一个服务,以便您可以通过该服务直接与MySQL Pod对话:

apiVersion: v1
kind: Service
metadata:
  name: svc-mysql
  namespace: default
  labels:
    run: mysql
spec:
  ports:
  - port: 3306
    targetPort: 3306
    protocol: TCP
  selector:
    name: mysql

如果Nginx入口控制器工作正常,您现在可以将以下行添加到您的tcp-services-confimap:

3306: "default/svc-mysql:3306"

请注意,您必须将MySQL端口添加到Nginx入口服务,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: nginx-ingress
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
    - name: proxie-tcp-mysql
      port: 3306
      targetPort: 3306
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

现在,您可以使用Nginx入口控制器的外部IP连接到MySQL Server。

请在以后的问题中提供有关设置的更多信息:)

 类似资料:
  • 检测到问题! 如果没有配置的空闲端口,MySQL将无法启动!您需要卸载/禁用/重新配置阻塞应用程序,或者重新配置MySQL和控制面板以在不同的端口上侦听

  • 我试图通过GKE部署应用程序。到目前为止,我为应用程序的前端和后端创建了两个服务和两个部署。我使用“gce”控制器创建了一个ingress ressource,并映射了服务,如图所示 它几乎工作得很好(不是所有映射正确的根,但它工作得很好)。我在代码上添加了修改(只有应用程序的代码),我重建了图像并重新创建了服务,但入口似乎对我添加的修改和 我所有的服务都处于不健康状态 这是前台服务 当我描述时,

  • 来自服务器的错误(InternalError):创建“stdin”时出错:发生内部错误:调用webhook“validate.nginx.ingress.kubernetes.io”失败:Post https://ingress-nginx-controller-crission.ingress-nginx.svc:443/extensions/v1beta1/ingress?timeout=30

  • 在AWS EKS上,我有ALB入口控制器,入口资源指向端口32509上的NodePort服务,目标端口80,服务上有。 在这种情况下,外部流量如何在NodePort服务下路由到我的pod? 类似于,ALB

  • 我在pod上部署了SAS Viya编程。这使SASStudio在端口80上运行。我正在尝试通过下面的yaml文件使用nodeport和Inete公开SAS Studio。但在GCP控制台中,后端服务显示不健康,如果我尝试访问Ip,它会遇到默认后端或找不到页面。我可以使用集群IP和节点IP以及端口号访问服务。 如果我使用LoadBalancer服务而不是入口,那么我可以使用LoadBalancer

  • 问题内容: 像包,并允许一个与本地或远程数据库服务器连接。我创建一个便携式项目,该项目涉及的情况下导入SQL数据(或设备)不总是可以访问正在运行的服务器,但 你 总是可以访问数据库的最新.SQL转储。 目标似乎很简单:在不涉及MySQL服务器的情况下将.sql转储导入R。 更具体地说,我想创建一个列表列表,其中的元素与.sql转储中定义的任何数据库相对应(可能有多个),而这些元素又由这些数据库中的