如何通过 kubernetes ingress 或者 istio ingressgateway 来暴露 TCP 的服务

news2025/3/12 19:58:09

点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

在 kubernetes 或 istio 应用中,一般都是通过 kubernetes ingress 或者 istio ingressgateway 来暴露 HTTP/HTTPS 的服务。但是在实际应用中,还是有不少应用是TCP长连接的,这个是否也是可以通过 ingress 来暴露呢?

本文将讲述如何通过 kubernetes ingress 或者 istio ingressgateway 来暴露 TCP 的服务。

1、部署示例服务

  1. 1. 部署一个 tcp-echo 服务, 用于验证通过 kubernetes ingress 或 istio ingressgateway 来访问 tcp 服务。

    执行命令 kubectl apply -f tcp-echo.yaml 部署 tcp-echo 服务:

    # tcp-echo.yaml
    apiVersion: v1
    kind: Service
    metadata:
       name: tcp-echo
       labels:
          app: tcp-echo
          service: tcp-echo
    spec:
       ports:
       - name: tcp
         port: 9000
       - name: tcp-other
         port: 9001
       # Port 9002 is omitted intentionally for testing the pass through filter chain.
       selector:
          app: tcp-echo
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tcp-echo
    spec:
      replicas: 1
      selector:
         matchLabels:
           app: tcp-echo
           version: v1
       template:
         metadata:
           labels:
             app: tcp-echo
             version: v1
         spec:
           containers:
           - name: tcp-echo
             image: docker.io/istio/tcp-echo-server:1.2
             imagePullPolicy: IfNotPresent
             args: [ "9000,9001,9002", "hello" ]
             ports:
             - containerPort: 9000
             - containerPort: 9001
  2. 2. 部署一个 sleep 服务,作为发送请求的测试客户端。

    执行命令 kubectl apply -f sleep.yaml 部署 sleep 服务:

    # sleep.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "3650d"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
          secret:
            secretName: sleep-secret
            optional: true
  3. 3. 部署成功后,发送一些TCP流量来确认 tcp-echo 服务已启动且正在运行。

    # 获取 sleep 的 pod名称
    $ kubectl get pods -l app=sleep
       NAME                     READY   STATUS    RESTARTS   AGE
       sleep-557747455f-gwt2j   2/2     Running   4          2d4h
    # 进入 sleep 容器内,使用 nc 命令向 tcp-echo 服务发送tcp请求
    $ kubectl exec -it sleep-557747455f-gwt2j -c sleep sh
    / $ nc -v tcp-echo 9000
    tcp-echo (10.96.141.51:9000) open
    xcbeyond
    hello xcbeyond

2、kubernetes ingress tcp

2.1 原理

Kubernetes Ingress Controller 在启动时会去watch两个configmap(一个tcp,一个 udp),里面记录了后面需要反向代理的TCP的服务以及暴露的端口。如果里面的key-value发生变换,Ingress controller 会去更改 Nginx 的配置,增加对应的 TCP 的 listen 的 server 以及对应的后端的 upstream。

e17fd985f262977619629e7489c8e009.png

2.2 最佳实践

前提条件:

  • 已安装 ingress controller。

    如果未安装,可以参考执行命令 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml,完成安装。

  1. 1. kubernetes ingress controller 中增加需要 watch 的 configmap。

    通过命令 kubectl edit -n ingress-nginx deployment ingress-nginx-controller,在 ingress-nginx-controller 中新增参数 tcp-services-configmap、udp-services-configmap,如下图所示:

    b811026239bd80854ac30c0df2016660.png

  2. 2. 创建对应的 configmap。

    暂时不需要配置服务。 对于已经默认创建好了对应的configmap: tcp-services, udp-services,无需再创建。

    1)执行命令 kubectl apply -f tcp-services-cm.yaml,tcp-services-cm.yaml 文件内容如下:

    # tcp-services-cm.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tcp-services
      namespace: ingress-nginx

    2)执行命令 kubectl apply -f udp-services-cm.yaml,udp-services-cm.yaml 文件内容如下:

    # udp-services-cm.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: udp-services
      namespace: ingress-nginx
  3. 3. tcp-services configmap 中配置 TCP 服务的端口。

    执行命令 kubectl edit -n ingress-nginx cm tcp-services, 在 data 部分新增暴露的TCP端口,格式为 <Nginx port>: <namespace/service name>:<service port>:[PROXY]:[PROXY],如下图所示:

    72a324a61a38ac3b6e799f12de8e2e30.png

    图例中,是将 default/tcp-echo:9000 服务暴露到 nginx ingress 的 9000 端口。

  4. 4. Ingress Controller service 对外暴露 TCP 端口。

    因为 TCP 服务是需要通过端口来区分服务的,所以每个服务都需要增加一个独立端口,因此,需要给 Ingress Controller 增加新的端口来映射后端的TCP服务。

    执行命令 kubectl edit -n ingress-nginx svc ingress-nginx-controller,如下图所示:

    6d34f7a651bd7f4761a742a857bd4dfd.png

  5. 5. 通过 kubernetes ingress 访问 TCP 服务。

    直接通过 Ingress Controller service 暴露的 TCP 端口(nodePort)进行访问即可。

    借助命令 nc -v <ip> <port> 完成验证。

3、istio ingressgateway tcp

前提条件:

  • tcp-echo 服务已注入边车。

  • istio 中已部署 isito-ingressgateway 服务。

本示例中,借助 isito-ingressgateway 中默认已开启的 31400 tcp 端口,完成验证。在实际业务功能中,可单独向 isito-ingressgateway 新增多组 tcp 端口(即:在 isito-ingressgateway 的 service 中,新增 tcp 协议端口)。

33b39db1da0fdedd73b6d9667b13603e.png

  1. 1. 定义 istio gateway。

    执行命令 kubectl apply -f tcp-echo-gateway.yaml 创建服务 tcp-echo 的 gateway:

    # tcp-echo-gateway.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: tcp-echo-gateway
    spec:
      selector:
        istio: ingressgateway # use istio default controller
      servers:
      - port:
        number: 31400  # istio-ingressgateway tcp port
        name: tcp
        protocol: TCP
      hosts:
      - "*"
  2. 2. 定义 virtualService。

    执行命令 kubectl apply -f tcp-echo-vs.yaml 创建服务 tcp-echo 的 virtualService:

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: tcp-echo-vs
    spec:
      hosts:
      - "*"
      gateways:
      - tcp-echo-gateway
      tcp:
      - match:
        - port: 31400 # istio-ingressgateway tcp port
       route:
       - destination:
         host: tcp-echo  # tcp-echo service
         port:
           number: 9000
  3. 3. 通过 istio ingressgateway 访问 TCP 服务。

    直接通过 istio-ingressgateway service 暴露的 TCP 端口(nodePort)进行访问即可。

借助命令 nc -v <ip> <port> 完成验证。


参考文章:

  1. https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

054959487b40e45adb519236a638fb47.gif

  • Kubernetes安装篇(三):基于kind快速部署本地多套K8S集群

  • 图解 Kubernetes Deployment 故障排查 | 推荐长期收藏

  • 全方位解读服务网格(Service Mesh)的背景和概念

  • 微服务架构下的核心话题 (三):微服务架构的技术选型

a559e1d4f4524f40c4dabe095e0e8451.gif

喜欢就点个"在看"呗,留言、转发朋友圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

纷享销客张睿:快消数字化新时代,数“智”引领新增长

4月6日&#xff0c;在2023年&#xff08;第八届&#xff09;中国快消品创新大会主论坛上&#xff0c;纷享销客经营副总裁兼快消行业部总经理张睿作为嘉宾出席&#xff0c;并以《快消数字化新时代&#xff0c;数“智”引领新增长》为题发表了演讲。他有20余年的市场营销、销售及…

【蓝桥杯省赛真题37】Scratch冰上滑行 少儿编程scratch编程蓝桥杯省赛比赛真题讲解

目录 scratch冰上滑行 一、题目要求 编程实现 二、案例分析 1、角色分析

JUC源码系列-ReentrantReadWriteLock

继承关系 ReadLock和WriteLock是ReentrantReadWriteLock的两个内部类&#xff0c;Lock的上锁和释放锁都是通过AQS来实现的。 AQS定义了独占模式的acquire()和release()方法&#xff0c;共享模式的acquireShared()和releaseShared()方法。 还定义了抽象方法tryAcquire()、tryA…

男生|女生漫画头像怎么制作,分享3种免费制作方法,不用求人

大家发现没有&#xff0c;最近特别流行卡通漫画头像&#xff01;一些小伙伴们通过处理自己的照片&#xff0c;把照片制作成漫画头像&#xff0c;让照片看起来更有趣。那么&#xff0c;男生、女生漫画头像怎么制作呢&#xff1f;需要用到哪些工具?今天给大家分享3种免费制作漫画…

数据结构之线性表3

我们的目标&#xff1a; 1、了解线性结构的特点 掌握顺序表的定义、查找、插入和删除。 2、掌握链表的定义、创建、查找、插入和删除。 3、能够从时间和空间复杂度的角度比较两种存储结构的不同特点及其适用场合。&#xff08;持续更新&#xff09; 前言 本章节内容主要介绍…

linux服务器怎么搭建网站

linux服务器怎么搭建网站 我是艾西&#xff0c;今天又是和想学习linux系统的小伙伴分享服务器系统操作小知识的时间。 这篇文章艾西会告诉大家怎么用linux系统搭建网站&#xff0c;网站是一个展示页面&#xff0c;用于商业的公告栏、门面以及用户容易记住的点&#xff0c;通过…

SpringSecurity中用户表单登录验证源码分析

SpringSecurity简单介绍 Spring Security所解决的问题就是安全访问控制&#xff0c;安全访问控制功能其实就是对所有进入系统的请求进行拦截&#xff0c;校验每个请求是否能够访问它所期望的资源。通过学习SpringMVC我们得知只有进入Controller的请求才会走拦截器(Interceptor)…

LOL自动走A和释放技能原理及安全防护

走A和自动释放技能并不什么变态功能&#xff0c;他的一切操作都是符合常理的&#xff0c; 但是在经过合理的逻辑代码编写后&#xff0c; 利用读取内存数据&#xff0c;快速执行和判断&#xff0c; 实现的功能却是超出大部分玩家的。 也就是说用这个功能&#xff0c;可以弥补…

Spring Security实战(二)—— 实现图形验证码

目录 一. 使用过滤器实现图形验证码 1. 自定义过滤器 2. 图形验证码过滤器 &#xff08;1&#xff09;引入kaptcha依赖 &#xff08;2&#xff09;配置一个 kaptcha 实例 &#xff08;3&#xff09;创建一个CaptchaController&#xff0c;用于获取图形验证码 &#xff08…

[论文速览] Sparks of Artificial General Intelligence: Early experiments with GPT-4

Sparks of Artificial General Intelligence: Early experiments with GPT-4 2023.3.22 微软官方发布了目前人类史上最强AI模型 GPT-4 的综合能力评估论文&#xff0c;总所周知&#xff0c;2023年是通用人工智能&#xff08;Artificial General Intelligence&#xff0c;AGI&a…

18从零开始学Java之switch分支语句中该怎么用?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家介绍了Java里的顺序、分支、循环结构的概念&#xff0c;并且重点给大家讲解了分支结…

WebSocket和Socket编程

面试一般会问 socket原理 socket为啥要有端口&#xff1a;确定一个链路的是一个四元组 Socket编程 socket通信 你做过socket编程吗&#xff0c;socket是怎么实现知道有连接过来的 说说WebSocket与socket的区别 先谈谈Websocket与Socket的区别 首先Socket 不属于协议范畴 &a…

处理用户输入

shell脚本编程系列 传递参数 向shell脚本传递数据的最简单方法是使用命令行参数 比如 ./add 10 30读取参数 bash shell会将所有的命令行参数都指派给位置参数的特殊变量。其中$0对应脚本名、$1是第一个参数、$2是第二个参数&#xff0c;依次类推&#xff0c;直到$9 #!/bin/b…

Unity3D打包WebGL并使用MQTT(二):使用json

Unity3D打包WebGL并使用MQTT(二):使用json 1. 软件环境 Unity: 2021.3stomp.js 2.3.3: 下载地址:https://www.jsdelivr.com/package/npm/stompjs 2. 内容介绍 这篇博客的主要内容是记录将一个Unity项目打包成WebGL项目&#xff0c;并集成MQTT进行json数据传输的过程。 3. …

〖Python网络爬虫实战⑬〗- XPATH实战案例

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

一篇文章理解堆栈溢出

一篇文章理解堆栈溢出引言栈溢出ret2text答案ret2shellcode答案ret2syscall答案栈迁移答案堆溢出 unlink - UAF堆结构小提示向前合并/向后合并堆溢出题答案引言 让新手快速理解堆栈溢出&#xff0c;尽可能写的简单一些。 栈溢出 代码执行到进入函数之前都会记录返回地址到SP…

wsl区分和切换,安装NVIDIA驱动+cuda+ffmpeg

wsl区分和切换&#xff0c;安装NVIDIA驱动cudaffmpeg 安装Nvidia驱动 打开terminal wsl --update进入wsl nvidia-smi网上找了一些博客&#xff0c;获取信息&#xff1a; window安装好驱动即可wsl有1和2 我的win10已经安装了驱动 wsl1和wsl怎么区分&#xff1f;切换 区分…

实时聊天提示的最佳做法

本文将教您更多关于有效的实时聊天功能对您的品牌的重要性&#xff0c;以及您可以使用的一些最佳实践来确保您的实时聊天功能尽可能好。实时聊天提示是为您的网站访问者显示的自动聊天消息。在SaleSmartly&#xff08;ss客服&#xff09;中&#xff0c;如您将聊天插件安装到您的…

Win10 安装 MongoDB 5.0.16

一、MongoDB 的官方&#xff1a;http://www.mongodb.com/ 下载&#xff1a;​ ​https://www.mongodb.com/download-center/community​ 二、下载msi文件&#xff0c;双击该文件进行安装。 &#xff08;1&#xff09;打开对话框 ,单击“Next” &#xff08;2&#xff09;请勾…

总结815

4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 4.8 英语&#xff1a;早上继续背昨天没背完的第15篇文章单词&#xff0c;感觉效率极高&#xff0c;可能是昨晚睡眠质量特别好。下午抄写第16篇文章每日一句长难句看《…