这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用

为什么在Knative应用程序之上使用网关

为了解释这一点,让我谈谈我以前的博客文章。 假设在Kubernetes环境中已经可以使用Knative服务 ,则部署应用程序的方法是使用清单,如下所示:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: sample-boot-knative-service
  namespace: default
spec:
  runLatest:
    configuration:
      revisionTemplate:
        spec:
          container:
            image: bijukunjummen/sample-boot-knative-app:0.0.3-SNAPSHOT
            env:
            - name: ASAMPLE_ENV
              value: "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-gateway
  annotations:
    getambassador.io/config: |
      ---
      apiVersion: ambassador/v0
      kind:  Mapping
      name: sample-boot-knative-app
      prefix: /messages
      rewrite: /messages
      service: knative-ingressgateway.istio-system.svc.cluster.local 
      host_rewrite: sample-boot-knative-service.default.example.com
spec:
  type: LoadBalancer
  ports:
  - name: ambassador
    port: 80
    targetPort: 80
  selector:
    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

相关文章: