这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。
为什么在Knative应用程序之上使用网关
为了解释这一点,让我谈谈我以前的博客文章。 假设在Kubernetes环境中已经可以使用Knative服务 ,则部署应用程序的方法是使用清单,如下所示:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:name: sample-boot-knative-servicenamespace: default
spec:runLatest:configuration:revisionTemplate:spec:container:image: bijukunjummen/sample-boot-knative-app:0.0.3-SNAPSHOTenv:- name: ASAMPLE_ENVvalue: "sample-env-val"
现在要调用此应用程序,我必须通过Knative服务创建的入口进行调用,可以在minikube环境中通过以下方式获得该入口:
export GATEWAY_URL=$(echo $(minikube ip):$(kubectl get svc knative-ingressgateway -n istio-system -o 'jsonpath={.spec.ports[?(@.port==80)].nodePort}'))
现在,请求必须经过入口,并且入口使用Host http标头将请求路由到应用。 可以使用以下bash脚本获取已部署服务的主机头:
export APP_DOMAIN=$(kubectl get services.serving.knative.dev sample-boot-knative-service -o="jsonpath={.status.domain}")
然后使用CURL通过knative入口网关进行以下调用:
curl -X "POST" "http://${GATEWAY_URL}/messages" \-H "Accept: application/json" \-H "Content-Type: application/json" \-H "Host: ${APP_DOMAIN}" \-d $'{"id": "1","payload": "one","delay": "300"
}'
或使用httpie :
http http://${GATEWAY_URL}/messages Host:"${APP_DOMAIN}" id=1 payload=test delay=1
通过knative入口调用应用程序涉及太多步骤:
我在这篇文章中的目的是通过使用诸如Ambassador之类的网关来简化向应用程序拨打电话的用户体验。
驻基纳大使
将大使安装到Knative环境并没有什么特别的, 这里提供的出色说明在我的minikube环境中可以正常工作。
现在,此图概述了我的网关目标:
有了大使之后,用户要做的就是将请求发送到大使网关,在向Knative Ingress提出请求之前,它将负责插入Host标头。
那么,这是如何工作的,相当容易! 假设有适当的大使,它所需要的就是一个配置,该配置可以通过以下方式在Kubernetes服务上搭载:
---
apiVersion: v1
kind: Service
metadata:name: sample-knative-app-gatewayannotations:getambassador.io/config: |---apiVersion: ambassador/v0kind: Mappingname: sample-boot-knative-appprefix: /messagesrewrite: /messagesservice: knative-ingressgateway.istio-system.svc.cluster.local host_rewrite: sample-boot-knative-service.default.example.com
spec:type: LoadBalancerports:- name: ambassadorport: 80targetPort: 80selector:service: ambassador
在这里,我通过Service注释提供配置,拦截对/ messages uri的所有调用,并将这些请求转发到knative ingressgatway服务(knative-ingressgateway.istio-system.svc.cluster.local),并添加“ sample- boot-knative-service.default.example.com”。
现在,从用户的角度来看,交互要简单得多,我要做的就是使用以下bash脚本在minikube环境中获取此新服务的url并进行api调用:
export AMB_URL=$(echo $(minikube ip):$(kubectl get svc sample-knative-app-gateway -n default -o 'jsonpath={.spec.ports[?(@.port==80)].nodePort}'))http http://${AMB_URL}/messages id=1 payload=test delay=1
在真实的代码上尝试此操作可能会更容易,可在我的github存储库中找到该代码。
翻译自: https://www.javacodegeeks.com/2018/09/knative-serving-using-ambassador-gateway.html