用于 TCP 和 UDP 服务的 Ingress Nginx

如何为 TCP 和 UDP 服务设置 minikube Ingress

概述

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 规范更新发布之前也无法支持。请参阅 此文档,了解有关这些潜在更改的最新信息。


最后修改于 2025 年 5 月 21 日:网站:为 Ingress 教程添加示例 (#20814) (e9f13e56a)