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


上次修改时间:2024 年 9 月 9 日:更新 nginx_tcp_udp_ingress.md (ada305243)