K8S网络系列之三:流量新贵GatewayAPI


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集群, 例如使用浏览器。可以使用网关实现这个目标。

  1. 为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如下所示:

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
  1. 从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}')
  1. 设置GATEWAY_URL:
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
  1. 确认可以从集群外部访问应用
curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"

如果有正常输出,说明Istio提供的Gateway API可以正常工作了。


文章作者: 洪宇轩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 洪宇轩 !
评论
  目录