用于 TCP 和 UDP 服务的 Ingress nginx
概述
minikube ingress 插件 使开发人员能够将流量从其主机(笔记本电脑、台式机等)路由到在 minikube 集群内运行的 Kubernetes 服务。ingress 插件使用 ingress nginx 控制器,该控制器默认情况下仅配置为侦听端口 80 和 443。可以启用侦听其他端口的 TCP 和 UDP 服务。
先决条件
- 最新的 minikube 二进制文件和 ISO
- Telnet 命令行工具
- Kubectl 命令行工具
- 文本编辑器
使用 nginx ingress 控制器配置 TCP 和 UDP 服务
启用 ingress 插件
使用以下命令启用 minikube ingress 插件
minikube addons enable ingress
更新 TCP 和/或 UDP 服务 configmaps
借鉴关于使用 ingress nginx 控制器配置 TCP 和 UDP 服务的教程,我们将需要编辑启用 minikube ingress 插件时默认安装的 configmap。
有 2 个 configmap,1 个用于 TCP 服务,1 个用于 UDP 服务。默认情况下,它们看起来像这样
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: ingress-nginx
由于这些 configmap 是集中式的,并且可能包含配置,因此最好只修补它们,而不是完全覆盖它们。
让我们以这个 redis 部署为例
redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
namespace: default
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis
imagePullPolicy: Always
name: redis
ports:
- containerPort: 6379
protocol: TCP
创建一个文件redis-deployment.yaml
并粘贴上面的内容。然后使用以下命令安装 redis 部署
kubectl apply -f redis-deployment.yaml
接下来,我们需要创建一个可以将流量路由到我们的 pod 的服务
redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-service
namespace: default
spec:
selector:
app: redis
type: ClusterIP
ports:
- name: tcp-port
port: 6379
targetPort: 6379
protocol: TCP
创建一个文件redis-service.yaml
并粘贴上面的内容。然后使用以下命令安装 redis 服务
kubectl apply -f redis-service.yaml
要将 TCP 服务添加到 nginx ingress 控制器,可以运行以下命令
kubectl patch configmap tcp-services -n ingress-nginx --patch '{"data":{"6379":"default/redis-service:6379"}}'
其中
6379
:你的服务应从 minikube 虚拟机外部侦听的端口default
:安装你的服务的命名空间redis-service
:服务的名称
我们可以使用以下命令验证我们的资源是否已修补
kubectl get configmap tcp-services -n ingress-nginx -o yaml
我们应该看到类似这样的内容
apiVersion: v1
data:
"6379": default/redis-service:6379
kind: ConfigMap
metadata:
creationTimestamp: "2019-10-01T16:19:57Z"
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: tcp-services
namespace: ingress-nginx
resourceVersion: "2857"
selfLink: /api/v1/namespaces/ingress-nginx/configmaps/tcp-services
uid: 4f7fac22-e467-11e9-b543-080027057910
你唯一需要验证的值是 data
属性下是否存在一个值,如下所示
"6379": default/redis-service:6379
修补 ingress-nginx-controller
要从外部集群获得连接,必须完成最后一步。我们需要修补我们的 nginx 控制器,以便它正在侦听端口 6379,并且可以将流量路由到你的服务。为此,我们需要创建一个修补程序文件。
ingress-nginx-controller-patch.yaml
spec:
template:
spec:
containers:
- name: controller
ports:
- containerPort: 6379
hostPort: 6379
创建一个名为 ingress-nginx-controller-patch.yaml
的文件,并粘贴上面的内容。
接下来,使用以下命令应用更改
kubectl patch deployment ingress-nginx-controller --patch "$(cat ingress-nginx-controller-patch.yaml)" -n ingress-nginx
测试你的连接
使用以下命令通过 telnet 测试是否可以访问你的服务
telnet $(minikube ip) 6379
你应看到以下输出
Trying 192.168.99.179...
Connected to 192.168.99.179.
Escape character is '^]'
要退出 telnet,请同时按 Ctrl
键和 ]
。然后键入 quit
并按 Enter。
如果您无法连接,请检查您上面的步骤。
回顾
在上面的例子中,我们做了以下操作
- 在
default
命名空间中创建了一个 redis 部署和服务 - 在
ingress-nginx
命名空间中修补了tcp-services
configmap - 在
ingress-nginx
命名空间中修补了ingress-nginx-controller
部署 - 通过端口 6379 从主机连接到我们的服务
如果您有使用 UDP 和/或 TCP 的服务,您可以将应用于 tcp-services
的相同步骤应用于 udp-services
configmap。
注意事项
除了端口 80 和 443 之外,每个 minikube 实例只能配置一个服务来监听任何特定端口。不支持在同一个 minikube 实例中多个 TCP 和/或 UDP 服务监听同一个端口,并且在发布 ingress 规范的更新之前无法支持。有关这些潜在更改的最新信息,请参阅此文档。