基于 Nginx Ingress Controller 的四层(TCP)转发配置

embedded/2024/11/28 15:55:08/

基于 Nginx Ingress Controller 的四层(TCP)转发配置

1. 简介

本指南将展示如何通过配置 ConfigMap 来实现 Nginx Ingress Controller 的四层转发(TCP),并通过配置测试应用程序验证配置的有效性。本文中使用的 Kubernetes 组件包括 ConfigMapServiceDeployment 以及 LoadBalancer 类型的 Service。还将演示如何热加载修改 ConfigMap,以使更改能够即时生效。 Nginx-Ingress-Controller 的安装文档可以参考此链接。

2. 配置 Ingress Controller 的 TCP 服务

2.1 创建 TCP 服务配置 ConfigMap

首先,创建一个 ConfigMap 来定义 Ingress Nginx 的 TCP 服务,将特定的端口转发到相应的服务。

apiVersion: v1
kind: ConfigMap
metadata:name: tcp-servicesnamespace: ingress-nginx
data:53: "kube-system/kube-dns:53"8080: "ingress-nginx/nginx-hello-world:8080"
  • 53: 用于将 DNS 请求转发到 kube-dns 服务。
  • 8080: 用于将请求转发到部署的 nginx-hello-world 服务。

2.2 创建 LoadBalancer 类型的 Ingress Nginx Service

为 Ingress Nginx 创建一个 LoadBalancer 类型的 Service,使其支持四层 TCP 负载均衡。(如果没有LoadBalancer 可以使用在启动一个有 telnet 和 curl 的容器通过 ClusterIP 访问)

apiVersion: v1
kind: Service
metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:type: LoadBalancerports:- name: httpport: 80targetPort: 80protocol: TCP- name: httpsport: 443targetPort: 443protocol: TCP- name: proxied-tcp-9000port: 53targetPort: 53protocol: TCP- name: tcp-8080port: 8080targetPort: 8080protocol: TCPselector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx

nginxcontroller__62">2.3 修改 ingress-nginx-controller 的启动命令

为了使 tcp-services ConfigMap 生效,需要将其添加到 Ingress Nginx Controller 的启动参数中,执行命令 kubectl edit deploy ingress-nginx-controller -n ingress-nginx添加参数如下:

 args:- /nginx-ingress-controller- --tcp-services-configmap=ingress-nginx/tcp-services

3. 部署测试应用

接下来,我们将部署一个测试应用(基于 Nginx 的 “Hello World”),并为其创建相应的 Service

3.1 创建 Nginx Index ConfigMap

使用 ConfigMap 来定义 Nginx 的默认页面内容:

apiVersion: v1
kind: ConfigMap
metadata:name: nginx-index
data:index.html: |<!DOCTYPE html><html><head><title>Hello World</title></head><body><h1>Hello, World!</h1></body></html>

3.2 部署 Nginx Hello World 应用

使用以下 Deployment 来部署 Nginx 容器容器中挂载了自定义的 index.html 页面。

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-hello-worldlabels:app: nginx-hello-world
spec:replicas: 1selector:matchLabels:app: nginx-hello-worldtemplate:metadata:labels:app: nginx-hello-worldspec:containers:- name: nginximage: nginxports:- containerPort: 80volumeMounts:- name: nginx-configmountPath: /usr/share/nginx/html/index.htmlsubPath: index.htmlvolumes:- name: nginx-configconfigMap:name: nginx-index

3.3 创建服务以暴露 Nginx 应用

使用 ClusterIP 类型的服务来暴露 Nginx 应用。

apiVersion: v1
kind: Service
metadata:name: nginx-hello-world
spec:selector:app: nginx-hello-worldports:- protocol: TCPport: 8080targetPort: 80type: ClusterIP

4. 测试四层转发配置

4.1 验证应用访问

可以通过 Kubernetes 集群的 Service IP 地址访问 Nginx 测试应用,以下是测试的示例:

[root@nettools /]# curl 10.102.195.104:8080
<!DOCTYPE html>
<html>
<head><title>Hello World</title>
</head>
<body><h1>Hello, World!</h1>
</body>
</html>

这里,10.102.195.104ingress-nginx 服务的 Cluster IP,8080 是在配置中定义的端口。

4.2 获取服务信息

使用以下命令查看 ingress-nginx 服务的详细信息:

kubectl get svc -n ingress-nginx

输出示例:

NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                  AGE
ingress-nginx                        LoadBalancer   10.102.195.104   localhost     80:30170/TCP,443:30677/TCP,53:31825/TCP,8080:32284/TCP   23m
ingress-nginx-controller             LoadBalancer   10.100.242.98    localhost     80:30663/TCP,443:32345/TCP                               30m
ingress-nginx-controller-admission   ClusterIP      10.97.94.62      <none>        443/TCP                                                  30m
nginx-hello-world                    ClusterIP      10.97.223.28     <none>        8080/TCP                                                 113s

5. 热加载修改 ConfigMap

为了更新 TCP 服务的配置而不需要重启 Ingress 控制器,我们可以直接修改 ConfigMap,并应用变更:

5.1 更新 ConfigMap

例如,如果需要修改 TCP 服务端口配置,只需编辑 tcp-services ConfigMap:

kubectl edit configmap tcp-services -n ingress-nginx

编辑完成后保存即可,Ingress Nginx 控制器会自动加载新的配置。

5.2 验证修改是否生效

修改 ConfigMap 后,可以通过重新访问相应的服务端口来验证变更是否生效。使用 curl 或其他网络请求工具检查服务的可达性。

6. 结论

通过本文,我们成功配置了 Nginx Ingress Controller 的四层 TCP 转发,部署了一个测试应用。Ingress 可以通过 ConfigMap 的变更进行热加载。这样可以为 Kubernetes 集群中的不同服务提供灵活的四层负载均衡能力。


http://www.ppmy.cn/embedded/141215.html

相关文章

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…

人工智能在医疗保健领域的潜在应用

人工智能在医疗保健领域的潜在应用 一、影像识别与辅助诊断 医学影像解读 医学影像解读一直是医生的重要工作之一&#xff0c;然而由于医学影像学习曲线陡峭、误诊率高等问题&#xff0c;这一领域迫切需要人工智能技术的介入。利用深度学习算法&#xff0c;人工智能可以对医学影…

汽车免拆诊断案例 | 2017款捷豹F-PACE车发动机偶尔怠速不稳

故障现象  一辆2017款捷豹F-PACE车&#xff0c;搭载2.0 L GTDi发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;车辆组合仪表上发动机故障灯点亮&#xff08;图1&#xff09;&#xff0c;且发动机偶尔怠速不稳。 图1 发动机故障灯点亮 故障诊断 接车后试车…

Brain.js 用于浏览器的 GPU 加速神经网络

Brain.js 是一个强大的 JavaScript 库&#xff0c;它允许开发者在浏览器和 Node.js 环境中构建和训练神经网络 。这个库的目的是简化机器学习模型的集成过程&#xff0c;使得即使是没有深厚机器学习背景的开发者也能快速上手 。 概述 Brain.js 提供了易于使用的 API&#xff…

不用下载安装的线上3D编辑器,支持哪些功能?

线上3D编辑器&#xff0c;不用下载软件&#xff0c;直接通过浏览器打开51建模网&#xff0c;上传模型即可进入编辑器&#xff0c;不仅支持对3D模型进行细致的效果配置&#xff0c;如光源设置、背景定制、材质调节等&#xff0c;还具备爆炸效果、热点动画、部件替换等高级交互功…

Python中的23种设计模式:详细分类与总结

设计模式是解决特定问题的通用方法&#xff0c;分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍&#xff0c;包括其核心思想、应用场景和优缺点。 一、创建型模式&#xff08;Creational Patterns&#xff09; 创建型模式关注对象的创建&#xff0…

草图大师2020安装教程附安装包下载

软件介绍 草图大师&#xff08;Sketchup&#xff09;是由谷歌公司推出的一款环保型3D建模软件。草图大师可以快速和方便地创建、观察和修改三维创意&#xff0c;具有沿路径放样、导入的2D物体可随视角转动、布尔运算等功能。传统铅笔草图的优雅自如&#xff0c;现代数字科技的…

《Java 对象池技术:性能优化的利器》

一、引言 在 Java 开发中&#xff0c;对象池技术作为一种优化手段&#xff0c;有着重要的地位。对象的生命周期通常包括创建、使用和清除三个阶段。在这个过程中&#xff0c;对象的创建和清除会带来一定的开销&#xff0c;而对象池技术则可以有效地减少这些开销&#xff0c;提高…