快速入门
1 - 安装
本文档将介绍如何安装 OpenFunction。
先决条件
您需要拥有一个 Kubernetes 集群。
您需要确保您的 Kubernetes 版本满足以下兼容性矩阵中描述的要求。
OpenFunction Version | Kubernetes 1.21 | Kubernetes 1.22 | Kubernetes 1.23 | Kubernetes 1.24 | Kubernetes 1.25 | Kubernetes 1.26+ |
---|---|---|---|---|---|---|
HEAD | N/A | N/A | √ | √ | √ | √ |
v1.2 | N/A | N/A | √ | √ | √ | √ |
v1.1.x | √ | √ | √ | √ | √ | N/A |
v1.0.x | √ | √ | √ | √ | √ | N/A |
安装 OpenFunction
现在您可以使用 helm charts 安装 OpenFunction 及其所有依赖项。
ofn
CLI 安装方法已经弃用。
如果您想在离线环境中安装 OpenFunction,请参考 在离线环境中安装 OpenFunction
环境要求
- Kubernetes version:
>=v1.21.0-0
- Helm version:
>=v3.6.3
安装 OpenFunction helm charts 的步骤
首先运行以下命令添加 OpenFunction chart 仓库:
helm repo add openfunction https://openfunction.github.io/charts/ helm repo update
然后您有几个选项来设置 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
Note
关于如何使用 Helm 安装 OpenFunction 的更多信息,请参见 使用 Helm 安装 OpenFunction.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
Note
关于如何使用 Helm 卸载 OpenFunction 的更多信息,请参见 使用 Helm 卸载 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
Note
有关如何使用 Helm 升级 OpenFunction 的更多信息,请参见 使用 Helm 升级 OpenFunction.2 - 开始使用
2.1 - 先决条件
镜像仓库凭证
在构建函数时,您需要将函数容器镜像推送到像Docker Hub或Quay.io这样的容器镜像仓库。为此,您首先需要为您的容器镜像仓库生成一个密钥。
您可以通过填写REGISTRY_SERVER
,REGISTRY_USER
和REGISTRY_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集群的步骤,用于演示目的。
在默认命名空间中安装strimzi-kafka-operator。
helm repo add strimzi https://strimzi.io/charts/ helm install kafka-operator -n default strimzi/strimzi-kafka-operator
运行以下命令在默认命名空间中创建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
运行以下命令检查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
首先,编辑配置/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默认使用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请求的有效载荷的函数,输出或响应在函数逻辑处理输入有效载荷后立即发送给等待的客户端。以下是不同语言的一些同步函数示例:
同步函数 | |
---|---|
Go | Hello World, 多函数, 带路径参数的同步函数, 日志处理, 带输出绑定的同步函数 |
Nodejs | Hello World, 带输出绑定的同步函数 |
Python | Hello World |
Java | Hello World, 带输出的同步函数 |
DotNet | Hello World |
您可以在这里找到更多函数示例
2.3 - 创建异步函数
在创建任何函数之前,请确保您已安装所有先决条件
异步函数是事件驱动的,它们的输入通常是来自非HTTP事件源的事件,如消息队列、cron触发器、MQTT代理等,通常客户端在通过传递事件触发异步函数后不会等待立即的响应。以下是不同语言的一些异步函数示例:
异步函数 | |
---|---|
Go | Kafka输入和HTTP输出绑定, Cron输入和Kafka输出绑定, Cron输入绑定, Kafka输入绑定, Kafka pubsub |
Nodejs | MQTT绑定和pubsub |
Python | |
Java | Cron输入和Kafka输出绑定, Kafka pubsub |
DotNet |
您可以在这里找到更多函数示例
2.4 - 创建无服务器应用
在创建任何函数之前,请确保您已安装所有的先决条件
除了构建和运行无服务器函数,您还可以使用OpenFunction构建和运行无服务器应用。
这里有一些无服务器应用的示例:
无服务器应用 | |
---|---|
Go | 带有Dockerfile的Go应用 |
Java | 带有Dockerfile的Java应用, 不带Dockerfile的Java应用 & 源代码 |
您可以在这里找到关于这些无服务器应用的更多信息
2.5 - 创建Wasm函数
在创建任何函数之前,请确保您已安装所有的先决条件
这里有一些Wasm函数的示例:
语言 | Wasm函数 | 运行时 |
---|---|---|
Rust | wasmedge-http-server | wasmedge |
您可以在这里找到关于这些函数的更多信息