GatewayAPI是一个K8S官方项目,聚焦于提供L4和L7层的流量路由。该项目代表了下一代K8S流量入口、负载均衡和服务网格。
GatewayAPI提供了一组CRDs,这些CRD的结构和承担的角色如下图所示:
配置步骤
安装Gateway API
首先安装Gateway API包括的一系列CRDs,执行以下命令:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
如果打不开,可使用下面的文件
standard-install.yaml
选定一个Controller
安装好CRD以后,还需要找一个能提供Gateway API功能的controller实现方案,如下所示:
https://gateway-api.sigs.k8s.io/implementations/
本文选择其中的Istio来作为Gateway API的controller实现。
安装Istio
在Istio系列文章里面我们介绍过安装Istio,但该文中使用的是Istio API
,本文我们将使用Istio提供的Gateway API
来实现。
首先需要安装Istio,过程略。
接着我们按照Bookinfo 应用这篇文档中的内容,来通过Gateway API实现流量控制。
按照前序操作,假设现在Bookinfo服务启动并运行中,现在需要使应用程序可以从外部访问Kubernetes集群, 例如使用浏览器。可以使用网关实现这个目标。
- 为Bookinfo应用程序定义一个网关。使用以下命令创建Kubernetes Gateway:
kubectl apply -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml
gateway.gateway.networking.k8s.io/bookinfo-gateway created
httproute.gateway.networking.k8s.io/bookinfo created
其中bookinfo-gateway.yaml如下所示:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
gatewayClassName: istio
listeners:
- name: http
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: bookinfo
spec:
hostnames:
- "bookinfo.default.cicc.io"
parentRefs:
- name: bookinfo-gateway
rules:
- matches:
- path:
type: Exact
value: /productpage
- path:
type: PathPrefix
value: /static
- path:
type: Exact
value: /login
- path:
type: Exact
value: /logout
- path:
type: PathPrefix
value: /api/v1/products
backendRefs:
- name: productpage
port: 9080
- 从bookinfo网关资源处获取网关地址和端口:
export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}')
export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
- 设置GATEWAY_URL:
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
- 确认可以从集群外部访问应用
curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
如果有正常输出,说明Istio提供的Gateway API可以正常工作了。