Kubernetes 1.16 Nginx Ingress (0.26.1) TCP Mariadb/MySQL 服务不工作
Kubernetes 1.16 Nginx Ingress (0.26.1) TCP Mariadb/MySQL service not working
我想按照此步骤 https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/ 使用 Nginx 入口 TCP 服务公开我的 Mariadb pod。默认名称 space 中的 Mariadb 运行,mariadb 服务类型为 ClusterIP。我在nginx-ingress namespace中是运行 Nginx Ingress controller,也为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
请检查您是否打开了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服务器。
请在以后的问题中提供有关您的设置的更多信息:)
我想按照此步骤 https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/ 使用 Nginx 入口 TCP 服务公开我的 Mariadb pod。默认名称 space 中的 Mariadb 运行,mariadb 服务类型为 ClusterIP。我在nginx-ingress namespace中是运行 Nginx Ingress controller,也为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
请检查您是否打开了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服务器。
请在以后的问题中提供有关您的设置的更多信息:)