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

2023-09-18 16:35:28

前言

最近在做标准产品在不同云平台中的部署验证,有幸体验了一下微软的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

总结

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

更多推荐

开箱即⽤!HashData 云数仓上线华为蓝鲸应⽤商城

近⽇,经过华为对企业技术、产品和服务能⼒的综合评估,酷克数据企业级云原⽣数据仓库HashData通过与华为OceanStorPacific分布式存储的适配与优化,形成⼀体化解决⽅案,成功上线华为蓝鲸应⽤商城。图1:华为蓝鲸商城HashData产品⻚⾯华为蓝鲸应⽤商城是华为数据存储产品线与合作伙伴联合打造的⼀站式IT应⽤

【无标题】

TCP简单的TCP协议的Python实现,包括服务器和客户端服务器端importsocket#定义服务器地址和端口号server_address=('localhost',8000)#创建TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREA

微服务简介

微服务简介微服务架构是一种软件架构模式,它将一个大型应用程序拆分为一组小型、独立的服务,每个服务都有自己的业务逻辑和数据存储。这些服务可以独立开发、部署和扩展,通常使用HTTP或其他轻量级通信协议进行通信。以下是微服务架构的一些关键特点和概念:微服务独立性:每个微服务都是独立的,拥有自己的数据库、业务逻辑和用户界面。这

MySQL的sql_mode合理设置

MySQL的sql_mode合理设置1、sql_mode设置介绍说明sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。showvariab

用于设计和分析具有恒定近心点半径的低推力螺旋轨迹研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述本文可用于设计和分析具有恒定近心点半径的低推力螺旋

亚马逊、沃尔玛测评养号、采退需要解决防关联哪些问题?

大家好我是跨境平台测评养号七年从事经验的珑哥。养号环境软件开发,深度解决平台矩阵养号防关联,砍单,F号问题。今天我给大家讲一下做亚马逊、沃尔玛测评项目需要用到的防关联、防封号环境的一些底层技术原理。这里讲的内容我相信很少有人能掌握,都是一些比较难的IT术技。如果你现在正考虑开始进行测评,那么在了解阶段,我建议你首先仔细

Mybatis自动映射Java对象 与 MySQL8后的JSON数据

文章目录Mybatis自动映射Java对象与MySQL8后的JSON数据1.转化成为正常Json类型1.1JsonTypeHander1.2ListJsonTypeHandler负责List<T>类型1.3实体类1.4mapper1.5测试类2.存储为携带类型的JsonMybatis自动映射Java对象与MySQL8后

散列(哈希)查找的定义,常见的散列函数设计以及处理哈希冲突方法

1.散列表1.散列表的定义散列表(HashTable),又称哈希表。是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关。特点:若不同的关键字通过散列函数映射到同一个值,则称它们为“同义词”。通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”。2.处理冲突的方法1:拉链法(链地址法)用拉链法(又称

LeetCode_拓扑排序_困难_2603.收集树中金币

目录1.题目2.思路3.代码实现(Java)1.题目给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处

conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题

上一篇博客《conan入门(二十七):因profile[env]字段废弃导致的boost/1.81.0在aarch64-linux-gnu下交叉编译失败》解决了conan1.60.0交叉编译boost/1.80.1的问题后,我继续交叉编译openssl/3.1.2时又报错了conaninstallopenssl/3.1

片上网络(2)拓扑结构

前言片上网络的拓扑(topology)确定了网络中节点和通道之间的物理布局和连接。拓扑对网络的整体成本效率(cost-performance)有相当重要的影响。拓扑决定了一条消息的跳数或经过的路由器个数,以及每跳经过的互连线的物理距离,因此会对网络延迟产生显著的影响。因为信息经过路由器(router)和链路(link)

热文推荐