• k8s nginx ingress 开启缓存(cache)的方法


    k8s集群中,我们都是通过ingress的方法对外暴露访问的。对一些静态的资源,我们可以在nginx ingress侧增加缓存,减小后端服务的压力。

    1、需要先找到nginx ingress的configmap配置文件,增加http-snippet

    1. # configmap.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: ingress-nginx-controller
    6. namespace: default
    7. data:
    8. http-snippet: "proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=static-cache:10m max_size=10g inactive=60m use_temp_path=off;"
    9. $ kubectl apply -f configmap.yml
    10. configmap/ingress-nginx-controller configured

    proxy_cache_path指令的完整语法如下:

    1. Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

    Nginx对缓存的处理

    Nginx针对响应缓存有两个处理动作

    • 缓存管理器会定时检查缓存的状态。如果缓存的内容大小达到了指令proxy_cache_path的参数max-size指定的值,则缓存管理器会根据LRU算法删除缓存的内容。 在检查的间隔时间内,总的缓存内容大小可以临时超过设定的大小阈值。
    • 缓存加载器只在Nginx启动的时候执行一次,将缓存内容的原信息加载到指定的共享内存区内。一次将所有的缓存内容加载到内存中会耗费大量的资源,并且会影响Nginx启动后几分钟内的性能。为了避免这种问题可以通过在指令proxy_cache_path后添加下面的参数:
      • loader_threshold – 缓存加载器加载缓存内容的最大执行时间(单位是毫秒,默认值是200毫秒)。
      • loader_files – 在缓存加载器加载缓存内容的执行时间间隔内,最多能加载多少个缓存条目,默认100。
      • loader_sleeps – 每两次执行的时间间隔, 单位是毫秒 (默认50毫秒)

    例子:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
    

    levels参数负责设置缓存目录级别。假设cache主目录为/data/nginx/cache。

    #如果没有特殊指明此参数值,则默认是放在cache主目录下:

    /data/nginx/cache/d7b6e5978e3f042f52e875005925e51b

    #当levels=1:2时,表示是两级目录,1和2表示用1位和2位16进制来命名目录名称。在此例中,第一级目录用1位16进制命名,如b;第二级目录用2位16进制命名,如2b。所以此例中一级目录有16个,二级目录有16*16=256个:

    /data/nginx/cache/b/2b/d7b6e5978e3f042f52e875005925e51b

    总目录数为16*256=4096个。
    ————————————————

    指定缓存条件

    默认情况下,Nginx会缓存所有第一次通过HTTP GET 和 HEAD 方法发起的请求。Nginx将请求的完整字符串作为缓存内容的KEY。如果后面的请求和缓存的内容拥有相同的KEY,则Nginx会将缓存的内容发送给客户端。我们也可以在httpserver,location块内包含各种指令来控制哪些响应可以被缓存。

    可以通过使用指令proxy_cache_key来控制缓存KEY的生成规则:

    proxy_cache_key "$host$request_uri$cookie_user";
    

    可以通过指令proxy_cache_min_uses 指定一个请求的响应被缓存前的最小访问次数:

    proxy_cache_min_uses 5;
    

    可以通过指令proxy_cache_methods 指定只有哪些HTTP请求类型才能被缓存:

    proxy_cache_methods GET HEAD POST;    
    

    限制或旁路缓存

    默认情况下响应内容会拥有被缓存起来,除非缓存内容的大小超过了指定的配置大小,超过以后会根据LRU算法进行删除。单我们也可以通过在http,server,location中配置统一的过期时间:

    1. proxy_cache_valid 200 302 10m;
    2. proxy_cache_valid 404 1m;

    上面的配置指定了当后端服务的响应是200,302时,缓存的有效期是10分钟;404 缓存有效期为1分钟。

    proxy_cache_valid any 5m;
    

    也可以不区分后端的响应码,此时可以用any来指代。

    可以通过指令proxy_cache_bypass指定Nginx使用缓存的条件,如下:

    proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;    
    

    该指令的每个参数都指定了一个条件,只有请求满足其中的任何一个条件,并且参数的值不是0,则Nginx会把请求转发到后端的服务而不会使用缓存。

    可以通过指令proxy_no_cache指定哪些请求不需要Nginx来缓存,配置格式和proxy_cache_bypass 类似:

    proxy_no_cache $http_pragma $http_authorization;
    

    2、自定义ingress配置文件,在ingress的注解中增加一下字段:

    1. nginx.ingress.kubernetes.io/configuration-snippet: |
    2. proxy_cache static-cache; #需要跟http-snippet中的keys_zone保持一致。
    3. proxy_cache_key "$scheme$proxy_host$request_uri";
    4. proxy_cache_valid 200 302 10m;
    5. proxy_cache_valid 404 1m;
    6. add_header X-Cache-Status $upstream_cache_status;
    7. nginx.ingress.kubernetes.io/proxy-buffering: "on" #重要,在我的测试中开启这个选项才会命中缓存机制

    比如:

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. annotations:
    5. kubernetes.io/ingress.class: nginx
    6. nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    7. nginx.ingress.kubernetes.io/configuration-snippet: |
    8. proxy_cache static-cache;
    9. proxy_cache_key "$scheme$proxy_host$request_uri";
    10. proxy_cache_valid 200 302 10m;
    11. proxy_cache_valid 404 1m;
    12. add_header X-Cache-Status $upstream_cache_status;
    13. nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    14. nginx.ingress.kubernetes.io/proxy-body-size: 4096m
    15. nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
    16. nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    17. nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
    18. nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    19. nginx.ingress.kubernetes.io/ssl-redirect: "true"
    20. nginx.ingress.kubernetes.io/use-regex: "true"
    21. nginx.ingress.kubernetes.io/proxy-buffering: "on"
    22. labels:
    23. app.kubernetes.io/managed-by: Helm
    24. isExternal: "true"
    25. release: xxxxx
    26. zone: xxxxx
    27. name: example-ingress
    28. namespace: default
    29. spec:
    30. rules:
    31. - host: example.com
    32. http:
    33. paths:
    34. - backend:
    35. service:
    36. name: my-service
    37. port:
    38. number: 443
    39. path: /ack/v2/domains/(.+)/namespaces/(.+)/repositories/(.+)/packages/(.+)/versions/(.+)/file_paths/(.+)
    40. pathType: ImplementationSpecific
    41. - http:
    42. paths:
    43. - backend:
    44. service:
    45. name: my-service
    46. port:
    47. number: 443
    48. path: /ack/v2/domains/(.+)/namespaces/(.+)/repositories/(.+)/packages/(.+)/versions/(.+)/file_paths/(.+)
    49. pathType: ImplementationSpecific
    50. tls:
    51. - {}

    参考文档:

    kubernetes - How to properly configure ingress cache to get it working? - Stack Overflow

    ConfigMap - Ingress-Nginx Controller

    Annotations - Ingress-Nginx Controller

  • 相关阅读:
    【计算机基础】Git从安装到使用,详细每一步!扩展Github\Gitlab
    STM32快速入门(定时器之输入捕获)
    LeetCode-56. 合并区间-Java-medium
    JavaScript学习笔记——JS基础8
    面渣逆袭:微服务三十三问,两万字图文详解!速收藏!
    Spark工作原理及基础概念(超详细!)
    微积分在神经网络中的本质
    leetcode hot100零钱兑换Ⅱ
    Java IO流(详解)
    会议OA项目之我的审批功能
  • 原文地址:https://blog.csdn.net/grace_yi/article/details/140971917