博客
关于我
通过阿里云K8S Ingress Controller实现路由配置的动态更新
阅读量:147 次
发布时间:2019-02-27

本文共 3357 字,大约阅读时间需要 11 分钟。

Nginx Ingress Controller动态配置优化

简介

在Kubernetes集群中,Ingress作为集群内服务对外暴露的访问接入点,承载着几乎所有集群内服务访问的流量。Nginx Ingress Controller作为Kubernetes社区重要的子项目,通过将Kubernetes Ingress资源对象映射为Nginx配置规则,实时化地为集群内服务提供高性能的外网访问入口。然而,随着Kubernetes集群中微服务数量的增加,Ingress路由规则的复杂度和后端Endpoint的频繁变更,导致Nginx配置文件的更频繁的变化,这直接引发了Nginx频繁Reload的需求。

Nginx频繁Reload的性能问题

Nginx的核心架构设计决定了其处理配置文件变化时的工作流程。每当Nginx配置文件发生变化时,Master进程接收Reload信号后,会从指定路径重新加载配置文件并校验其有效性。若校验通过,Master进程会根据配置中的worker_processes值fork出新的Nginx Worker进程,并将新配置文件中的Listen Socket FD注册到EPOLL事件监听中。同时,Master进程会向旧Nginx Worker进程发送QUIT信号,要求其平滑退出。旧Worker进程在接收到QUIT信号后,会移除已注册的EPOLL事件,不再处理新的客户端请求,并根据worker_shutdown_timeout值设置定时器处理完剩余请求。若在定时器前处理完所有请求,则旧Worker进程自动退出;否则,会被强制Kill退出,导致客户端请求响应异常。

频繁ReloadNginx配置文件会导致以下问题:

  • QPS抖动与访问失败:Nginx Worker进程频繁Reload导致的配置规则变化会引发客户端请求处理中的中断,导致QPS抖动和部分访问失败。

  • 长连接服务断开:频繁的Reload操作会导致长连接服务被频繁中断,影响用户体验。

  • Nginx Worker进程处于shutdown状态:大量处于shutdown状态的Nginx Worker进程会导致内存膨胀,影响系统性能。

  • 动态更新解决方案

    针对上述问题,我们需要通过动态更新的方式加载Nginx配置规则,而不需要再次Fork新的Nginx Worker进程。这种方式的关键在于在不Fork新进程的情况下,实时更新已加载到内存中的Nginx配置规则。

    Nginx配置文件分析

    Nginx配置文件主要包含以下几个部分:

  • main configuration:包括daemon off;、worker_processes、events { ... }等配置。
  • http main configuration:包括access_log、error_log、upstream { ... }等配置。
  • server { ... }:包括server_name、listen、location { ... }等配置。
  • 在Kubernetes集群中,Ingress资源对象映射到Nginx的HTTP Main Block、Server Block、Upstream Block和Location Block等配置章节。因此,我们可以将这些频繁变化的配置内容以Shared Memory的方式统一维持在内存中,同时在Ingress Controller内部暴露管控端口,通过API的方式实时管理Nginx路由规则配置。

    动态更新实现

    当Kubernetes集群中的Ingress及相关资源发生变化时,Ingress Controller会通过Internal API将最新的Nginx配置规则推送到统一的共享内存配置中。这样,当Nginx处理任何新接收的客户端请求时,都能基于最新的共享内存中的配置进行规则匹配和路由转发。

    动态配置支持

  • Upstream动态更新:阿里云容器服务Kubernetes集群中的Nginx Ingress Controller组件默认已开启Upstream的动态更新,支持应用服务的灰度发布和蓝绿发布功能。具体配置可参考官方文档。

  • HTTPS证书动态更新:开启Nginx Ingress Controller的证书动态更新功能后,Ingress的TLS证书统一维护在Nginx的共享内存中。通过以下命令可以查看当前共享内存中配置的证书列表:

  • kubectl -n kube-system exec -it nginx-ingress-controller-pod-name -- curl http://127.0.0.1:18080/configuration/certs
    1. Server和Location动态更新:同样地,开启Nginx Ingress Controller的Server和Location动态更新功能后,所有Nginx Server和Location的配置都统一维护在共享内存中。通过以下命令可以查看当前共享内存中的Server配置列表:
    2. kubectl -n kube-system exec -it nginx-ingress-controller-pod-name -- curl http://127.0.0.1:18080/configuration/servers

      注意事项:开启Server动态更新功能时,部分Ingress Annotation配置暂不支持,正在逐步优化支持中。建议通过直接方式进行配置。

      配置说明

    3. 默认配置:阿里云容器服务Kubernetes集群中的Nginx Ingress Controller组件默认已开启Upstream、证书和Server/Location的动态更新功能。

    4. 查看配置

      • 查看Upstream配置列表:
        kubectl -n kube-system exec -it nginx-ingress-controller-pod-name -- curl http://127.0.0.1:18080/configuration/backends
      • 查看证书配置列表:
        kubectl -n kube-system exec -it nginx-ingress-controller-pod-name -- curl http://127.0.0.1:18080/configuration/certs
      • 查看Server配置列表:
        kubectl -n kube-system exec -it nginx-ingress-controller-pod-name -- curl http://127.0.0.1:18080/configuration/servers
    5. 动态更新开关:通过修改nginx-ingress-controller deployment的args参数可以开启或关闭动态更新功能。以下是启用动态证书更新和动态Server/Location更新的示例:

    6. - args:   - /nginx-ingress-controller  - --configmap=$(POD_NAMESPACE)/nginx-configuration  - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services  - --udp-services-configmap=$(POD_NAMESPACE)/udp-services  - --annotations-prefix=nginx.ingress.kubernetes.io  - --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb  - --enable-dynamic-certificates=true  - --v=2

      总结

      通过上述方法,我们可以在不Fork新Nginx Worker进程的情况下,实时更新Nginx配置规则,避免了频繁Reload带来的性能问题。这种动态更新方式不仅提升了集群的整体性能,还确保了Ingress资源对外暴露的稳定性和可靠性。

    转载地址:http://lxgb.baihongyu.com/

    你可能感兴趣的文章
    Oracle GoldenGate Director安装和配置(无图)
    查看>>
    Oracle Goldengate在HP平台裸设备文件系统OGG-01028处理
    查看>>
    oracle instr函数详解
    查看>>
    Oracle Java所有版本的下载链接
    查看>>
    Oracle JDBC url的几种方式
    查看>>
    Oracle JDK vs OpenJDK
    查看>>
    ORACLE MERGE INTO (2)
    查看>>
    oracle ogg 单实例双向复制搭建(oracle-oracle)--Oracle GoldenGate
    查看>>
    Oracle ora-12514报错解决方法
    查看>>
    oracle ORA-14402 OGG-01296
    查看>>
    oracle package包头和package body包体例子
    查看>>
    oracle partition by list,深入解析partition-list 分区
    查看>>
    Oracle PL/SQL Dev工具(破解版)被植入勒索病毒的安全预警及自查通告
    查看>>
    oracle pl/sql 导出用户表结构
    查看>>
    Oracle PLSQL Demo - 17.游标查询个别字段(非整表)
    查看>>
    oracle rac 安装 PRVG-13606 ntp 同步报错解决过程
    查看>>
    Oracle RAC性能调整的方案
    查看>>
    oracle rac集群的东西之QQ聊天
    查看>>
    UML— 用例图
    查看>>
    Oracle Schema Objects——Tables——Table Compression
    查看>>