如何从客户端访问使用 Nginx Ingress+Kubernetes 托管的 MySql
Posted
技术标签:
【中文标题】如何从客户端访问使用 Nginx Ingress+Kubernetes 托管的 MySql【英文标题】:How to access MySql hosted with Nginx Ingress+Kubernetes from client 【发布时间】:2018-07-25 01:24:57 【问题描述】:我是 Kubernetes 和 nginx Ingress 工具的新手,现在我正在尝试在 AWS 上的 Nginx Ingress 中使用 VHost 托管 mysql 服务。我创建了一个类似的文件:
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: NodePort
ports:
- port: 3306
protocol: TCP
selector:
app: mysql
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- name: http
containerPort: 3306
protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mysql
labels:
app: mysql
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: mysql.example.com
http:
paths:
- path: /
backend:
serviceName: mysql
servicePort: 3306
我的 LoadBalancer(由 Nginx Ingress 创建)端口配置如下:
80 (TCP) forwarding to 32078 (TCP)
Stickiness options not available for TCP protocols
443 (TCP) forwarding to 31480 (TCP)
Stickiness options not available for TCP protocols
mysql.example.com 指向我的 ELB。
我期待类似的东西,如果尝试类似的东西,我可以从我的本地盒子连接到 MySql:
mysql -h mysql.example.com -u root -P 80 -p
这是行不通的。如果我尝试使用 LoadBalancer 而不是 NodePort,它会为我创建一个按预期工作的新 ELB。
我不确定这是否是我想要在这里实现的正确方法。如果有一种方法可以使用带有 NodePort 的 Ingress 来实现相同的效果,请帮助我。
【问题讨论】:
不知道 Kubernetes,但我猜你已经让 MySQL 端口 3306(默认)可访问。因此,Ingress 必须能够将流量从您选择的任何外部端口路由到 3306。因此,请发布除 80 和 443 之外的另一个端口。 【参考方案1】:Kubernetes Ingress 作为一个通用概念并不能解决暴露/路由 TCP/UDP 服务的问题,如 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md 中所述,如果您希望使用自定义配置映射,则应使用 ingress。请注意,它永远不会使用主机名进行路由,因为这是 HTTP 的特性,而不是 TCP。
【讨论】:
请注意,它永远不会使用主机名进行路由,因为这是 HTTP 而不是 TCP 的功能。我认为这个声明回答了我的问题的原因。【参考方案2】:我使用为数据库集群 IP 创建的入口中指定的主机名,成功通过 ingress-nginx 访问托管在 Google Kubernetes Engine 上的 MariaDB/MySQL。
根据docs,只需创建配置映射并在为 Ingress 定义的 Service 中公开端口。
This 帮助我弄清楚如何设置 --tcp-services-configmap
和 --udp-services-configmap
标志。
【讨论】:
上面的文档链接可以正常工作:kubernetes.github.io/ingress-nginx/user-guide/…以上是关于如何从客户端访问使用 Nginx Ingress+Kubernetes 托管的 MySql的主要内容,如果未能解决你的问题,请参考以下文章
使用nginx-ingress-controller,同时配置http和https访问应用
NGINX Ingress上的客户SubjectName验证