• Azure Kubernetes Service中重写规则踩坑小记录


    前言

    最近在做标准产品在不同云平台中的部署验证,有幸体验了一下微软的Azure。负责采购的运维部门这次采用了Application Gateway来搭配AKS(Azure Kubernetes Service)对外暴露服务,正好借着这个机会来体验一下Application Gateway

    应用场景

    1. 域名api.demo.com指向Application Gateway的IP地址
    2. AKS内部2个Service, gateway-servicebackend-service分别需要通过Application Gateway对外暴露。
    3. /gateway/指向gateway-service, 然后/backend/指向backend-service。而且两个Service都没有context-path,所以需要做一个Rewrite重写URI到Service的根目录上。

    定义重写集

    打开AKS对应的应用程序网关设置 > 重写。选择添加重写集。在1. 名称和关联这个Tab上只需要填写名称这项即可(名称后面在做ingress时需要使用), 关联的传递规则不需要选择。2. 重写规则配置里添加一个重写规则,然后填上重写规则的名称,并添加条件(默认新建重写规则时,只会生成操作,不会生成条件)

    条件做如下设置

    • 要检查的变量类型 : 服务器变量
    • 服务器变量: request_uri
    • 区分大小写:
    • 运算符: 等号(=)
    • 要匹配的模式: /(gateway|backend)/?(.*)

    操作做如下设置

    • 重写类型: URL
    • 操作类型: 设置
    • 组件: URL路径和URL查询字符串
    • URL路径值: /{var_request_uri_2}
    • 重新计算路径映射: 不选中
    • URL查询字符串值: 留空不设值

    特殊说明

    操作里的URL路径值不能使用正则表达式GROUP替换组,例如$1$2之类的。Azure自己定义了一套对应的替换组命名规则。具体可以参考这个网页使用应用程序网关重写 HTTP 标头和 URL

    另外一个需要注意一点,如果在条件里选择了服务器变量request_uri的时候,注意这个request_uri是完整的原始请求URI(携带了查询参数)。例如: 在请求http://api.demo.com/gateway/search?foo=bar&hello=world中,request_uri的值将为/gateway/search?foo=bar&hello=world。由于request_uri里包含了查询参数,所以在操作组件中建议勾选URL路径和URL查询字符串。如果只选择URL路径的情况下可能出现无法预期的错误。以我们上述的配置来说明。

    对象URL: http://api.demo.com/gateway/search?foo=bar&hello=world

    组件URL路径和URL查询字符串URL路径
    结果/search?foo=bar&hello=world/search?foo=bar&hello=world?foo=bar&hello=world

    ACK的Ingress设置

    当选择了Application Gateway作为对外暴露Service的方式时,Kubernetes集群里(kube-system命名空间里)多一个Application Gateway Ingress Controller(Azure工单时通常会简称为agic)的Deployment,所以对外暴露服务时可以像传统nginx ingress controller一样添加一个Ingress对象即可(甚至配置也和ngic大致相同,只是多了2个annotations)

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        # 这里指定重写规则集(不是重写规则的名字)
        appgw.ingress.kubernetes.io/rewrite-rule-set: rule-backend
        # 指定说明你这里ingress的类型是agic
        kubernetes.io/ingress.class: azure/application-gateway
      name: backend-ingress
      namespace: default
    spec:
      rules:
      - host: api.demo.com
        http:
          paths:
          - backend:
              service:
                name: gateway-service
                port:
                  number: 8080
            path: /gateway/
            pathType: Prefix
          - backend:
              service:
                name: backend-service
                port:
                  number: 8080
            path: /backend/
            pathType: Prefix
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    总结

    由于微软云这块文档有部分缺失,导致在配置这块花了一点时间去排查,甚至开了工单。总结下来Ingress的配置主要是根据请求路径路由到对应的Service,重写规则集才是实际负责根据正则来进行匹配重写。

  • 相关阅读:
    Java中ArrayList的常用api
    windows安装metesploit遇到的问题
    【小黑嵌入式系统第八课】初识PSoC Creator™开发——关于PSoC Creator&下载、创建项目、单片机中的hello world(点亮一个led)
    点击化学修饰糖TCO-PEG-alginate 反式环辛烯-聚乙二醇-海藻酸钠 (TCO-PEG-半乳糖,乳糖基,纤维二糖,葡萄糖)
    数据库系统原理与应用教程(059)—— MySQL 练习题:操作题 1-10(三)
    【Java|golang】655. 输出二叉树----深度搜索以及确认深度
    【Pytorch with fastai】第 18 章 :使用 CAM 进行 CNN 解释
    【JAVA刷题初阶】刷爆力扣第十一弹——二叉树
    激活国企数据资产:管好用好释放要素价值
    go初识iris框架(六) - session使用和控制
  • 原文地址:https://blog.csdn.net/HashMapArrayList/article/details/132984975