用于 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 服务配置映射 (Configmap)
参考关于使用 Ingress Nginx 控制器配置 TCP 和 UDP 服务的教程,我们需要编辑在启用 minikube Ingress 插件时默认安装的配置映射 (configmap)。
有两个配置映射 (configmap),一个用于 TCP 服务,一个用于 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 '^]'
您可以与 Redis 服务进行通信
SET minikube:1 "it works!"
+OK
GET minikube:1
$9
it works!
要退出 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 规范更新发布之前也无法支持。请参阅 此文档,了解有关这些潜在更改的最新信息。