1 - OpenFunction CLI

Learn how to use the CLI of OpenFunction.

This document describes how to use the CLI of OpenFunction.

Overview

ofn is the command-line interface for OpenFunction. It helps you install and manage OpenFuntion.

The following table describes the main commands supported by ofn.

CommandDescription
initProvides management for the framework of OpenFunction.
installInstalls OpenFunction and its dependencies.
uninstallUninstalls OpenFunction and its dependencies.
createCreates a function from a file or stdin.
applyApplies a function from a file or stdin.
demoCreates a kind cluster to install OpenFunction and run its demo.
getPrints a table of the most important information about the specified function.
get builderPrints important information about the Builder.
get servingPrints important information about the Serving.
deleteDeletes the specified function.

Use ofn to Install and Uninstall OpenFunction

  1. Run the following command to download ofn.

    wget -c  https://github.com/OpenFunction/cli/releases/latest/download/ofn_linux_amd64.tar.gz -O - | tar -xz
    
  2. Run un the following commands to make ofn executable and move it to /usr/local/bin/.

    chmod +x ofn && mv ofn /usr/local/bin/
    
  3. Run the following command to install OpenFunction.

    ofn install --all
    
  4. Run the following command to uninstall OpenFunction and its dependencies.

    ofn uninstall --all
    

ofn install Parameters

The following table describes parameters available for the ofn install command.

ParameterDescription
–allFor installing all dependencies.
–asyncFor installing OpenFunction Async runtime (Dapr & KEDA).
–cert-managerFor installing Cert Manager.
–daprFor installing Dapr.
–dry-runFor previewing the components and their versions to be installed.
–ingressFor installing Ingress Nginx.
–kedaFor installing KEDA.
–knativeFor installing Knative Serving (with Kourier as the default gateway).
–region-cnFor users who have limited access to gcr.io or github.com. If you add this parameter in the ofn install command, you have to add it again in the ofn uninstall command.
–shipwrightFor installing Shipwright.
–syncFor installing OpenFunction Sync runtime (to be supported).
–upgradeFor upgrading components to target versions during installation.
–yesFor automatically passing yes to prompts. (-y for short)
–verboseFor displaying detailed information.
–version < version number>For specifying any stable version or the latest version of OpenFunction for installation. (default “v0.4.0”) If not specified, the latest stable version will be installed.
–timeout < duration >For specifying the timeout duration, which defaults to 5 minutes.

ofn uninstall Parameters

The following table describes parameters available for the ofn uninstall command.

ParameterDescription
–allFor uninstalling all dependencies.
–asyncFor uninstalling OpenFunction Async runtime (Dapr & KEDA).
–cert-managerFor uninstalling Cert Manager.
–daprFor uninstalling Dapr.
–dry-runFor previewing the components and their versions to be uninstalled.
–ingressFor uninstalling Ingress Nginx.
–kedaFor uninstalling KEDA.
–knativeFor uninstalling Knative Serving (with Kourier as the default gateway).
–region-cnFor users who have limited access to gcr.io or github.com. If you add this parameter in the ofn install command, you have to add it again in the ofn uninstall command.
–shipwrightFor uninstalling Shipwright.
–syncFor uninstalling OpenFunction Sync runtime (to be supported).
–verboseFor displaying detailed information.
–yesFor automatically passing yes to prompts. (-y for short)
–version < version number>For specifying any stable version or the latest version of OpenFunction to be uninstalled. If not specified, the currently installed version will be uninstalled.
–waitFor awaiting the results of the uninstallation until namespaces are cleaned up.
–timeout < duration >For specifying the timeout duration, which defaults to 5 minutes.

Inventory

During installation, the OpenFunction CLI keeps the installed component details in $home/.ofn/<cluster name>-inventory.yaml. Therefore, during uninstallation, the OpenFunction CLI removes the installed components based on the contents of $home/.ofn/<cluster name>-inventory.yaml.

In addition, the OpenFunction CLI supports obtaining component versions and paths to the component YAML files from environment variables.

ofn demo Parameters

The following table describes parameters available for the ofn demo command.

ParameterDescription
–auto-pruneFor removing the demo kind cluster. To keep the demo kind cluster, run ofn demo --auto-prune=false, and you can delete the demo kind cluster by running kind delete cluster --name openfunction.
–verboseFor displaying detailed information.
–region-cnFor users who have limited access to gcr.io or github.com.

2 - Component Specifications

Learn about OpenFunction component specifications.

2.1 - Function Specifications

Learn about Function Specifications.

This document describes the specifications of the Function CRD.

Function

FieldDescription
apiVersion stringcore.openfunction.io/v1alpha2
kind stringFunction
metadata v1.ObjectMeta(Optional) Refer to v1.ObjectMeta
spec FunctionSpecRefer to FunctionSpec
status FunctionStatusRefer to FunctionStatus

FunctionSpec

Belong to Function.

FieldDescription
version string(Optional) Function version, e.g. v1.0.0
image stringImage upload path, e.g. demorepo/demofunction:v1
imageCredentials v1.LocalObjectReference(Optional) Credentials for accessing the image repository, refer to v1.LocalObjectReference
port int32(Optional) The port the function is listening on, e.g. 8080
build BuildImpl(Optional) Builder specification for the function, see BuildImpl
serving ServingImpl(Optional) Serving specification for the function, see ServingImpl

BuildImpl

Belong to FunctionSpec.

FieldDescription
builder stringName of the Builder
builderCredentials v1.LocalObjectReference(Optional) Credentials for accessing the image repository, refer to v1.LocalObjectReference
shipwright ShipwrightEngine(Optional) Specification of the Shipwright engine, refer to ShipwrightEngine
params map[string]string(Optional) Parameters passed to Shipwright
env map[string]string(Optional) Parameters passed to the buildpacks builder
srcRepo GitRepoThe configuration of the source code repository, refer to GitRepo
dockerfile string(Optional) Path to the Dockerfile instructing Shipwright when using the Dockerfile to build images

ShipwrightEngine

Belong to BuildImpl.

FieldDescription
strategy Strategy(Optional) Index of image build strategy, refer to Strategy
timeout v1.Duration(Optional) Build timeout, refer to v1.Duration

Strategy

Belong to ShipwrightEngine.

FieldDescription
name stringName of the strategy
kind string(Optional) Kind of the build strategy, which defaults to “BuildStrategy” or optional “ClusterBuildStrategy”

GitRepo

Belong to BuildImpl.

FieldDescription
url stringSource code repository address
revision string(Optional) Referenceable instances in the repository, such as commit ID and branch name.
sourceSubPath string(Optional) The directory of the function in the repository, e.g. functions/function-a/
credentials v1.LocalObjectReference(Optional) Repository access credentials, refer to v1.LocalObjectReference

ServingImpl

Belong to FunctionSpec.

FieldDescription
runtime stringType of load runtime, optional: Knative, OpenFuncAsync
params map[string]string(Optional) Parameters passed to the workloads
openFuncAsync OpenFuncAsyncRuntime(Optional) Used to define the configuration of OpenFuncAsync when the runtime is OpenFuncAsync, see OpenFuncAsyncRuntime
template v1.PodSpec(Optional) Template for the definition of Pods in the workloads, refer to v1.PodSpec

OpenFuncAsyncRuntime

Belong to ServingImpl.

FieldDescription
dapr Dapr(Optional) Definition of Dapr components, see Dapr
keda Keda(Optional) Definition of Keda, see Keda

Dapr

Belong to OpenFuncAsyncRuntime.

FieldDescription
annotations map[string]string(Optional) Annotations for Dapr components, see Dapr documentation
components map[string]componentsv1alpha1.ComponentSpec(Optional) Dapr Components Spec map, with key being component’s name and value being componentsv1alpha1.ComponentSpec
inputs []DaprIO(Optional) The definition of the inputs of the function, see DaprIO
outputs []DaprIO(Optional) The definition of the outputs of the function, see DaprIO

DaprIO

Belong to Dapr.

FieldDescription
name stringName of the input and output of the function. Consistent with the name of DaprComponent means associated
component stringIndicates the name of components
type stringType of Dapr component, optional: bindings, pubsub
topic string(Optional) When the type is pubsub, you need to set the topic
operation string(Optional) Operation field tells the Dapr component which operation it should perform, refer to Dapr docs
params map[string]string(Optional) Parameters passed to Dapr

Keda

Belong to OpenFuncAsyncRuntime.

FieldDescription
scaledObject KedaScaledObjectDefinition of KEDA scalable objects (Deployments), refer to KedaScaledObject
scaledJob KedaScaledJobDefinition of KEDA scalable jobs, refer to KedaScaledJob

KedaScaledObject

Belong to Keda.

FieldDescription
workloadType stringHow to run the function, known values are Deployment or StatefulSet, which defaults to Deployment.
pollingInterval int32(Optional) The pollingInterval is in seconds. This is the interval in which KEDA checks the triggers for the queue length or the stream lag. It defaults to 30 seconds.
cooldownPeriod int32(Optional) The cooldownPeriod is in seconds, and it is the period of time to wait after the last trigger activated before scaling back down to 0. It defaults to 300 seconds.
minReplicaCount int32(Optional) Minimum number of replicas which KEDA will scale the resource down to. By default, it scales to 0.
maxReplicaCount int32(Optional) This setting is passed to the HPA definition that KEDA will create for a given resource.
advanced kedav1alpha1.AdvancedConfig(Optional) This property specifies whether the target resource (for example, Deployment and StatefulSet) should be scaled back to original replicas count after the ScaledObject is deleted. Default behavior is to keep the replica count at the same number as it is in the moment of ScaledObject deletion. Refer to kedav1alpha1.AdvancedConfig.
triggers []kedav1alpha1.ScaleTriggersEvent sources that trigger dynamic scaling of workloads. Refer to kedav1alpha1.ScaleTriggers.

KedaScaledJob

Belong to Keda.

FieldDescription
restartPolicy v1.RestartPolicyRestart policy for all containers within the pod. Value options are OnFailure or Never. It defaults to Never.
pollingInterval int32(Optional) The pollingInterval is in seconds. This is the interval in which KEDA checks the triggers for the queue length or the stream lag. It defaults to 30 seconds.
successfulJobsHistoryLimit int32(Optional) How many completed jobs should be kept. It defaults to 100.
failedJobsHistoryLimit int32(Optional) How many failed jobs should be kept. It defaults to 100.
maxReplicaCount int32(Optional) The max number of pods that is created within a single polling period.
scalingStrategy kedav1alpha1.ScalingStrategy(Optional) Select a scaling strategy. Value options are default, custom, or accurate. The default value is default. Refer to kedav1alpha1.ScalingStrategy.
triggers []kedav1alpha1.ScaleTriggersEvent sources that trigger dynamic scaling of workloads, refer to kedav1alpha1.ScaleTriggers.

2.2 - EventSource Specifications

Learn about EventSource Specifications.

2.2.1 - EventSource Specifications

EventSource Specifications.

This document describes the specifications of the EventSource CRD.

EventSource

FieldDescription
apiVersion stringevents.openfunction.io/v1alpha1
kind stringEventSource
metadata v1.ObjectMeta(Optional) Refer to v1.ObjectMeta
spec EventSourceSpecRefer to EventSourceSpec
status EventSourceStatusStatus of EventSource

EventSourceSpec

Belong to EventSource.

FieldDescription
eventBus string(Optional) Name of the EventBus resource associated with the event source.
redis map[string]RedisSpec(Optional) The definition of a Redis event source, with key being the event name, refer to RedisSpec.
kafka map[string]KafkaSpec(Optional) The definition of a Kafka event source, with key being the event name, refer to KafkaSpec.
cron map[string]CronSpec(Optional) The definition of a Cron event source, with key being the event name, refer to CronSpec.
sink SinkSpec(Optional) Definition of the Sink (addressable access resource, i.e. synchronization request) associated with the event source, cf. SinkSpec.

SinkSpec

Belong to EventSourceSpec.

FieldDescription
ref ReferenceRefer to Reference.

Reference

Belong to SinkSpec.

FieldDescription
kind stringThe type of the referenced resource. It defaults to Service.
namespace stringThe namespace of the referenced resource, by default the same as the namespace of the Trigger.
name stringName of the referenced resource, for example, function-ksvc.
apiVersion stringThe apiVersion of the referenced resource. It defaults to serving.knative.dev/v1.

GenericScaleOption

Belong to scaleOption.

FieldDescription
pollingInterval intThis is the interval to check each trigger on. It defaults to 30 seconds.
cooldownPeriod intThe period to wait after the last trigger reported active before scaling the resource back to 0. It defaults to 300 seconds.
minReplicaCount intMinimum number of replicas KEDA will scale the resource down to. It defaults to 0.
maxReplicaCount intThis setting is passed to the HPA definition that KEDA will create for a given resource.
advanced kedav1alpha1.AdvancedConfigSee KEDA documentation.
metadata map[string]stringKEDA trigger’s metadata
authRef kedav1alpha1.ScaledObjectAuthRefEvery parameter you define in TriggerAuthentication definition does not need to be included in the metadata of the trigger for your ScaledObject definition. To reference a TriggerAuthentication from a ScaledObject you add the authenticationRef to the trigger, refer to KEDA documentation.

2.2.2 - Redis

Event source specifications of Redis.

RedisSpec

Belong to EventSourceSpec.

FieldDescription
redisHost stringAddress of the Redis server, e.g. localhost:6379.
redisPassword stringPassword for the Redis server, e.g. 123456.
enableTLS bool(Optional) Whether to enable TLS access, which defaults to false. Value options: true, false.
failover bool(Optional) Whether to enable the failover feature. Requires the sentinalMasterName to be set. It defaults to false. Value options: true, false.
sentinelMasterName string(Optional) The name of the sentinel master. Refer to Redis Sentinel Documentation.
redeliverInterval string(Optional) The interval for redeliver. It defaults to 60s. 0 means the redeliver mechanism is disabled. E.g. 30s
processingTimeout string(Optional) Message processing timeout. It defaults to 15s. 0 means timeout is disabled. E.g. 30s
redisType string(Optional) The type of Redis. Value options: node for single-node mode, cluster for cluster mode. It defaults to node.
redisDB int64(Optional) The database index to connect to Redis. Effective only if redisType is node. It defaults to 0.
redisMaxRetries int64(Optional) Maximum number of retries. It defaults to no retries. E.g. 5
redisMinRetryInterval string(Optional) Minimum backoff time for retries. The default value is 8ms. -1 indicates that the backoff time is disabled. E.g. 10ms
redisMaxRetryInterval string(Optional) Maximum backoff time for retries. The default value is 512ms. -1 indicates that the backoff time is disabled. E.g. 5s
dialTimeout string(Optional) Timeout to establish a new connection. It defaults to 5s.
readTimeout string(Optional) Read timeout. A timeout causes Redis commands to fail rather than wait in a blocking fashion. It defaults to 3s. -1 means disabled.
writeTimeout string(Optional) Write timeout. A timeout causes Redis commands to fail rather than wait in a blocking fashion. It defaults to consistent with readTimeout.
poolSize int64(Optional) Maximum number of connections. It defaults to 10 connections per runtime.NumCPU. E.g. 20
poolTimeout string(Optional) The timeout for the connection pool. The default is readTimeout + 1 second. E.g. 50s
maxConnAge string(Optional) Connection aging time. The default is not to close the aging connection. E.g. 30m
minIdleConns int64(Optional) The minimum number of idle connections to maintain to avoid performance degradation from creating new connections. It defaults to 0. E.g. 2
idleCheckFrequency string(Optional) Frequency of idle connection recycler checks. Default is 1m. -1 means the idle connection recycler is disabled. E.g. -1
idleTimeout string(Optional) Timeout to close idle client connections, which should be less than the server’s timeout. It defaults to 5m. -1 means disable idle timeout check. E.g. 10m

2.2.3 - Kafka

Event source specifications of Kafka.

KafkaSpec

Belong to EventSourceSpec.

FieldDescription
brokers stringA comma-separated string of Kafka server addresses, for example, localhost:9092.
authRequired boolWhether to enable SASL authentication for the Kafka server. Value options: true, false.
topic stringThe topic name of the Kafka event source, for example, topicA, myTopic.
saslUsername string(Optional) The SASL username to use for authentication. Only required if authRequired is true. For example, admin.
saslPassword string(Optional) The SASL user password for authentication. Only required if authRequired is true. For example, 123456.
maxMessageBytes int64(Optional) The maximum number of bytes a single message is allowed to contain. Default is 1024. For example, 2048.
scaleOption KafkaScaleOption(Optional) Kafka’s scale configuration.

KafkaScaleOption

Belong to KafkaSpec.

FieldDescription
GenericScaleOptionGeneric scale configuration.
consumerGroup stringKafka’s consumer group name.
topic stringTopic under monitoring, for example, topicA, myTopic.
lagThreshold stringThreshold for triggering scaling, in this case is the Kafka’s lag.

2.2.4 - Cron

Event source specifications of Cron.

CronSpec

Belong to EventSourceSpec.

FieldDescription
schedule stringRefer to Schedule format for a valid schedule format, for example, @every 15m.

2.3 - EventBus Specifications

Learn about EventBus Specifications.

2.3.1 - EventBus Specifications

EventBus Specifications.

This document describes the specifications of the EventBus (ClusterEventBus) CRD.

EventBus (ClusterEventBus)

FieldDescription
apiVersion stringevents.openfunction.io/v1alpha1
kind stringEventBus(ClusterEventBus)
metadata v1.ObjectMeta(Optional) Refer to v1.ObjectMeta
spec EventBusSpecRefer to EventBusSpec
status EventBusStatusStatus of EventBus(ClusterEventBus)

EventBusSpec

Belong to EventBus.

FieldDescription
topic stringThe topic name of the event bus.
natsStreaming NatsStreamingSpecDefinition of the Nats Streaming event bus (currently only supported). See NatsStreamingSpec.

GenericScaleOption

Belong to scaleOption.

FieldDescription
pollingInterval intThe interval to check each trigger on. It defaults to 30 seconds.
cooldownPeriod intThe period to wait after the last trigger reported active before scaling the resource back to 0. It defaults to 300 seconds.
minReplicaCount intMinimum number of replicas which KEDA will scale the resource down to. It defaults to 0.
maxReplicaCount intThis setting is passed to the HPA definition that KEDA will create for a given resource.
advanced kedav1alpha1.AdvancedConfigSee KEDA documentation.
metadata map[string]stringKEDA trigger’s metadata.
authRef kedav1alpha1.ScaledObjectAuthRefEvery parameter you define in TriggerAuthentication definition does not need to be included in the metadata of the trigger for your ScaledObject definition. To reference a TriggerAuthentication from a ScaledObject, add the authRef to the trigger. Refer to KEDA documentation.

2.3.2 - NATS Streaming

Event bus specifications of NATS Streaming.

NatsStreamingSpec

Belong to EventBusSpec.

FieldDescription
natsURL stringNATS server address, for example, nats://localhost:4222.
natsStreamingClusterID stringNATS cluster ID, for example, stan.
subscriptionType stringSubscriber type, value options: topic, queue.
ackWaitTime string(Optional) Refer to Acknowledgements , for example, 300ms.
maxInFlight int64(Optional) Refer to Max In Flight , for example, 25.
durableSubscriptionName string(Optional) The name of the persistent subscriber. For example, my-durable.
deliverNew bool(Optional) Subscriber options (only one can be used). Whether to send only new messages. Value options: true, false.
startAtSequence int64(Optional) Subscriber options (only one can be used). Set the starting sequence position and status. For example, 100000.
startWithLastReceived bool(Optional) Subscriber options (only one can be used). Whether to set the start position to the latest news place. Value options: true, false.
deliverAll bool(Optional) Subscriber options (only one can be used). Whether to send all available messages. Value options: true, false.
startAtTimeDelta string(Optional) Subscriber options (only one can be used). Use the difference form to set the desired start time position and state, for example, 10m, 23s.
startAtTime string(Optional) Subscriber options (only one can be used). Set the desired start time position and status using the marker value form. For example, Feb 3, 2013 at 7:54pm (PST).
startAtTimeFormat string(Optional) Must be used with startAtTime. Sets the format of the time. For example, Jan 2, 2006 at 3:04pm (MST).
scaleOption NatsStreamingScaleOption(Optional) Nats streaming’s scale configuration.

NatsStreamingScaleOption

Belong to NatsStreamingSpec.

FieldDescription
GenericScaleOptionGeneric scale configuration.
natsServerMonitoringEndpoint stringNats streaming’s monitoring endpoint.
queueGroup stringNats streaming’s queue group name.
durableName stringNats streaming’s durable name.
subject stringSubject under monitoring, for example, topicA, myTopic.
lagThreshold stringThreshold for triggering scaling, in this case is the Nats Streaming’s lag.

2.4 - Trigger Specifications

Learn about Trigger Specifications.

This document describes the specifications of the Trigger CRD.

Trigger

FieldDescription
apiVersion stringevents.openfunction.io/v1alpha1
kind stringTrigger
metadata v1.ObjectMeta(Optional) Refer to v1.ObjectMeta
spec TriggerSpecRefer to TriggerSpec
status TriggerStatusStatus of Trigger

TriggerSpec

Belong to Trigger.

FieldDescription
eventBus string(Optional) Name of the EventBus resource associated with the Trigger.
inputs map[string]Input(Optional) The input of trigger, with key being the input name. Refer to Input.
subscribers []Subscriber(Optional) The subscriber of the trigger. Refer to Subscriber.

Input

Belong to TriggerSpec.

FieldDescription
namespace string(Optional) The namespace name of the EventSource, which by default matches the namespace of the Trigger, for example, default.
eventSource stringEventSource name, for example, kafka-eventsource.
event stringEvent name, for example, eventA.

Subscriber

Belong to TriggerSpec.

FieldDescription
condition stringTrigger conditions for triggers, refer to cel-spec for more writing specifications, for example, eventA && eventB or `eventA
sink SinkSpec(Optional) Triggered Sink (addressable access resource, for example, synchronization request) definition, refer to SinkSpec.
deadLetterSink SinkSpec(Optional) Triggered dead letter Sink (addressable access resource, for example, synchronization request) definition, refer to SinkSpec.
topic string(Optional) Used to send post-trigger messages to the specified topic of the event bus, for example, topicTriggered.
deadLetterTopic string(Optional) Used to send post-trigger messages to the specified dead letter topic of the event bus, for example, topicDL.

SinkSpec

Belong to EventSourceSpec.

FieldDescription
ref ReferenceRefer to Reference.

Reference

Belong to SinkSpec.

FieldDescription
kind stringThe type of the referenced resource. It defaults to Service.
namespace stringThe namespace of the referenced resource, by default the same as the namespace of the Trigger.
name stringName of the referenced resource, for example, function-ksvc.
apiVersion stringThe apiVersion of the referenced resource. It defaults to serving.knative.dev/v1.

3 - FAQ

This document describes FAQs when using OpenFunction.

Q: How to use private image repositories in OpenFunction?

A: OpenFunction uses Shipwright (which utilizes Tekton to integrate with Cloud Native Buildpacks) in the build phase to package the user function to the application image.

Users often choose to access a private image repository in an insecure way, which is not yet supported by the Cloud Native Buildpacks.

We offer a workaround as below to get around this limitation for now:

  1. Use IP address instead of hostname as access address for private image repository.
  2. You should skip tag-resolution when you run the Knative-runtime function.

For references:

buildpacks/lifecycle#524

buildpacks/tekton-integration#31

Q: How to access the Knative-runtime function without introducing a new ingress controller?

A: OpenFunction provides a unified entry point for function accessibility, which is based on the Ingress Nginx implementation. However, for some users, this is not necessary, and instead, introducing a new ingress controller may affect the current cluster.

In general, accessible addresses are for the sync(Knative-runtime) functions. Here are two ways to solve this problem:

  • Magic DNS

    You can follow this guide to config the DNS.

  • CoreDNS

    This is similar to using Magic DNS, with the difference that the configuration for DNS resolution is placed inside CoreDNS. Assume that the user has configured a domain named “openfunction.dev” in the ConfigMap config-domain under the knative-serving namespace (as shown below):

    $ kubectl -n knative-serving get cm config-domain -o yaml
    
    apiVersion: v1
    data:
      openfunction.dev: ""
    kind: ConfigMap
    metadata:
      annotations:
        knative.dev/example-checksum: 81552d0b
      labels:
        app.kubernetes.io/part-of: knative-serving
        app.kubernetes.io/version: 1.0.1
        serving.knative.dev/release: v1.0.1
      name: config-domain
      namespace: knative-serving
    

    Next, let’s add an A record for this domain. OpenFunction uses Kourier as the default network layer for Knative Serving, which is where the domain should flow to.

    $ kubectl -n kourier-system get svc
    
    NAME               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    kourier            LoadBalancer   10.233.7.202   <pending>     80:31655/TCP,443:30980/TCP   36m
    kourier-internal   ClusterIP      10.233.47.71   <none>        80/TCP                       36m
    

    Then the user only needs to configure this Wild-Card DNS resolution in CoreDNS to resolve the URL address of any Knative Service in the cluster.

    Where “10.233.47.71” is the address of the Service kourier-internal.

    $ kubectl -n kube-system get cm coredns -o yaml
    
    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            health
            ready
            template IN A openfunction.dev {
              match .*\.openfunction\.dev
              answer "{{ .Name }} 60 IN A 10.233.47.71"
              fallthrough
            }
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
            }
            hosts /etc/coredns/NodeHosts {
              ttl 60
              reload 15s
              fallthrough
            }
            prometheus :9153
            forward . /etc/resolv.conf
            cache 30
            loop
            reload
            loadbalance
        }
        ...
    

    If the user cannot resolve the URL address for this function outside the cluster, configure the hosts file as follows:

    Where “serving-sr5v2-ksvc-sbtgr.default.openfunction.dev” is the URL address obtained from the command “kubectl get ksvc”.

    10.233.47.71 serving-sr5v2-ksvc-sbtgr.default.openfunction.dev
    

After the above configuration is done, you can get the URL address of the function with the following command. Then you can trigger the function via curl or your browser.

$ kubectl get ksvc

NAME                       URL
serving-sr5v2-ksvc-sbtgr   http://serving-sr5v2-ksvc-sbtgr.default.openfunction.dev

Q: How to enable and configure concurrency for functions?

A: OpenFunction categorizes function types into “sync runtime” and “async runtime” based on the type of request being handled. These two types of functions are driven by Knative Serving and Dapr + KEDA.

Therefore, to enable and configure the concurrency of functions, you need to refer to the specific implementation in the above components.

The following section describes how to enable and configure concurrency of functions in OpenFunction according to the “sync runtime” and “async runtime” sections.

Sync runtime

You can start by referring to this document in Knative Serving on enabling and configuring concurrency capabilities.

Knative Serving has Soft limit and Hard limit configurations for the concurrency feature.

Soft limit

You can refer to the Global(ConfigMap) and Global(Operator) sections of this document to configure global concurrency capabilities.

And for Per Revision you can configure it like this.

apiVersion: core.openfunction.io/v1beta1
kind: Function
metadata:
  name: function-sample
spec:
  serving:
    scaleOptions:
      knative:
        autoscaling:
          target: "200"

Hard limit

OpenFunction currently doesn’t support configuring Hard limit for Per Revision. You can refer to the Global(ConfigMap) and Global(Operator) sections of this document to configure global concurrency capabilities.

In summary

In a nutshell, you can configure Knative Serving’s Autoscaling-related configuration items for each function as follows, just as long as they can be passed in as Annotation, otherwise, you can only do global settings.

# Configuration in Knative Serving
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/<key>: "value"

# Configuration in OpenFunction (recommended)
apiVersion: core.openfunction.io/v1beta1
kind: Function
metadata:
  name: function-sample
spec:
  serving:
    scaleOptions:
      knative:
        autoscaling:
          <key>: "value"

# Alternative approach
apiVersion: core.openfunction.io/v1beta1
kind: Function
metadata:
  name: function-sample
spec:
  serving:
    annotations:
      autoscaling.knative.dev/<key>: "value"

Async runtime

You can start by referring to the document in Dapr on enabling and configuring concurrency capabilities.

Compared to the concurrency configuration of sync runtime, the concurrency configuration of async runtime is simpler.

# Configuration in Dapr
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodesubscriber
  namespace: default
spec:
  template:
    metadata:
      annotations:
        dapr.io/app-max-concurrency: "value"

# Configuration in OpenFunction (recommended)
apiVersion: core.openfunction.io/v1beta1
kind: Function
metadata:
  name: function-sample
spec:
  serving:
    annotations:
      dapr.io/app-max-concurrency: "value"