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-cluster
    include 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端口,默认服务器配置,启用SSL
  index 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-https
    include 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;  # 后端服务的地址和端口,设置权重为5
  check 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;  # 后端服务的地址和端口,设置权重为5
  check 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-admin
  namespace: uat
  selfLink: /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-admin
  name: hire-admin
  namespace: uat
  resourceVersion: "260185009"
  selfLink: /api/v1/namespaces/uat/services/hire-admin
  uid: dc559c3a-abfb-4f70-927d-75ac5227b433
spec:
  clusterIP: 172.31.183.155  # Service 的 ClusterIP
  ports:
  - name: http
    port: 8503
    protocol: TCP
    targetPort: 8503  # Service 指向的目标端口
  selector:
    app: hire-admin
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}  # 没有负载均衡器相关的状态信息

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能小车测速(3.26)

模块介绍&#xff1a; 接线&#xff1a; VCC -- 3.3V 不能接5V&#xff0c;否则遮挡一次会触发3次中断 OUT -- PB14 测速原理&#xff1a; cubeMX设置&#xff1a; PB14设置为gpio中断 打开定时器2&#xff0c;时钟来源设置为内部时钟&#xff0c;设置溢出时间1s&#xff0c…

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做过isp的同学都知道&#xff0c;图像处理里面有一个3a&#xff0c;即自动曝光、自动白平衡和自动对焦。其中自动对焦这个&#xff0c;就需要用输入…

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可&#xff0c;左侧放置图片label&#xff0c;右侧放置文字label&#xff0c;就如上图所示&#xff1b; 但是这时的hover&#xff0c;press的伪状态是没有办法“传递”给里面的控件的&#xff0c;对btn的伪状态样式表的设置&#xff0c;是不…

IP SSL的应用与安装

IP SSL&#xff0c;即互联网协议安全套接字层&#xff0c;它是一种为网络通信提供安全及数据完整性的安全协议。在网络传输过程中&#xff0c;IP SSL可以对数据进行加密&#xff0c;这样即便数据在传输途中被截取&#xff0c;没有相应的解密密钥也无法解读内容。这一过程如同将…

防抖节流面试

1、防抖 1.1、条件 1、高频 2、耗时&#xff08;比如console不算&#xff09; 3、以最后一次调用为准 刷到个神评论&#xff0c;回城是防抖&#xff0c;技能cd是节流 1.2、手写 传参版本 function debounce(fn,delay){let timerreturn function(...args){//返回函数必须是普…

动态规划详解(Dynamic Programming)

目录 引入什么是动态规划&#xff1f;动态规划的特点解题办法解题套路框架举例说明斐波那契数列题目描述解题思路方式一&#xff1a;暴力求解思考 方式二&#xff1a;带备忘录的递归解法方式三&#xff1a;动态规划 推荐练手题目 引入 动态规划问题&#xff08;Dynamic Progra…

QT子窗口关闭时自动释放及注意事项

先说方法&#xff0c;很简单&#xff0c;有如下API函数可用&#xff1a; testDialog->setAttribute( Qt::WA_DeleteOnClose, true )&#xff1b; 他的官方解释如下&#xff1a; 最后&#xff0c;说一个注意事项&#xff1a; 最近写python程序比较多&#xff0c;回过头来&a…

OPPO VPC 实践探索

01 概述 一年前(20年6月)&#xff0c;OPPO云网络技术底座开始支持VPC方案&#xff0c;解决了用户担心的云上安全和虚拟实例的性能问题。我们称这个版本为VPC1.0&#xff0c;其采用了先进的智能网卡加速和VXLAN隧道隔离技术&#xff0c;实现了VPC从无到有的突破。 然而由于业务快…

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台&#xff0c;它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面&#xff0c;并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点&#xff1a; 集中管理&am…

绿联 安装Mysql数据库

绿联 安装Mysql数据库 1、镜像 mysql:5.7 数据库5.7.x系列。 mysql:8 数据库8.x.x系列&#xff0c;安装方式相同。 2、安装 2.1、拉取镜像 拉取5.7.x版本的镜像。 2.2、基础设置 重启策略&#xff1a;第三或第四项均可。 2.3、网络 桥接即可。 2.4、命令 在原有的“mys…

概率论基础——拉格朗日乘数法

概率论基础——拉格朗日乘数法 概率论是机器学习和优化领域的重要基础之一&#xff0c;而拉格朗日乘数法与KKT条件是解决优化问题中约束条件的重要工具。本文将简单介绍拉格朗日乘数法的基本概念、应用以及如何用Python实现算法。 1. 基本概念 拉格朗日乘数法是一种用来求解…

EPSON机器人仿真实战攻略:从设置通信到运行调试一网打尽!

EPSON机器人 仿真测试深度教程 机器人还没到,怎么提前验证写好得机器人程序? 强大的仿真功能来了!本文详细深入的介绍了仿真的功能,一步步教会你如何仿真! 请先关注公众号收藏,防止走丢! 需要先设置电脑与控制器通信的虚拟连接,设置-电脑与控制器通信-增加-选择连接…

第27篇:T触发器实现4位计数器

Q&#xff1a;本篇我们用T触发器实现时序逻辑电路--计数器。 A&#xff1a;T触发器&#xff08;Toggle Flip-Flop&#xff09;只有一个信号输入端&#xff0c;在时钟有效边沿到来时&#xff0c;输入有效信号则触发器翻转&#xff0c;否则触发器保持不变&#xff0c;因此T触发器…

C++之结构体初始化10种写法总结(二百六十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

大数据毕业设计hadoop+spark旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 计算机毕业设计 机器学习 深度学习 知识图谱

基于hive数据仓库的贵州旅游景点数据分析系统的设计与实现 摘 要 随着旅游业的快速发展和数字化转型&#xff0c;旅游数据的收集和分析变得越来越重要。贵州省作为一个拥有丰富旅游资源的地区&#xff0c;旅游数据的分析对于促进旅游业的发展和提升旅游体验具有重要意义。基…

Redis分布式锁的优化

分布式锁 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的实现 分布式锁的核心是实现多进程之间互斥&#xff0c;而满足这一点的方式有很多&#xff0c;常见的有三种&#xff1a; MySQLRedisZookeeper互斥利用mysql本身的互斥锁机制利…

LangChain-03 astream_events 流输出

内容简介 尝试用 FAISS 或 DocArrayInMemorySearch 将数据向量化后检索astream_events 的效果为 |H|arrison| worked| at| Kens|ho|.|| 安装依赖 # 之前的依赖即可 pip install --upgrade --quiet langchain-core langchain-community langchain-openai # Win或Linux用户可…

摸鱼toyaml.com更新

摸鱼https://toyaml.com/windowsupdate.html

一次MySQL事务的旅程:Buffer Pool, Binlog, Redo Log揭秘

MySQL中的各种Buffer和Log以及表空间 MySQL中一次事务涉及了各种Buffer,Log和表空间&#xff0c;主要涉及&#xff1a;Buffer Pool, Binlog, Undo Log, Redo Log以及表空间。 我们来探讨下。 Buffer Pool Buffer Pool主要存放在内存中&#xff0c;它是一个缓存区域&#xf…

36---USB HUB电路设计

视频链接 USB HUB电路设计01_哔哩哔哩_bilibili USB HUB 电路设计 1、USB HUB基本介绍 USB Hub&#xff0c;指的是一种可以将一个USB接口扩展为多个&#xff0c;并可以使这些接口同时使用的装置。 Hub也是大家常说的集线器&#xff0c;它使用星型拓扑结构连接多个USB接口设…