dispatch:基于 Knative 的 serverless 应用部署管理框架

Dispatch is a framework for deploying and managing serverless style applications.

分支18Tags29
文件最后提交记录最后更新时间
8 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
7 年前
8 年前
7 年前
7 年前
8 年前
7 年前
7 年前
8 年前
7 年前
8 年前
5 年前
7 年前

**重要提示:**VMware 已停止对此项目的积极开发,此代码库将不再更新。

Dispatch

**注意:**这是 Dispatch 的 Knative 分支。完整功能的 Dispatch 还有一段时间才能完成。这里的代码代表正在进行中的工作。关于 Dispatch Solo(作为 OVA 分发的 Dispatch 版本)的信息,请参阅 solo 分支文档

Dispatch 是一个用于部署和管理无服务器风格应用程序的框架。其目的是提供一个框架,让开发者能够构建由处理业务逻辑的函数和提供其他所有功能的服务定义的应用程序:

  • 状态(数据库)
  • 消息传递/事件(队列)
  • 入口(API 网关)
  • 等等。

我们的目标是提供一个可以作为无服务器应用程序框架的基础和扩展的底层结构。此外,框架必须提供工具和特性,以帮助开发者构建、调试和维护他们的无服务器应用程序。

文档

查看详细的 文档,包括 快速入门指南

架构

**注意:**本节中的信息特定于 Dispatch 的 Knative 分支。Dispatch Solo 的等效文档可以在 solo 分支 中找到。

下图说明了构成 Dispatch 项目的不同组件:

初始 Dispatch 架构图

安装

**注意:**本节中的信息特定于 Dispatch 的 Knative 分支。Dispatch Solo 的等效文档可以在 solo 分支 中找到。

先决条件

GKE

  1. 创建服务账户密钥

    export GCLOUD_KEY=<path to key.json>
    
  2. 创建 GKE 集群:

    K8S_VERSION=1.10.7-gke.6
    export CLUSTER_NAME=dispatch-knative
    gcloud container clusters create -m n1-standard-4 --cluster-version ${K8S_VERSION} ${CLUSTER_NAME}
    gcloud container clusters get-credentials ${CLUSTER_NAME}
    
  3. 安装 Knative:

    # 获取与 dispatch 一起使用的当前 knative 版本
    KNATIVE_VERSION=$(cat Gopkg.toml | grep -A 2 'name = "github.com/knative/serving"' | grep revision | cut -d '"' -f2)
    ./scripts/install-knative.py ${CLUSTER_NAME} --gcloud-key=${GCLOUD_KEY} --revision=${KNATIVE_VERSION}
    

VMware Cloud PKS

  1. 创建一个启用了特权模式的 Cloud PKS 集群。

    export VKE_CLUSTER=dispatch-knative
    vke cluster create --privilegedMode  --name $VKE_CLUSTER  --cluster-type PRODUCTION --region us-west-2
    
  2. 获取 kubectl 凭据:

    vke cluster auth setup $VKE_CLUSTER
    
  3. 安装 Knative:

    1. 安装 Istio:
      kubectl apply -f third-party/vmware-cloud-pks/istio-1.0.2/istio.yaml
      
    2. 等待 Istio pod 变为 READY(智能集群扩展可能需要一些时间):
      kubectl get pods -n istio-system
      NAME                                        READY     STATUS      RESTARTS   AGE
      istio-citadel-746c765786-2cm5p              1/1       Running     0          6m
      istio-cleanup-secrets-vbqk7                 0/1       Completed   0          6m
      istio-egressgateway-57df84cfcf-hpkx4        1/1       Running     0          6m
      istio-galley-5b4f774c-9gcqm                 1/1       Running     0          6m
      istio-ingressgateway-76dbd65c-7qf2w         1/1       Running     0          6m
      istio-pilot-7ddfbdf465-cj5jl                2/2       Running     0          6m
      istio-policy-56789fbb8c-flxkz               2/2       Running     0          6m
      istio-statsd-prom-bridge-7c77ddc9b9-s2zwl   1/1       Running     0          6m
      istio-telemetry-855bb88878-kbhsj
      
    3. 安装 Knative serving(包括构建):
      kubectl apply -f third-party/vmware-cloud-pks/serving-0.2.2/release.yaml
      

其他

要安装 Knative,请遵循 开发说明

Dispatch

安装 Dispatch 需要一个安装了 Knative 组件(构建、服务以及即将推出的事件)的 Kubernetes 集群。以下是如何构建和安装 dispatch 的步骤:

  1. 设置以下环境变量:

    export DISPATCH_NAMESPACE="default"
    export DISPATCH_DEBUG="true"
    export RELEASE_NAME="dispatch"
    export MINIO_USERNAME="dispatch"
    export MINIO_PASSWORD="dispatch"
    export INGRESS_IP=$(kubectl get service -n istio-system knative-ingressgateway -o wide | tail -n1 | awk '{print $4}')
    
  2. 构建并发布一个 dispatch 镜像(替换为你的 docker 仓库):

    注意:如果你只想使用一个预先创建的镜像,使用脚本创建你的 values.yaml 并继续第 4 步。

    TAG="v0.1.22-knative" ./scripts/values.sh
    
    DISPATCH_SERVER_DOCKER_REPOSITORY=<docker repository username> PUSH_IMAGES=1 make images
    
  3. 上一步将输出一个配置文件 values.yaml

    image:
      host: username
      tag: v0.1.xx
    registry:
      url: http://dispatch-docker-registry:5000/
      repository: dispatch-docker-registry:5000
    storage:
      minio:
        address: dispatch-minio:9000
        username: ********
        password: ********
    
  4. 通过 helm 图表部署(如果 helm 未安装和初始化,请先执行):

    helm init --wait
    # helm 不会覆盖现有的 config-maps(至少在第一次/安装时不会),所以明确删除它们。
    kubectl delete configmap -n knative-serving config-domain config-network
    helm dependency build ./charts/dispatch/
    helm upgrade -i --debug ${RELEASE_NAME} ./charts/dispatch --namespace ${DISPATCH_NAMESPACE} -f values.yaml
    

    **注意:**使用以下命令为 tiller 创建集群角色绑定:

    kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
    
  5. 重新配置 Knative 服务(需要将我们的内部仓库添加到白名单):

    ./scripts/configure-knative.sh
    
  6. 构建 CLI(如果需要,将 darwin 替换为 linux):

    make cli-darwin
    # 创建到二进制文件的符号链接
    ln -s `pwd`/bin/dispatch-darwin /usr/local/bin/dispatch
    
  7. 创建 Dispatch 配置:

    cat << EOF > config.json
    {
      "current": "${RELEASE_NAME}",
      "contexts": {
        "${RELEASE_NAME}": {
          "host": "$(kubectl -n ${DISPATCH_NAMESPACE} get service ${RELEASE_NAME}-nginx-ingress-controller -o wide | tail -n1 | awk '{print $4}')",
          "port": 443,
          "scheme": "https",
          "insecure": true
        }
      }
    }
    EOF
    # 指向配置文件(也可以移动到 ~/.dispatch/config)
    export DISPATCH_CONFIG=`pwd`/config.json
    
  8. 测试你的安装: 首先,创建一个基础镜像:

    dispatch create base-image python3-base dispatchframework/python3-base:0.0.13-knative
    Created baseimage: python3-base
    

    然后,创建一个镜像:

    dispatch create image python3 python3-base
    Created image: python3
    

    等待状态变为 READY:

    dispatch get images
       NAME  | DESTINATION | BASEIMAGE | STATUS |         CREATED DATE
    --------------------------------------------------------------------------
     python3 | *********** | ********* | READY  | Tue Sep 25 16:51:35 PDT 2018
    

    创建一个函数:

    dispatch create function --image python3 hello ./examples/python3/hello.py
    Created function: hello
    

    等状态变为 READY:

    dispatch get function
       NAME  | FUNCTIONIMAGE | STATUS |         CREATED DATE
    ----------------------------------------------------------------
      hello  | ************* | READY  | Thu Sep 13 12:41:07 PDT 2018
    

    执行函数:

    dispatch exec hello <<< '{"name": "user"}' | jq .
    {
      "context": {
        "logs": {
          "stdout": [
            "messages to stdout show up in logs"
          ],
          "stderr": null
        }
      },
      "payload": {
        "myField": "Hello, user from Nowhere"
      }
    }
    

    创建一个端点:

    dispatch create endpoint get-hello hello --method GET --method POST --path /hello
    

    使用 curl 打击端点:

    curl -v http://${INGRESS_IP}/hello?name=Jon -H 'Host: default.${DISPATCH_NAMESPACE}.dispatch.local'
    

有关更完整的快速入门,请参阅 开发者文档

项目介绍

Dispatch is a framework for deploying and managing serverless style applications.

定制我的领域