Nginx在Kubernetes集群中的进阶应用

简介

在现代DevOps环境中,Nginx作为负载均衡器与Kubernetes的Ingress资源的结合,为应用程序提供了强大的路由和安全解决方案。本文将深入探讨如何利用Nginx的灵活性和功能,实现高效、安全的外部访问控制,以及如何配置Ingress以优化流量管理和SSL/TLS支持。

Nginx 可以与 Kubernetes 的 Ingress 资源配合使用,以提供高级的路由和负载均衡功能。Ingress 允许你通过定义规则来管理外部访问集群内服务的路径。当与 Nginx Ingress 控制器结合使用时,你可以利用 Nginx 的强大功能来处理 HTTP 和 HTTPS 流量,包括 SSL/TLS 终端、虚拟主机、重写和更多。
在这里插入图片描述

环境

  • Nginx服务:部署在公网,IP地址为172.1x.1x9.90,作为集群的入口点。
  • 内网环境:基于Kubernetes的集群,使用Ingress资源管理服务间的通信。

Nginx构建步骤

公网Nginx为入口

在现代的网络架构中,使用 Nginx 作为反向代理服务器是一种常见的做法,它可以帮助我们将公网流量有效地转发到内网的应用程序服务器。

http_proxy.conf
[root@monitor conf]# cat http_proxy.conf 
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";

这是一个配置文件,通常用于设置 HTTP 代理服务器的行为。下面是每一行的解释:

  • proxy_set_header Host $host; 这一行设置代理服务器向目标服务器发送请求时,将使用原始请求中的 Host 头部。$host 是 Nginx 配置中的变量,代表请求行中的主机名。
  • proxy_set_header X-Real-IP $remote_addr; 这里配置代理服务器向目标服务器发送请求时,会添加一个 X-Real-IP 头部,其值为发起请求的客户端的 IP 地址。$remote_addr 是 Nginx 配置中的变量,代表客户端的 IP 地址。
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这一行配置代理服务器在向目标服务器发送请求时,会添加一个 X-Forwarded-For 头部,用于表示发起请求的原始客户端的 IP 地址。$proxy_add_x_forwarded_for 是一个变量,它包含了原始请求中的 X-Forwarded-For 头部的值,如果有的话。
  • proxy_http_version 1.1;
    这里指定代理服务器使用 HTTP 版本 1.1 与目标服务器进行通信。这是因为 HTTP/1.1 支持持久连接,可以提高性能和效率。
  • proxy_set_header Connection "";
    这一行设置代理服务器向目标服务器发送请求时,Connection 头部将不会被发送。这通常用于防止目标服务器关闭连接,特别是在使用 HTTP/1.1 或 HTTP/2 时,持久连接是有益的。

这些配置通常用于确保代理服务器正确地转发客户端的请求到目标服务器,并且目标服务器能够接收到正确的原始请求信息。

https_proxy.conf
[root@monitor conf]# cat https_proxy.conf 
add_header Front-End-Https on;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-HTTPS on;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 8m;
ssl.conf
[root@monitor conf]# cat ssl.conf 
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers  on;ssl_stapling on;
ssl_stapling_verify off;
resolver 223.5.5.5 223.6.6.6 valid=300s;
resolver_timeout 10s;
Server的conf
server {listen       80;server_name   admin-uat.xxx.net;rewrite ^/(.*)$ https://$host/$1 permanent;#它执行了一个永久重定向策略,强制所有HTTP流量转向HTTPS,同时引用了公司白名单配置文件,以确保只有经过授权的用户或IP地址可以访问此服务。include /usr/local/openresty/nginx/whitelist/corporation.conf;
}
server {listen       443 ssl;server_name  admin-uat.xxx.net;include /usr/local/openresty/nginx/whitelist/corporation.conf;ssl                   on;ssl_certificate      /usr/local/openresty/nginx/ssl/xxx.net.crt;ssl_certificate_key  /usr/local/openresty/nginx/ssl/xxx.net.key;include ssl.conf;location / {proxy_pass  http://kubernetes-cluster;include https_proxy.conf;}
}

这个服务器块负责处理加密的HTTPS流量,配置了SSL证书和密钥以保证传输安全,并且在location上下文中设置了代理转发至名为kubernetes-cluster的上游服务器组。

流量进行转发
[root@monitor vhosts]# cat kubernetes-cluster.conf 
upstream kubernetes-cluster {server 192.168.82.42 weight=5;keepalive 16;
}

这里定义了一个上游服务器池,包含了一台内网IP地址为192.168.82.42的服务器,权重设置为5,意味着相对其他可能存在的服务器,此服务器将接收到更多比例的请求。同时,保持16个活动连接(keepalive),有助于减少建立新连接的开销,提高性能。

内网Nginx

default.conf
server {listen 80 default_server;  # 监听80端口,默认服务器配置index index.html index.htm index.php;  # 默认的索引文件root /usr/share/nginx/html;  # 根目录配置location / {proxy_pass http://kubernetes-cluster;  # 反向代理到kubernetes-clusterinclude proxy.conf;  # 包含proxy.conf文件}location ~ ^/Bdata_Nginx_Status$ {stub_status on;  # 启用Nginx状态页面allow 127.0.0.1;allow 10.0.0.0/8;allow 172.16.0.0/12;allow 192.168.0.0/16;deny all;  # 拒绝其他IP访问}location /Bdata_Check_Status {check_status;  # 启用Nginx健康检查allow 127.0.0.1;allow 10.0.0.0/8;allow 172.16.0.0/12;allow 192.168.0.0/16;deny all;  # 拒绝其他IP访问}access_log /var/log/nginx/access.log main;  # 访问日志路径和格式
}server {listen 443 ssl default_server;  # 监听443端口,默认服务器配置,启用SSLindex index.html index.htm index.php;  # 默认的索引文件root /usr/share/nginx/html;  # 根目录配置ssl_certificate /etc/nginx/ssl/server.crt;  # SSL证书路径ssl_certificate_key /etc/nginx/ssl/server.key;  # SSL证书私钥路径location / {proxy_pass https://kubernetes-cluster-https;  # 反向代理到kubernetes-cluster-httpsinclude proxy.conf;  # 包含proxy.conf文件}location ~ ^/Bdata_Nginx_Status$ {stub_status on;  # 启用Nginx状态页面allow 127.0.0.1;allow 10.0.0.0/8;allow 172.16.0.0/12;allow 192.168.0.0/16;deny all;  # 拒绝其他IP访问}location /Bdata_Check_Status {check_status;  # 启用Nginx健康检查allow 127.0.0.1;allow 10.0.0.0/8;allow 172.16.0.0/12;allow 192.168.0.0/16;deny all;  # 拒绝其他IP访问}access_log /var/log/nginx/access.log main;  # 访问日志路径和格式
}
upstream

kubernetes-cluster-https.conf

upstream kubernetes-cluster-https {server 172.31.154.47:443 weight=5;  # 后端服务的地址和端口,设置权重为5check interval=10000 rise=3 fall=2 timeout=1500 type=tcp;  # 配置健康检查参数keepalive 16;  # 配置 keepalive 连接数
}

kubernetes-cluster.conf

upstream kubernetes-cluster {server 172.31.154.47 weight=5;  # 后端服务的地址和端口,设置权重为5check interval=10000 rise=3 fall=2 timeout=1500 type=tcp;  # 配置健康检查参数keepalive 16;  # 配置 keepalive 连接数
}

这些配置定义了负载均衡的 upstream 组,其中 kubernetes-cluster-https 用于处理 HTTPS 流量,而 kubernetes-cluster 用于处理 HTTP 流量。每个 upstream 组只包含一个后端服务器(IP 地址为 172.31.154.47),并分配了权重为 5。此外,还配置了健康检查参数和 keepalive 连接数。

Ingress服务

上面的“172.31.154.47” 为 Ingress的IP

[dev][root@kubernetes-master-192.168.83.13 ~]# kubectl get svc -n ingress-nginx 
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   172.31.154.47   <none>        80:30274/TCP,443:30994/TCP   4y22d
[dev][root@kubernetes-master-192.168.83.13 ~]# kubectl get ingresses -n uat hire-admin
NAME         HOSTS                      ADDRESS         PORTS   AGE
hire-admin   hire-admin-uat.xxx.net   172.31.154.47   80      2y4d[dev][root@kubernetes-master-192.168.83.13 ~]# kubectl get ingresses -n uat hire-admin -oyaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:annotations:kubernetes.io/ingress.class: nginx  # 使用 nginx 作为 Ingress 控制器name: hire-adminnamespace: uatselfLink: /apis/extensions/v1beta1/namespaces/uat/ingresses/hire-admin
spec:rules:- host: hire-admin-uat.xxx.net  # Ingress 规则中的主机名http:paths:- backend:serviceName: hire-admin  # 后端服务的名称servicePort: 8503  # 后端服务的端口path: /  # Ingress 路径
status:loadBalancer:ingress:- ip: 172.31.154.47  # 负载均衡器的 IP 地址

后端服务

[dev][root@kubernetes-master-192.168.83.13 ~]# kubectl get svc -n uat    hire-admin 
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
hire-admin   ClusterIP   172.31.183.155   <none>        8503/TCP   2y4d[dev][root@kubernetes-master-192.168.83.13 ~]# kubectl get svc -n uat hire-admin -oyaml
apiVersion: v1
kind: Service
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"hire-admin"},"name":"hire-admin","namespace":"uat"},"spec":{"ports":[{"name":"http","port":8503,"protocol":"TCP","targetPort":8503}],"selector":{"app":"hire-admin"}}}creationTimestamp: "2022-03-30T02:37:57Z"labels:app: hire-adminname: hire-adminnamespace: uatresourceVersion: "260185009"selfLink: /api/v1/namespaces/uat/services/hire-adminuid: dc559c3a-abfb-4f70-927d-75ac5227b433
spec:clusterIP: 172.31.183.155  # Service 的 ClusterIPports:- name: httpport: 8503protocol: TCPtargetPort: 8503  # Service 指向的目标端口selector:app: hire-adminsessionAffinity: Nonetype: ClusterIP
status:loadBalancer: {}  # 没有负载均衡器相关的状态信息

总结来说,通过深度整合Nginx与Kubernetes Ingress资源,我们可以实现高度定制化的流量路由和负载均衡策略,不仅保障了服务的安全性和高可用性,同时也极大地提升了内外网交互的灵活性与响应速度。

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

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

相关文章

【MySQL】数据类型(1)

数据类型1 一、整形数据二、位图类型三、浮点类型 一、整形数据 我们的MySQL&#xff0c;有很多的数据类型&#xff0c;其中&#xff0c;我们在建表时&#xff0c;肯定要用到相应的数据类型。 整形有 tinyint, samllint , mediumint, int, bigint。 我们第一眼看上去&#x…

数字化赋能农业:数字乡村促进农业现代化

随着信息技术的迅猛发展&#xff0c;数字化浪潮正以前所未有的速度席卷各行各业&#xff0c;农业领域也不例外。数字乡村战略作为推动农业现代化的重要手段&#xff0c;通过数字化技术的深度应用&#xff0c;为农业生产带来了革命性的变革。本文旨在探讨数字化如何赋能农业&…

算法学习17:背包问题(动态规划)

算法学习17&#xff1a;背包问题&#xff08;动态规划&#xff09; 文章目录 算法学习17&#xff1a;背包问题&#xff08;动态规划&#xff09;前言一、01背包问题&#xff1a;1.朴素版&#xff1a;&#xff08;二维&#xff09;2.优化版&#xff1a;&#xff08;一维&#xf…

c++对象指针

对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象&#xff0c;也可以用new运算符动态建立堆对象。 定义对象指针的格式为&#xff1a; 类名 *对象指针 &对象; //或者 类名 *对象指针 new 类名(参数); 用对象指针访问对象数据成员的格式为&#xff1a…

B02、类的加载过程梳理-2

1、类的加载过程&#xff08;生命周期&#xff09; 1.1、过程一&#xff1a;装载&#xff08;Loading&#xff09;阶段 1、过程一都做了什么事&#xff1f; 类的装载&#xff0c;简而言之就是将Java类的字节码文件加载到机器内存中&#xff0c;并在内存中构建出Java类的原型&a…

Python字符串操作方法一览表

字符串操作 你患得患失太在意从前又太担心将来&#xff0c;有句话说的好昨天是段历史&#xff0c;明天是个谜团而今天是天赐的礼物 像珍惜礼物那样珍惜今天。—— 龟大仙《功夫熊猫3》 1.字符串连接 例子&#xff1a; str1 "Hello" str2 "World" resul…

在线点餐(源码+文档)

在线点餐系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端主页登录点餐注册个人资料我的 后台管理商品管理分类管理用户管理登录页订单管理分类管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、参考…

应用方案D78040场扫描电路,偏转电流可达1.7Ap-p,可用于中小型显示器

D78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#xff1a;

SON序列化解决方案

JSON&#xff08;JavaScript Object Notation&#xff09;是一种用于数据交换的轻量级数据格式。在我们日常Python编程中&#xff0c;通常可以使用内置的json模块来进行JSON序列化和反序列化。那么关于使用json模块进行JSON序列化和反序列化的问题解决方案&#xff0c;可以参考…

Matlab实验:离散时间信号与系统的时域分析

01.代码的主要内容 02.代码效果图 获取代码请关注MATLAB科研小白的个人公众号&#xff08;即文章下方二维码&#xff09;&#xff0c;并回复MATLAB课程设计&#xff1b;本公众号致力于解决找代码难&#xff0c;写代码怵。各位有什么急需的代码&#xff0c;欢迎后台留言~不定时更…

处理SAP报错:消息GLT2076 没有项目种类分配到科目 1481010102/1000

财务新建了个科目入账时报错&#xff1a;没有项目种类分配到科目。 查了下原因。原来是我们公司实施时启用了凭证分割功能。其中有个配置是这样的&#xff1a;给总账科目分类&#xff1a;IMG-财务会计&#xff08;新&#xff09;-总账会计核算-业务交易-凭证分解-为文档拆分给总…

20240322-1-协同过滤面试题

协同过滤面试题 1. 协同过滤推荐有哪些类型 基于用户(user-based)的协同过滤 基于用户(user-based)的协同过滤主要考虑的是用户和用户之间的相似度&#xff0c;只要找出相似用户喜欢的物品&#xff0c;并预测目标用户对对应物品的评分&#xff0c;就可以找到评分最高的若干个物…

IP代理池是什么?怎样判断IP池优劣?

许多做跨境电商的朋友们都会使用到IP代理池这个模块&#xff0c;那会有新想加入到跨境电商这个行业的朋友们会有疑问&#xff0c;IP代理池究竟是什么&#xff1f;今天为你解答。 IP代理池是一种集成多个代理IP的系统&#xff0c;其核心功能在于收集并维护大量的可用IP地址&…

什么是ECC?ECC 和 RSA 之间有何区别?

椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。 它提供了一种执行密钥交换、数字签名和加密等加密操作的安全方式。 ECC 为 1977 年首次发布的 Rivest-Shamir-Adleman (RSA) 加密算法提供了一种替代性方案。 继续阅读&#xff0c;进一步了解椭圆曲线密码学…

采用大语言模型进行查询重写——Query Rewriting via Large Language Models

文章&#xff1a;Query Rewriting via Large Language Models&#xff0c;https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展&#xff0c;因为它容易出错并且需要深厚的专业知识。 类似地…

Monaco Editor系列(二)Hello World 初体验

前言&#xff1a;上一篇文章我主要分享了从 Monaco Editor 入口文件以及官方提供的示例项目入手&#xff0c;对一部分源码进行剖析&#xff0c;以及分享了初始化阶段代码的大致执行步骤&#xff0c;这一篇了来讲一下我们要用 Monaco Editor 的时候该怎么用。其中会涉及到一些 A…

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程&#xff0c;方便自…

dm8 开启归档模式

dm8 开启归档模式 1 命令行 [dmdbatest1 dm8]$ disql sysdba/Dameng123localhost:5237服务器[localhost:5237]:处于普通打开状态 登录使用时间 : 3.198(ms) disql V8 SQL> select name,status$,arch_mode from v$database;行号 NAME STATUS$ ARCH_MODE ----------…

Python中输出显示台的设置

效果: 前言 这种文字显示的方式很适合新手来学习,毕竟新手还学不到pygame做游戏的, Python入门我们一般都学的是输入输出的游戏,但是如果加上一些文字和背景的改善可能会更好. 如何改变字体颜色 字体颜色(跟他的变量名是一样的): #改变字体颜色 RED \033[91m GREEN \033…

EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格

xls文件&#xff1a; 后端代码&#xff1a; InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…