【问题标题】:Kubernetes 1.16 Nginx Ingress (0.26.1) TCP Mariadb/MySQL service not workingKubernetes 1.16 Nginx Ingress (0.26.1) TCP Mariadb/MySQL 服务不工作
【发布时间】:2020-04-02 17:55:33
【问题描述】:

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

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

入口配置

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。感谢Emanuel Bennici 指出这一点。

这是我的服务:

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

【问题讨论】:

  • 您的 MariaDB 应用程序是否在您的 POD 中运行?如果您使用“telnet”命令测试您的连接,您会得到什么错误?
  • 是的,我可以通过像这样运行客户端 pod kubectl run mariadb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mariadb:10.3.20-debian-9-r19 --namespace default --command -- bash 来连接到 Mysql with-in kuberenets 集群
  • 你的服务器是流的一部分吗?是否能够从外部远程登录到 3306 到您的 nginx 容器?可能是 3306 未在集群上打开,因为通常只允许 80,443
  • @Sham332 不是主机上的端口被阻止
  • 你的集群没有坏掉吗?有一条规则说“所有节点都可以在没有 NAT 的情况下与所有 pod 通信”。如果集群由于 kubeproxy 问题而损坏,如果您尝试从 MASTER 服务器“telnet”到 POD,您将得到“NO ROUTE T​​O HOST”。您能否确认您可以从所有节点访问您的 POD 地址。

标签: kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

请检查您是否在 Pod 中打开了 MySQL 端口 因此,要在 Kubernetes-Port 上打开端口,您必须像这样创建一个 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-configmap

3306: "default/svc-mysql:3306"

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

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 Ingress Controller外部 IP 连接到您的 MySQL 服务器。


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

【讨论】:

  • 谢谢这工作。我唯一的区别是我的集群在本地运行我必须使用服务 NodePort 来访问该服务。让我发布我的服务配置。
  • 我也在本地 K8s 环境中工作,我不喜欢 notePort 功能,因为它将所有请求绑定到该特定节点。为了缓解这种情况,我们使用了MetalLB,因此我们还可以使用Service 种类中的LoadBalancer 等功能。
  • @Emanuel Bennici 您能否检查一下为什么我无法从外部访问我的服务端口?请。谢谢stackoverflow.com/questions/66190275/…
  • @EmanuelBennici 你能检查一下为什么我不能从外面访问我的服务端口吗?请。谢谢stackoverflow.com/questions/66190275/…
猜你喜欢
  • 2021-07-24
  • 2019-05-30
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2019-11-10
  • 2019-05-14
相关资源
最近更新 更多