Kubernetes Gateway API
许多 Istio 流量管理文档均囊括了 Istio 或 Kubernetes API 的使用说明(例如请参阅控制入站流量)。 通过参照,您甚至从一开始就可以使用 Gateway API。
在大多数 Kubernetes 集群中,默认情况下不会安装 Gateway API。如果 Gateway API CRD 不存在,请安装:
使用 配置安装 Istio:
$ istioctl install --set profile=minimal -y
与 Istio API 的区别
Gateway API 与 Istio API (如 Gateway 和 VirtualService)有很多相似之处。 主资源使用相同的Gateway
名称,并且这些资源服务于相类似的目标。
新的 Gateway API 致力于从 Kubernetes 的各种 Ingress 实现(包括 Istio)中吸取经验, 以构建标准化的,独立于供应商的 API。 这些 API 通常与 Istio Gateway 和 VirtualService 具有相同的用途,但有一些关键的区别:
- Istio API 中的
Gateway
仅配置已部署的现有网关 Deployment/Service, 而在 Gateway API 中的Gateway
资源不仅配置也会部署网关。 有关更多信息,请参阅具体 部署方法 。 - 在 Istio
VirtualService
中,所有协议都在单一的资源中配置, - 而在 Gateway API 中,每种协议类型都有自己的资源,例如
HTTPRoute
和TCPRoute
。 - 虽然 Gateway API 提供了大量丰富的路由功能,但它还没有涵盖 Istio 的全部特性。 因此,正在进行的工作是扩展 API 以覆盖这些用例,以及利用 API 的 来更好地暴露 Istio 的功能。
有关 API 的信息,请参阅 文档。
在本例中,我们将部署一个简单的应用程序,并使用 Gateway
将其暴露到外部。
首先部署一个测试应用:
$ kubectl apply -f @samples/httpbin/httpbin.yaml@
部署 Gateway API 配置:
$ kubectl create namespace istio-ingress
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: gateway
namespace: istio-ingress
spec:
gatewayClassName: istio
listeners:
- name: default
hostname: "*.example.com"
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: All
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: http
namespace: default
spec:
parentRefs:
- name: gateway
namespace: istio-ingress
rules:
- matches:
- path:
type: PathPrefix
value: /get
backendRefs:
- name: httpbin
port: 8000
EOF
使用 curl 访问 httpbin 服务:
$ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST/get"
HTTP/1.1 200 OK
server: istio-envoy
...
请注意,使用 标志可以将 Host HTTP 标头设置为 “httpbin.example.com”。这一步是必需的,因为
HTTPRoute
已配置为处理”httpbin.example.com”的请求, 但是在测试环境中,该主机没有 DNS 绑定,只是将请求发送到入口 IP。访问其他没有被显式暴露的 URL 时,将看到 HTTP 404 错误:
$ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST/headers"
HTTP/1.1 404 Not Found
...
更新路由规则也会暴露
/headers
并为请求添加标头:$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: http
namespace: default
spec:
parentRefs:
- name: gateway
namespace: istio-ingress
hostnames: ["httpbin.example.com"]
rules:
- matches:
- path:
type: PathPrefix
value: /get
- path:
type: PathPrefix
value: /headers
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
add:
- name: my-added-header
value: added-value
- name: httpbin
port: 8000
EOF
再次访问
/headers
,注意到My-Added-Header
标头已被添加到请求:
部署方法
在上面的示例中,在配置网关之前,您不需要安装 ingress 网关 Deployment
。 因为在默认配置中会根据 Gateway
配置自动分发网关Deployment
和 Service
。 但是对于高级别的用例,仍然允许手动部署。
默认情况下,每个 Gateway
将自动提供相同名称的 Service
和 Deployment
。 如果 Gateway
发生变化(例如添加了一个新端口),这些配置将会自动更新。
这些资源可以通过以下几种方式进行定义:
将
Gateway
上的注释和标签复制到Service
和Deployment
。 这就允许配置从上述字段中读取到的内容,如配置等。Istio 提供了一个额外的注释来配置生成的资源:
-
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: gateway
spec:
addresses:
- value: 192.0.2.0
type: IPAddress
...
请注意:仅能指定一个地址。
- (高级用法)生成的 Pod 配置可以通过自定义注入模板进行配置。
手动部署
如果您不希望使用自动部署,可以进行手动配置 Deployment
和 Service
。
完成此选项后,您将需要手动将 Gateway
链接到 Service
,并保持它们的端口配置同步。
要将 Gateway
链接到 Service
,需要将 addresses
字段配置为指向单个主机名。
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: gateway
spec:
addresses:
- value: ingress.istio-gateways.svc.cluster.local
type: Hostname
...
使用 Gateway API 配置内部网格流量目前是一个还在开发的实验性特性, 还处于未决(pending)状态。
Gateway API 也可以用来配置网格流量。 具体做法是配置 parentRef
指向一个服务,而不是指向一个 Gateway。
例如,要将所有调用的头部添加到一个名为 example
的集群内 Service
:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: mesh
spec:
parentRefs:
- kind: Service
name: example
rules:
- filters:
- type: RequestHeaderModifier
requestHeaderModifier:
add:
- name: my-added-header
value: added-value
- backendRefs:
- name: example
port: 80
有关更多详情和示例,请参阅其他流量管理。
清理
卸载 Istio 和
httpbin
示例: