I want to expose my Mariadb pod using Nginx ingress TCP service by following this step https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/. Mariadb running in default name space, with mariadb service type as ClusterIP. I am running Nginx Ingress controller in nginx-ingress namespace, also defined tcp-services
cofigmap for mariadb
service. But I am unable to connect MariaDB database from outside of the cluster.
From Nginx controller log I can see its reading tcp-services.
Ingress configuration
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"
Ingress controller nginx config for TCP Service
# 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;
}
when I connect from external server, getting this message:
ERROR 2002 (HY000): Can't connect to MySQL server on
any tips to troubleshoot this issue?
thanks
I was missing my service with TCP Port info, after adding it I was able to access the MySQL with my service Port Number. Thanks for Emanuel Bennici
pointing this one out.
Here is my service:
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
NGINX Ingress Controller comes with two NGINX Ingress resources that support TCP/UDP load balancing: GlobalConfiguration resources are typically used by cluster administrators to specify the TCP/UDP ports ( listeners) that are available for use by DevOps teams.
Also kubectl get deploy -n ingress-nginx to see if the nginx ingress deployment is running. OK so apparently this is a known issue with minikube, Ingress works properly on linux only. The ingress, and ingress-dns addons are currently only supported on Linux. See #7332
Ingress does not support TCP or UDP services. It is also possible to use a number or the name of the port. The two last fields are optional. Since 1.9.13 NGINX provides UDP Load Balancing. If TCP/UDP proxy support is used, then those ports need to be exposed in the Service defined for the Ingress.
Please check if you have opened the MySQL port in the Pod So to open the port on the Kubernetes-Port you have to create a pod like this:
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
Then you have to create a service so you can talk directly to the MySQL Pod through the service:
apiVersion: v1
kind: Service
metadata:
name: svc-mysql
namespace: default
labels:
run: mysql
spec:
ports:
- port: 3306
targetPort: 3306
protocol: TCP
selector:
name: mysql
If the Nginx Ingress Controller is working correctly you can now add the following line to your tcp-services-configmap:
3306: "default/svc-mysql:3306"
Please note that you have to add the MySQL port to the Nginx Ingress Service, like this:
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
Now you can use the external IP of the Nginx Ingress Controller to connect to your MySQL Server.
Please provide more information about your setup in future Questions :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With