【发布时间】: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 TO HOST”。您能否确认您可以从所有节点访问您的 POD 地址。
标签: kubernetes kubernetes-ingress nginx-ingress