gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:29:58 24 4
gpt4 key购买 nike

试图弄清楚如何在 Kubernetes 上使用单个 LoadBalancer 公开多个 TCP/UDP 服务。假设服务是 ftpsrv1.com 和 ftpsrv2.com,每个都在端口 21 上提供服务。

以下是我能想到的选项及其局限性:

  • 每个 svc 一磅:太贵了。
  • Nodeport :想要使用 30000-32767 范围之外的端口。
  • K8s Ingress:目前不支持 TCP 或 UDP 服务。
  • 使用 Nginx 入口 Controller :再次 will be one on one mapping :
  • 找到 this custom implementation : 但是好像没有更新,上次更新快一年了。

  • 任何输入将不胜感激。

    最佳答案

    它实际上是 possible使用 NGINX Ingress 来做到这一点。
    Ingress 不支持 TCP 或 UDP 服务。出于这个原因,这个入口 Controller 使用标志 --tcp-services-configmap--udp-services-configmap指向现有的配置映射,其中键是要使用的外部端口,值指示要使用以下格式公开的服务:<namespace/service name>:<service port>:[PROXY]:[PROXY] .
    This guide正在描述如何使用 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
    请注意,我们正在为同一个应用程序创建 2 个不同的服务。这仅用作概念证明。我不想向后者表明仅使用一个 Ingress 就可以映射许多端口。
    使用 Helm 安装 NGINX Ingress:
    安装 Helm 3:
    $ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
    添加 NGINX Ingress 仓库:
    $ 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 入口 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
    ...
    创建 tcp/udp 服务配置映射
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: tcp-services
    namespace: kube-system
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: udp-services
    namespace: kube-system
    由于这些 configmaps 是集中式的并且可能包含配置,最好我们只修补它们而不是每次添加服务时完全覆盖它们:
    $ 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 虚拟机外部监听的端口
  • default :您的服务安装在
  • 中的命名空间
  • 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
    将端口添加到 NGINX 入口 Controller 部署
    我们需要修补我们的 nginx 入口 Controller ,以便它监听端口 6379/6380 并可以将流量路由到您的服务。
    spec:
    template:
    spec:
    containers:
    - name: controller
    ports:
    - containerPort: 6379
    hostPort: 6379
    - containerPort: 6380
    hostPort: 6380
    创建一个名为 nginx-ingress-controller-patch.yaml 的文件并粘贴上面的内容。
    接下来使用以下命令应用更改:
    $ kubectl patch deployment ingress-nginx-controller -n kube-system --patch "$(cat nginx-ingress-controller-patch.yaml)"
    将端口添加到 NGINX 入口 Controller 服务
    与为 minikube 提供的解决方案不同,我们必须修补我们的 NGINX 入口 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
    请注意我们的 ingress-nginx-controller正在监听端口 6379/6380。
    测试您是否可以通过以下命令使用 telnet 访问您的服务:
    $ telnet 34.89.108.48 6379
    您应该看到以下输出:
    Trying 34.89.108.48...
    Connected to 34.89.108.48.
    Escape character is '^]'.
    要退出 telnet,请输入 Ctrl键和 ]同时。然后输入 quit并按回车键。
    我们还可以测试 6380 端口:
    $ telnet 34.89.108.48 6380
    Trying 34.89.108.48...
    Connected to 34.89.108.48.
    Escape character is '^]'.
    如果您无法连接,请查看上述步骤。
    相关文章
  • Routing traffic multiple services on ports 80 and 443 in minikube with the Kubernetes Ingress resource
  • Use port forwarding to access applications in a cluster
  • 关于kubernetes - 在 K8s 上使用单个 LoadBalancer 公开多个 TCP/UDP 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61430311/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com