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…

uniapp通过蓝牙传输数据 (安卓)

在uni-app中&#xff0c;可以通过原生插件的方式来实现蓝牙传输数据的功能。以下是一般的步骤&#xff1a; 1. 创建一个原生插件 在uni-app项目的根目录下&#xff0c;创建一个原生插件的目录&#xff0c;比如"uni-bluetooth"。然后在该目录下创建一个"Androi…

python类(对象)之间的关系

在Python中&#xff0c;类&#xff08;对象&#xff09;之间的关系是面向对象编程的核心概念之一。这些关系定义了类&#xff08;及其实例&#xff09;如何相互交互&#xff0c;以及它们如何构成程序的结构。 关联&#xff08;Association&#xff09; 关联是两个类之间的一种…

LeetCode207、210 课程表(图 dfs 拓扑排序)

官方题解主要思想是使用dfs进行拓扑排序。 课程表 class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:edges collections.defaultdict(list) visited [0] * numCourses # 将列表初始化为numCourses个0# result []valid T…

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

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

经典 topk

347. 前 K 个高频元素 215. 数组中的第K个最大元素 703. 数据流中的第 K 大元素 692. 前K个高频单词 public class Solution {public List<String> topKFrequent(String[

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

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

主流公链文章整理

主流公链文章整理 分类文章地址&#x1f349;BTC什么是比特币&#x1f96d;BTCBTC网络是如何运行的&#x1f351;BTC一文搞懂BTC私钥&#xff0c;公钥&#xff0c;地址&#x1f955;ETH什么是以太坊&#x1f336;️基础知识BTC网络 vs ETH网络&#x1f95c;CosmosCosmos介绍&a…

c++对象指针

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

面向移动设备的实时图像识别技术研究

面向移动设备的实时图像识别技术是一个快速发展的领域&#xff0c;它涉及到计算机视觉、机器学习和硬件优化等多个方面。以下是该领域的一些研究重点和挑战&#xff1a; 研究重点 轻量级网络设计&#xff1a;移动设备计算资源有限&#xff0c;因此研究重点之一是设计轻量级的…

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

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

vscode免费登录ssh ,linux git配置免密码

1、vscode远程ssh免密 在windows下生成密钥 , cmd窗口下执行 ssh-keygen -t rsa 在C:\Users\zhangqiwei\.ssh目录下生成 在linux下面 cd .ssh 创建authorized_keys 文件&#xff0c; 把之前windows下生成的 id_rsa.pub内容复制进去 2、gitlab 配置。 在linux下面 ssh-keygen…

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;欢迎后台留言~不定时更…

LeetCode第五题:最大回文子串【5/1000 python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题:打怪升级之旅 python数据分析可视化:企业实战案例 备…

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

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

如何理解Java中的cas

CAS&#xff0c;即 Compare and Swap&#xff0c;是一种并发编程中常用的原子操作&#xff0c;用于实现多线程环境下的同步。CAS 操作包括三个参数&#xff1a;内存位置&#xff08;通常是一个变量的内存地址&#xff09;、期望值和新值。操作的含义是&#xff1a;当且仅当内存…