kubernetes Gateway API-部署和基础配置
文章目录
- 1 部署
- 2 最简单的 Gateway
- 3 基于主机名和请求头
- 4 重定向 Redirects
-
- 4.1 HTTP-to-HTTPS 重定向
- 4.2 路径重定向
-
- 4.2.1 ReplaceFullPath 替换完整路径
- 4.2.2 ReplacePrefixMatch 替换路径前缀
- 5 重写 Rewrites
-
- 5.1 重写 主机名
- 5.2 重写 路径
-
- 5.2.1 重新完整路径
- 5.2.1 重新部分路径(去除路径前缀)
- 6 HTTP Header 修饰符
-
- 6.1 HTTP Request Header Modifier
- 6.2 HTTP Response Header Modifier
- 7 HTTP流量拆分
-
- 7.1 指南示例
-
- 7.1.1 金丝雀流量发布
- 7.1.2 蓝绿流量发布
- 7.1.3 完成发布
- 8 请求镜像
1 部署
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
2 最简单的 Gateway
最简单的部署是由同一所有者一起部署的网关和路由资源。这代表了用于Ingress的类似模型。在本指南中,部署了一个网关和HTTPRoute,它们匹配所有HTTP流量,并将其定向到一个名为foo-svc的服务。
图片来自官方文档:https://gateway-api.sigs.k8s.io/guides/simple-gateway/
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: prod-web
spec:
gatewayClassName: example
listeners:
- protocol: HTTP
port: 80
name: prod-web-gw
allowedRoutes:
namespaces:
from: Same
3 基于主机名和请求头
HTTPRoute资源允许您匹配HTTP流量并将其定向到Kubernetes后端。本指南展示了HTTPRoute如何匹配主机、标头和路径字段上的流量,并将其转发到不同的Kubernetes服务。
下图描述了三种不同服务之间所需的流量:
-
foo.example.com/login
的流量被转发到foo-svc
-
请求头中带有
env:canary
的bar.example.com/*
流量被转发到bar-svc-canary
-
请求头部不带
env:canary
的bar.example.com/*
流量被转发到bar-svc
图片来源-https://gateway-api.sigs.k8s.io/guides/http-routing/
为了从网关接收流量,必须使用 ParentRefs
配置 HTTPRoute
资源,ParentRefs
引用它应该连接到的父网关。以下示例显示了如何配置 Gateway
和 HTTPRoute
的组合来服务HTTP流量:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: example-gateway
spec:
gatewayClassName: example-gateway-class
listeners:
- name: http
protocol: HTTP
port: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: example-route
spec:
parentRefs:
- name: example-gateway
hostnames:
- "example.com"
rules:
- backendRefs:
- name: example-svc
port: 80
HTTPRoute可以与一组主机名匹配。在HTTPRoute中进行任何其他匹配之前,先匹配这些主机名。由于 foo.example.com
和 bar.example.com
是具有不同路由要求的独立主机,因此每个主机需要分别配置并创建自己的 HTTPRoute: foo-route
和 bar-route
。
以下 foo-route
将匹配 foo.example.com
的任何流量,并应用其路由规则将流量转发到正确的后端。由于只指定了一个匹配项,因此只会转发foo.example.com/login/*
的流量。不以 /login
开头的任何其他路径的流量都不会与此路由匹配。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: foo-route
spec:
parentRefs:
- name: example-gateway
hostnames:
- "foo.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /login
backendRefs:
- name: foo-svc
port: 8080
同样,bar-route
HTTPRoute与 bar.example.com
的流量相匹配。此主机名的所有流量都将根据路由规则进行评估。最具体的匹配将优先,这意味着任何带有 env:canary
标头的流量都将被转发到 bar-svc-canary
,如果标头丢失或不是 canary
,则将被转发给 bar-svc
。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: bar-route
spec:
parentRefs:
- name: example-gateway
hostnames:
- "bar.example.com"
rules:
- matches:
- headers:
- type: Exact # 精确匹配
name: env
value: canary
backendRefs:
- name: bar-svc-canary
port: 8080
####################################
- backendRefs: # 这个相当于默认的后端服务了
- name: bar-svc
port: 8080
4 重定向 Redirects
重定向是代理端返回给客户端修改后的,新的请求地址,让客户端用这个新的请求地址重新发送请求给代理端。
重定向向客户端返回HTTP 3XX响应,指示其检索其他资源。RequestRedirect规则筛选器指示网关对与筛选的HTTPRoute规则匹配的请求发出重定向响应。
重定向过滤器可以独立替换各种URL组件。例如,要发出从HTTP到HTTPS的永久重定向(301),请配置
requestRedirect.statusCode=301
和 requestRedirect.schem="HTTPS"
:
apiVersion: