使用背景
最近一直在准备k8s上线事宜,目前已经在测试环境中全面部署并通过压力测试环境检验。离正式上线基本只剩下时间问题。我们目前测试环境中的容器负载均衡大量使用到了nginx,就是借助了ngx_upstream_jdomain模块,从而放弃了k8s官方的ingress。

在这里简单说下k8s的ingress。k8s官方的ingress controller其实也是通过nginx来实现的,但是Ingress本身依赖于service,它通过查询service的映射,来找到service后端的pod的真实ip,并将其挂载到ingress controll的upstream中来实现负载均衡。这本身其实并没有什么问题。但由于在我们的k8s中,鉴于标准service基于kube-proxy的转发效率不高,我们放弃了标准service。转而直接采用了headless service的方式。这种方式的好处是,dns解析会直接解析到每个pod的ip,而不再解析到service ip,也不再需要kube-proxy来实现转发。缺点是负载均衡只能依赖dns轮循,没有灵活的调度策略,但毫无疑问,由于去除了kube-proxy这个中间层,转发效率得到了提高。另外,由于我们直接打通了Pod与物理服务器之间的网络,物理网络中的主机可以与Pod之间通信,如果在中间采用标准的service,service的ip反而无法与物理网络直接实现通信。

这样一来,我们外部的负载均衡就没办法再去依赖Ingress了,我们采用了在外部部署nginx来实现负载均衡的方法,由于upstream里的pod ip会动态变化,所以我们不能直接在upstream里写死pod的ip地址,而只能用service的域名来替代,并让nginx自己去解析这个域名,我们知道headless service的域名由于没有内部的service ip,所以是直接解析到pod ip上的,这样就等于动态拿到了pod ip。在这种情况下,nginx_upstream_jdomain模块就登场了。

配置

在具体的配置之前,还得说下,nginx_upstream_jdomain这个模块严重依赖dns解析,另外由于其代理的后端的upstream中的pod ip经常性发生变化,所以dns缓存时间还不能太长,不过这个可以在nginx_upstream_jdomain模块参数中配置

ngx_upstream_jdomain的详细配置可以参考这里:https://www.nginx.com/resources/wiki/modules/domain_resolve/

我这里就给出一个示例配置:

resolver 192.168.1.1;
resolver_timeout 3s;
upstream www-stress- {
  jdomain www-stress.default.svc.wh01 port=80 interval=20;  #每隔20s做一次解析
} server {
  server_name www.stress.test.com;
  listen ;
  #set $proxy_upstream_name "-";
  location / {     #Proxy Settings
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header CDN-SRC-IP $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_max_temp_file_size ;
    proxy_connect_timeout ;
    proxy_send_timeout ;
    proxy_read_timeout ;
    proxy_buffer_size 4k;
    proxy_buffers 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;     proxy_pass http://www-stress-80;
  } }

另外,还需要说明的是,通过这种方式代理到后端的服务,后端服务接收到的$host的值即为www-stress-80,如果后端服务以主机头的方式来接受服务,这显然是不能接受的。所以在代理配置中,必须加上如下配置以将主机头传递给后端服务器:

proxy_set_header Host $host;

使用nginx的ngx_upstream_jdomain模块实现k8s容器的负载均衡的更多相关文章

  1. Nginx的配置与部署研究,Upstream负载均衡模块

    Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: upstream backend { server ...

  2. Nginx 与Tomcat 实现动静态分离、负载均衡

    Nginx 与Tomcat 实现动静态分离.负载均衡 一.Nginx简介: Nginx一个高性能的HTTP和反向代理服务器, 具有很高的稳定性和支持热部署.模块扩展也很容易.当遇到访问的峰值,或者有人 ...

  3. 基于nginx和tengine的tcp反向代理,负载均衡 安装和配置

    先下载nginx_tcp_proxy_module模块. wget https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master ...

  4. 用nginx进行同一个服务器下多域名的负载均衡配置

    用nginx进行同一个服务器下多域名的负载均衡配置 Nginx进行http负载均衡的模块是upstream Upstream可以进行多个配置,这样的话可以灵活的配置站点,但是注意的是upstream后 ...

  5. 架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)

    [前言] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(一)>中小编简单的讲解了Nginx的原理!俗话说:光说不练假把式.接下来,小编就和大家一起来做个小Demo来体会一下N ...

  6. 架构之路:nginx与IIS服务器搭建集群实现负载均衡(三)

    参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭 ...

  7. Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡   分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑 ...

  8. nginx配置虚拟主机、反向代理和负载均衡

    为了实现这个功能,需要修改nginx的配置文件,将nginx.conf清理一下,使结构更清晰. worker_processes ; events { worker_connections ; } h ...

  9. nginx系列10:通过upstream模块选择上游服务器和负载均衡策略round-robin

    upstream模块的使用方法 1,使用upstream和server指令来选择上游服务器 这两个指令的语法如下图: 示例: 2,对上游服务使用keepalive长连接 负载均衡策略round-rob ...

随机推荐

  1. sprint2(第六天)

    昨天休息一天,今天继续做任务. 燃尽图:

  2. [2019BUAA软工]第0次代码作业

    Visual Studio 单元测试的简单应用 写在前面   笔者根据作业的介绍以及Visual Studio 2017 文档的相关说明,进行了Visual Studio 单元测试的简单应用. Tip ...

  3. 20135234mqy-——信息安全系统设计基础第三周学习总结

    (1)计算机将信息按位编码,通常组成字节序列.用不同的编码方式表示整数,师叔和字符串.不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定. (2)C语言的设计可以包容多种不同字长和数字 ...

  4. 第二阶段每日站立会议Third Day

    昨天对图片显示的大小进行调整 今天对于程序中的字体显示进行细化修改,使界面更美观 遇到的问题:当图片太小时,显示一块灰色区域,不美观

  5. 四则运算《《《《SQL出题

    设计思路: 这次要用数据库存储题目,我想到的是用SQL server数据库,用dataGridView控件读取数据. 具体实现: DBCon.cs 1 using System; 2 using Sy ...

  6. 第二次作业<1>

    1001.A+B Format (20) ac代码 1. 解题思路 先求和,再输出. 答案区间为-2,000,000至2,000,000,将答案分为三个区段分类讨论.虽然觉得很烦但是想不出更好的方法. ...

  7. Codeforces Round #299 (Div. 2) D. Tavas and Malekas kmp

    题目链接: http://codeforces.com/problemset/problem/535/D D. Tavas and Malekas time limit per test2 secon ...

  8. User survey(用户调研)

    郑文武——小学二年级学生 姓名 郑文武  性别.年龄 男.9岁                      职业 学生 收入 父母给的零花钱 知识层次和能力 会使用手机 生活/工作情况 努力学习但数学成 ...

  9. 【CSAPP笔记】5. 汇编语言——数据

    本博客对于汇编的介绍基于32位机器的Intel x86系列处理器和IA32指令集,也涉及少部分x86-64.由于汇编知识相对复杂,这里只做简单介绍和记录,详细请参照书本! 数据格式 下面这张表格中体现 ...

  10. Java大数——快速矩阵幂

    Java大数——快速矩阵幂 今天做了一道水题,尽管是水题,但是也没做出来.最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了.... 题目描述: 给a,b,c三个数字,求a的b次幂对c取余. 数据范 ...