1 - 安装

本文档将介绍如何安装 OpenFunction。

先决条件

  • 您需要拥有一个 Kubernetes 集群。

  • 您需要确保您的 Kubernetes 版本满足以下兼容性矩阵中描述的要求。

OpenFunction VersionKubernetes 1.21Kubernetes 1.22Kubernetes 1.23Kubernetes 1.24Kubernetes 1.25Kubernetes 1.26+
HEADN/AN/A
v1.2N/AN/A
v1.1.xN/A
v1.0.xN/A

安装 OpenFunction

现在您可以使用 helm charts 安装 OpenFunction 及其所有依赖项。

ofn CLI 安装方法已经弃用。

如果您想在离线环境中安装 OpenFunction,请参考 在离线环境中安装 OpenFunction

环境要求

  • Kubernetes version: >=v1.21.0-0
  • Helm version: >=v3.6.3

安装 OpenFunction helm charts 的步骤

  1. 首先运行以下命令添加 OpenFunction chart 仓库:

    helm repo add openfunction https://openfunction.github.io/charts/
    helm repo update
    
  2. 然后您有几个选项来设置 OpenFunction,您可以选择:

    • 安装所有组件:

      kubectl create namespace openfunction
      helm install openfunction openfunction/openfunction -n openfunction
      
    • 安装所有组件和 Revision Controller:

      kubectl create namespace openfunction
      helm install openfunction openfunction/openfunction -n openfunction --set revisionController.enable=true
      
    • 只安装 Serving(不包括 build):

      kubectl create namespace openfunction
      helm install openfunction --set global.ShipwrightBuild.enabled=false --set global.TektonPipelines.enabled=false openfunction/openfunction -n openfunction
      
    • 只安装 Knative 同步运行时:

      kubectl create namespace openfunction
      helm install openfunction --set global.Keda.enabled=false openfunction/openfunction -n openfunction
      
    • 只安装 OpenFunction 异步运行时:

      kubectl create namespace openfunction
      helm install openfunction --set global.Contour.enabled=false  --set global.KnativeServing.enabled=false openfunction/openfunction -n openfunction
      
  3. Run the following command to verify OpenFunction is up and running:

    kubectl get po -n openfunction
    

卸载 OpenFunction

Helm

如果您使用 Helm 安装了 OpenFunction,请运行以下命令来卸载 OpenFunction 及其依赖项。

helm uninstall openfunction -n openfunction

升级 OpenFunction

helm upgrade [RELEASE_NAME] openfunction/openfunction -n openfunction

使用 Helm v3,chart 创建的 CRD 默认不会更新,应手动更新。 另请参阅 Helm 关于 CRD 的文档

参考 to helm upgrade 以获取命令文档。

将现有的发布升级到新版本

从 OpenFunction v0.6.0 升级到 OpenFunction v0.7.x

从 v0.6.0 升级到 0.7.x 有一个破坏性的变化,需要额外的手动操作。

卸载 Chart

首先,您需要卸载旧的 openfunction release:

helm uninstall openfunction -n openfunction

确认组件命名空间已被删除,这需要一些时间:

kubectl get ns -o=jsonpath='{range .items[?(@.metadata.annotations.meta\.helm\.sh/release-name=="openfunction")]}{.metadata.name}: {.status.phase}{"\n"}{end}'

如果 knative-serving 命名空间长时间处于终止状态,尝试运行以下命令并删除 finalizers:

kubectl edit ingresses.networking.internal.knative.dev -n knative-serving

升级 OpenFunction CRDs

kubectl apply -f https://openfunction.sh1a.qingstor.com/crds/v0.7.0/openfunction.yaml

升级依赖组件的 CRDs

您只需要处理现有发布中包含的组件。

  • knative-serving CRDs
    kubectl apply -f https://openfunction.sh1a.qingstor.com/crds/v0.7.0/knative-serving.yaml
    
  • shipwright-build CRDs
    kubectl apply -f https://openfunction.sh1a.qingstor.com/crds/v0.7.0/shipwright-build.yaml
    
  • tekton-pipelines CRDs
    kubectl apply -f https://openfunction.sh1a.qingstor.com/crds/v0.7.0/tekton-pipelines.yaml
    

安装新 chart

helm repo update
helm install openfunction openfunction/openfunction -n openfunction

2 - 开始使用

2.1 - 先决条件

镜像仓库凭证

在构建函数时,您需要将函数容器镜像推送到像Docker HubQuay.io这样的容器镜像仓库。为此,您首先需要为您的容器镜像仓库生成一个密钥。

您可以通过填写REGISTRY_SERVERREGISTRY_USERREGISTRY_PASSWORD字段,然后运行以下命令来创建此密钥。

REGISTRY_SERVER=https://index.docker.io/v1/
REGISTRY_USER=<your_registry_user>
REGISTRY_PASSWORD=<your_registry_password>
kubectl create secret docker-registry push-secret \
 --docker-server=$REGISTRY_SERVER \
 --docker-username=$REGISTRY_USER \
 --docker-password=$REGISTRY_PASSWORD

源代码库凭证

如果您的源代码位于私有git仓库中,您需要创建一个包含私有git仓库的用户名和密码的密钥:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: git-repo-secret
  annotations:
    build.shipwright.io/referenced.secret: "true"
type: kubernetes.io/basic-auth
stringData:
  username: <cleartext username>
  password: <cleartext password>
EOF

然后,您可以在Function CR的spec.build.srcRepo.credentials中引用此密钥

apiVersion: core.openfunction.io/v1beta1
kind: Function
metadata:
  name: function-sample
spec:
  version: "v2.0.0"
  image: "openfunctiondev/sample-go-func:v1"
  imageCredentials:
    name: push-secret
  build:
    builder: openfunction/builder-go:latest
    env:
      FUNC_NAME: "HelloWorld"
      FUNC_CLEAR_SOURCE: "true"
    srcRepo:
      url: "https://github.com/OpenFunction/samples.git"
      sourceSubPath: "functions/knative/hello-world-go"
      revision: "main"
      credentials:
         name: git-repo-secret
  serving:
    template:
      containers:
        - name: function # DO NOT change this
          imagePullPolicy: IfNotPresent
    runtime: "knative"

Kafka

异步函数可以由消息队列中的事件触发,如Kafka,这里您可以找到设置Kafka集群的步骤,用于演示目的。

  1. 在默认命名空间中安装strimzi-kafka-operator

    helm repo add strimzi https://strimzi.io/charts/
    helm install kafka-operator -n default strimzi/strimzi-kafka-operator
    
  2. 运行以下命令在默认命名空间中创建Kafka集群和Kafka Topic。此命令创建的Kafka和Zookeeper集群的存储类型为ephemeral,并使用emptyDir进行演示。

    这里我们创建一个名为<kafka-server>的1副本Kafka服务器和一个名为<kafka-topic>的1副本主题,带有10个分区

    cat <<EOF | kubectl apply -f -
    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: <kafka-server>
      namespace: default
    spec:
      kafka:
        version: 3.3.1
        replicas: 1
        listeners:
          - name: plain
            port: 9092
            type: internal
            tls: false
          - name: tls
            port: 9093
            type: internal
            tls: true
        config:
          offsets.topic.replication.factor: 1
          transaction.state.log.replication.factor: 1
          transaction.state.log.min.isr: 1
          default.replication.factor: 1
          min.insync.replicas: 1
          inter.broker.protocol.version: "3.1"
        storage:
          type: ephemeral
      zookeeper:
        replicas: 1
        storage:
          type: ephemeral
      entityOperator:
        topicOperator: {}
        userOperator: {}
    ---
    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: <kafka-topic>
      namespace: default
      labels:
        strimzi.io/cluster: <kafka-server>
    spec:
      partitions: 10
      replicas: 1
      config:
        cleanup.policy: delete
        retention.ms: 7200000
        segment.bytes: 1073741824
    EOF
    
  3. 运行以下命令检查Pod状态,并等待Kafka和Zookeeper运行并启动。

    $ kubectl get po
    NAME                                              READY   STATUS        RESTARTS   AGE
    <kafka-server>-entity-operator-568957ff84-nmtlw   3/3     Running       0          8m42s
    <kafka-server>-kafka-0                            1/1     Running       0          9m13s
    <kafka-server>-zookeeper-0                        1/1     Running       0          9m46s
    strimzi-cluster-operator-687fdd6f77-cwmgm         1/1     Running       0          11m
    

    运行以下命令查看Kafka集群的元数据。

    $ kafkacat -L -b <kafka-server>-kafka-brokers:9092
    

WasmEdge

函数现在支持使用WasmEdge作为工作负载运行时,这里您可以找到在Kubernetes集群中设置WasmEdge工作负载运行时的步骤(以containerd为容器运行时)。

您应在集群的所有节点(或将承载wasm工作负载的节点的子集)上运行以下步骤。

步骤1:安装WasmEdge

安装WasmEdge的最简单方法是运行以下命令。您的系统应已安装git和curl。

wget -qO- https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- -p /usr/local

步骤2:安装容器运行时

crun

crun项目已经内置了WasmEdge支持。现在,最简单的方法就是下载二进制文件并将其移动到/usr/local/bin/

wget https://github.com/OpenFunction/OpenFunction/releases/latest/download/crun-linux-amd64
mv crun-linux-amd64 /usr/local/bin/crun

如果上述方法对您不起作用,请参考构建并安装带有WasmEdge支持的crun二进制文件。

步骤3:设置CRI运行时

选项1:containerd

您可以按照此安装指南来安装containerd,并按照此设置指南来为Kubernetes设置containerd。

首先,编辑配置/etc/containerd/config.toml,添加以下部分来设置crun运行时,确保BinaryName等于您的crun二进制路径

# Add crun runtime here
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun]
  runtime_type = "io.containerd.runc.v2"
  pod_annotations = ["*.wasm.*", "wasm.*", "module.wasm.image/*", "*.module.wasm.image", "module.wasm.image/variant.*"]
  privileged_without_host_devices = false
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun.options]
    BinaryName = "/usr/local/bin/crun"

接下来,重启containerd服务:

sudo systemctl restart containerd

选项2:CRI-O

您可以按照此安装指南来安装CRI-O,并按照此设置指南来为Kubernetes设置CRI-O。

CRI-O默认使用runc运行时,我们需要配置它来使用crun。这是通过添加到两个配置文件来完成的。

首先,创建一个/etc/crio/crio.conf文件,并添加以下行作为其内容。它告诉CRI-O默认使用crun。

[crio.runtime]
default_runtime = "crun"

crun运行时反过来在/etc/crio/crio.conf.d/01-crio-runc.conf文件中定义。

[crio.runtime.runtimes.runc]
runtime_path = "/usr/lib/cri-o-runc/sbin/runc"
runtime_type = "oci"
runtime_root = "/run/runc"
# The above is the original content

# Add crun runtime here
[crio.runtime.runtimes.crun]
runtime_path = "/usr/local/bin/crun"
runtime_type = "oci"
runtime_root = "/run/crun"

接下来,重启CRI-O以应用配置更改。

systemctl restart crio

2.2 - 创建同步函数

在创建任何函数之前,请确保您已安装所有的先决条件

同步函数是其输入为HTTP请求的有效载荷的函数,输出或响应在函数逻辑处理输入有效载荷后立即发送给等待的客户端。以下是不同语言的一些同步函数示例:

同步函数
GoHello World, 多函数, 带路径参数的同步函数, 日志处理, 带输出绑定的同步函数
NodejsHello World, 带输出绑定的同步函数
PythonHello World
JavaHello World, 带输出的同步函数
DotNetHello World

您可以在这里找到更多函数示例

2.3 - 创建异步函数

在创建任何函数之前,请确保您已安装所有先决条件

异步函数是事件驱动的,它们的输入通常是来自非HTTP事件源的事件,如消息队列、cron触发器、MQTT代理等,通常客户端在通过传递事件触发异步函数后不会等待立即的响应。以下是不同语言的一些异步函数示例:

异步函数
GoKafka输入和HTTP输出绑定, Cron输入和Kafka输出绑定, Cron输入绑定, Kafka输入绑定, Kafka pubsub
NodejsMQTT绑定和pubsub
Python
JavaCron输入和Kafka输出绑定, Kafka pubsub
DotNet

您可以在这里找到更多函数示例

2.4 - 创建无服务器应用

在创建任何函数之前,请确保您已安装所有的先决条件

除了构建和运行无服务器函数,您还可以使用OpenFunction构建和运行无服务器应用。

这里有一些无服务器应用的示例:

无服务器应用
Go带有Dockerfile的Go应用
Java带有Dockerfile的Java应用, 不带Dockerfile的Java应用 & 源代码

您可以在这里找到关于这些无服务器应用的更多信息

2.5 - 创建Wasm函数

在创建任何函数之前,请确保您已安装所有的先决条件

这里有一些Wasm函数的示例:

语言Wasm函数运行时
Rustwasmedge-http-serverwasmedge

您可以在这里找到关于这些函数的更多信息