当前位置: 首页 > 知识库问答 >
问题:

在K8s上使用单个LoadBalancer公开多个TCP/UDP服务

仲霍英
2023-03-14
    null

共有1个答案

咸浩初
2023-03-14

实际上可以使用NGINX Ingress来实现。

入口不支持TCP或UDP服务。为此,此入口控制器使用标志--TCP-Services-ConfigMap--UDP-Services-ConfigMap来指向现有的配置映射,其中键是要使用的外部端口,值指示要公开的服务,其格式为: : :[PROXY]:[PROXY]

本指南描述了如何使用minikube实现这一点,但在内部kubernetes上实现这一点是不同的,需要更多的步骤。

缺少文档来描述如何在非MiniKube系统上完成,这就是为什么我决定在这里进行所有的步骤。本指南假设您有一个未安装NGINX Ingress的新集群。

我使用的是一个GKE集群,所有命令都是从我的Linux工作站运行的。它也可以在裸机K8S集群上完成。

创建示例应用程序和服务

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
---
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
---      
apiVersion: v1
kind: Service
metadata:
  name: redis-service2
  namespace: default
spec:
  selector:
    app: redis
  type: ClusterIP
  ports:
    - name: tcp-port
      port: 6380
      targetPort: 6379
      protocol: TCP      
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

在Kube-System命名空间上安装NGINX Ingress:

$ helm install -n kube-system ingress-nginx ingress-nginx/ingress-nginx

正在准备新的NGINX Ingress Controller部署

我们必须在spec.template.spec.containers.args下添加以下行:

        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
$ kubectl edit deployments -n kube-system ingress-nginx-controller
...
    spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --publish-service=kube-system/ingress-nginx-controller
        - --election-id=ingress-controller-leader
        - --ingress-class=nginx
        - --configmap=kube-system/ingress-nginx-controller
        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
...
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: kube-system
apiVersion: v1
kind: ConfigMap
metadata:
  name: udp-services
  namespace: kube-system
$ kubectl patch configmap tcp-services -n kube-system --patch '{"data":{"6379":"default/redis-service:6379"}}'
$ kubectl patch configmap tcp-services -n kube-system --patch '{"data":{"6380":"default/redis-service2:6380"}}'
  • 6379:您的服务应该从minikube虚拟机外部侦听的端口
  • 默认:您的服务安装在其中的命名空间
  • redis-service:服务的名称

我们可以使用以下命令验证资源是否已修补:

$ kubectl get configmap tcp-services -n kube-system -o yaml

apiVersion: v1
data:
  "6379": default/redis-service:6379
  "6380": default/redis-service2:6380
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"name":"tcp-services","namespace":"kube-system"}}
  creationTimestamp: "2020-04-27T14:40:41Z"
  name: tcp-services
  namespace: kube-system
  resourceVersion: "7437"
  selfLink: /api/v1/namespaces/kube-system/configmaps/tcp-services
  uid: 11b01605-8895-11ea-b40b-42010a9a0050

您需要验证的唯一值是data属性下有一个值,该值如下所示:

  "6379": default/redis-service:6379
  "6380": default/redis-service2:6380
spec:
  template:
    spec:
      containers:
      - name: controller
        ports:
         - containerPort: 6379
           hostPort: 6379
         - containerPort: 6380
           hostPort: 6380 
$ kubectl patch deployment ingress-nginx-controller -n kube-system --patch "$(cat nginx-ingress-controller-patch.yaml)"

与为minikube提供的解决方案不同,我们必须为NGINX Ingress Controller服务打补丁,因为它负责公开这些端口。

spec:
  ports:
  - nodePort: 31100
    port: 6379
    name: redis
  - nodePort: 31101
    port: 6380
    name: redis2

创建一个名为nginx-ingress-svc-controller-patch.yaml的文件,并粘贴上面的内容。

接下来,使用以下命令应用更改:

$ kubectl patch service ingress-nginx-controller -n kube-system --patch "$(cat nginx-ingress-svc-controller-patch.yaml)"
$ kubectl get service -n kube-system ingress-nginx-controller
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                                                    AGE
ingress-nginx-controller   LoadBalancer   10.15.251.203   34.89.108.48   6379:31100/TCP,6380:31101/TCP,80:30752/TCP,443:30268/TCP   38m
$ telnet 34.89.108.48 6379
Trying 34.89.108.48...
Connected to 34.89.108.48.
Escape character is '^]'.

我们还可以测试端口6380:

$ telnet 34.89.108.48 6380
Trying 34.89.108.48...
Connected to 34.89.108.48.
Escape character is '^]'.

如果您无法连接,请查看上面的步骤。

相关文章

    null
 类似资料:
  • 什么是port和targetport? 是否为每个代理设置LoadBalancer服务? 这些多个代理是否映射到cloud LB的单个公共IP地址? K8S/Cloud之外的服务如何访问单个代理?通过使用?或者使用?。还有,这里用的是哪个端口?还是? 如何在Kafka Broker的属性中指定此配置?对于k8s集群内部和外部的服务,As端口可能不同。 请帮忙。

  • 我正在尝试建立一个多集群部署,其中有多个集群,一个入口正在负载平衡它们之间的请求。 这是我所说的正式文件。

  • 我刚刚在我的kubernetes集群上部署了graylog。 我需要能够公开udp端口作为入口规则,在graylog下。本地主机/gelf。目前,我的服务包括: 我的服务如下: 我的入口控制器是traefik。

  • 我有多个运行RDP应用程序的部署,它们都是通过ClusterIP服务公开的。我的k8s群集中有nginx ingress controller,为了允许tcp,我在nginx ingress controller部署中添加了tcp services configmap标志,并为其创建了configmap,如下所示 这将公开“rdp-service1”服务。我还有10个这样的服务需要在相同的端口号上

  • 我正在尝试公开公共IPv6地址上的kubernetes TCP服务。应用程序在IPv4上运行良好,但我无法在IPv6上配置它。问题是这不是HTTP服务。当前服务按类型完成:非标准端口11042上的LoadBalancer。所以我认为它创建了网络负载均衡器。 支持IPv6的文档转发规则如下:目标HTTP代理目标HTTPS代理、目标SSL代理、目标TCP代理,但TCP代理已关闭可使用的端口列表。我也尝

  • 框架默认提供创建 TCP/UDP 服务的能力。只需要进行简易的配置,便可使用。 使用 TCP 服务 创建 TcpServer 类 <?php declare(strict_types=1); namespace App\Controller; use Hyperf\Contract\OnReceiveInterface; class TcpServer implements OnRecei