除了構建和執行 Serverless 函式之外,OpenFuntion 還支援構建和執行 Serverless 應用。因此,OpenFunction 使用者可以不用侷限在各語言的 functions-framework 內編寫應用,並且可以採用自己喜歡的任何語言來編寫應用,即使 OpenFunction 社群尚未提供 functions-framework 支援(如 Rust, kotlin 等)。
OpenFunction 有兩種方式可以將應用原始碼打包到容器映象中:
- 使用 Cloud Native Buildpacks 構建映象(無需 Dockerfile);
- 使用 Buildah 或 BuildKit 構建映象。
⚠️注意:你需要提前建立一個包含映象倉庫憑證的 Secret,並將該 Secret 新增到 imageCredentials 中,才能將構建好的映象推送到映象倉庫。詳情可參考文件中的前提條件部分。
使用 Dockerfile 構建並執行 Serverless 應用
如果你已經為你的應用建立了 Dockerfile(參考 Go 應用示例),可以透過一些的步驟來構建執行應用:
1️⃣ 建立 Go 語言 Serverless 應用示例
$ cat <<EOF | kubectl apply -f -
apiVersion: core.openfunction.io/v1beta1
kind: Function
metadata:
name: sample-go-app
spec:
version: "v1.0.0"
image: "openfunctiondev/sample-go-app:v1"
imageCredentials:
name: push-secret
#port: 8080 # default to 8080
build:
builder: openfunction/buildah:v1.23.1
srcRepo:
url: "https://github.com/OpenFunction/samples.git"
sourceSubPath: "apps/buildah/go"
revision: "main"
shipwright:
strategy:
name: buildah
kind: ClusterBuildStrategy
serving:
runtime: knative
template:
containers:
- name: function
imagePullPolicy: IfNotPresent
EOF
2️⃣ 檢視應用狀態
$ kubectl get functions.core.openfunction.io -w
NAME BUILDSTATE SERVINGSTATE BUILDER SERVING ADDRESS AGE
sample-go-app Succeeded Running builder-jgnzp serving-q6wdp http://sample-go-app.default.svc.cluster.local/ 22m
3️⃣ 訪問應用
一旦 BUILDSTATE
變成 Succeeded
,SERVINGSTATE
變成 Running
,你就可以透過 ADDRESS
欄位的地址訪問這個 Go Serverless 應用。
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty
curl http://sample-go-app.default.svc.cluster.local
Java Serverless 應用示例可以參考這裡:https://github.com/OpenFuncti...
無需 Dockerfile 構建並執行 Serverless 應用
如果你沒有為應用建立 Dockerfile(參考 Java 應用示例),你可以透過以下的步驟直接使用 Cloud Native Buildpacks 來構建映象(參考 Java 應用示例)。
1️⃣ 建立 Java 語言 Serverless 應用示例
cat <<EOF | kubectl apply -f -
apiVersion: core.openfunction.io/v1beta1
kind: Function
metadata:
name: sample-java-app-buildpacks
spec:
version: "v1.0.0"
image: "openfunction/sample-java-app-buildpacks:v1"
imageCredentials:
name: push-secret
port: 8080 # default to 8080
build:
builder: "cnbs/sample-builder:alpine"
srcRepo:
url: "https://github.com/buildpacks/samples.git"
sourceSubPath: "apps/java-maven"
revision: "main"
serving:
runtime: "knative" # default to knative
template:
containers:
- name: function
imagePullPolicy: IfNotPresent
EOF
2️⃣ 檢視應用狀態
$ kubectl get functions.core.openfunction.io -w
NAME BUILDSTATE SERVINGSTATE BUILDER SERVING ADDRESS AGE
sample-java-app-buildpacks Succeeded Running builder-jgnzp serving-q6wdp http://sample-java-app-buildpacks.default.svc.cluster.local/ 22m
3️⃣ 訪問應用
一旦 BUILDSTATE
變成 Succeeded
,SERVINGSTATE
變成 Running
,你就可以透過 ADDRESS
欄位的地址訪問這個 JavaServerless 應用。
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty
curl http://sample-java-app-buildpacks.default.svc.cluster.local