Kubernetes 1.16 Nginx入口(0.26.1)TCP Mariadb / MySQL服务无法正常工作

时间:2019-12-09 15:36:01

标签: kubernetes kubernetes-ingress nginx-ingress

我想通过执行此步骤https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/,使用Nginx入口TCP服务公开我的Mariadb pod。 Mariadb在默认名称空间中运行,mariadb服务类型为ClusterIP。我正在nginx-ingress命名空间中运行Nginx Ingress控制器,还为tcp-services服务定义了mariadb 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

ConfigMap:

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

1 个答案:

答案 0 :(得分:0)

请检查您是否已在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 Ingress Controller工作正常,您现在可以在 tcp-services-configmap 中添加以下行:

3306: "default/svc-mysql:3306"

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

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服务器。


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