Serverless at @mchmarny

Serverless On Your Own Terms Using Knative Context Serverless more than Function Serverless Models

Operator

No Infra Management Managed Security Pay only for usage

Developer

Service-based Event-driven Open Serverless and Container Containers .js .rb .go

• Any Language

• Any Library .py .sh … • Any Binary

• Ecosystem of base images

0 1 0 1 0 0 1 1 1 Serverless with Portability

442 Years of effort* 5,500+ Contributors 55k+ GitHub stars Kubernetes for operators

Scheduling

Lifecycle and health

Naming and discovery

Load balancing

Storage volumes

Platform over Logging and monitoring underlying infrastructure i.e. GKE Identity and authorization Kubernetes for developers

Want to Have to Write code Build image locally Upload image to registry Deploy service Expose to the Setup logging & monitoring Scale workload... Knative Knative open source building blocks for serverless on Kubernetes

[kay-native] Knative Primitives

Developer-facing Products

Build Serving Events ...

Kubernetes Knative Momentum

v0.1 v0.3 v0.5 v0.7 Initial release Container resources spec Expanded Event API v1beta1 API Serving, Build Updated scale-to-zero strategy GRPC streaming HPA-based scaling Cluster-local services Non-root containers

July 18 Nov Jan 19 Feb Apr May July

Upgradable configs Serving Beta API Pluggable networking, Mounting Secrets Auto-TLS autoscaling, and caching GRPC, HTTP/2, WebSockets EventType CRD v0.2 v0.4 v0.6 Knative Community

v0.7 55+ >6K Predictable Contributing Pull Requests Releases Companies

~450 9 Individual Working Contributors Groups Knative Today

Google Run OpenShift SAP Kyma Products Google Cloud Run on GKE IBM Cloud Kubernetes Service TriggerMesh

Primitives Serving Events Build Tekton ...

Platform Kubernetes Knative Install

Knative Stack Install Serverless Containers on GCF GKE Serverless Add-on SAP Kyma

LatestProducts releases: https://knative.dev/docs/install/Pivotal Function Service IBM Cloud Functions Red Hat Cloud Functions

Pivotal riff OpenFaaS T-mobile Jazz $ kubectl apply \ -f https://github.com/knative/serving/releases/.../serving.yaml \ -fPrimitives https://github.com/knative/eventing/releases/.../eventing.yamlBuild Serving Events ... \ -f https://github.com/knative/monitoring/releases/.../monitoring.yaml \ -f https://github.com/knative/build/releases/.../build.yaml Service Mesh Istio Optionally apply individual event sources and channel provisioners

Platform Kubernetes

Confidential & Proprietary Install

$ gcloud beta container \ clusters create my-cluster \ --addons=Istio,CloudRun

Quick Start on GCP: bit.ly/cr-gke

Also available for: ● AKS ● Docker ● Gardener ● IKS ● Minikube ● OpenShift/Minishift ● PCS

Confidential & Proprietary Config

$: kubectl get ns NAME STATUS default Active istio-system Active $: kubectl get cm -n knative-serving knative-build Active NAME DATA knative-eventing Active config-autoscaler 1 knative-monitoring Active config-defaults 1 knative-serving Active config-deployment 2 knative-sources Active config-domain 1 kube-public Active config-gc 1 kube-system Active config-istio 1

config-logging 1 config-network 6 config-observability 1 config-tracing 1 Confidential & Proprietary Knative Features Knative Serving

Benefits Integrations

● Activates and scales based on ● Connect with other GCP request (up/down to 0 pods) services like Cloud Build and Stackdriver ● Manages code/configrevisions (updates, rollbacks, traffic splits) ● Extend with partner integrations like GitLab and ● Integrates service mesh Datadog (request path/services access control)

● Custom domains and SSL cert support Deployment

CLI release: github.com/knative/client kn service create service-name \ --image registry/image-name

Result: service-name.namespace.domain.dev Deployment kubectl apply -f service.yaml

# service.yaml apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: service-name spec: template: spec: containers: - image: registry/image-name Deployment gcloud beta run deploy service-name \ --image=gcr.io/project/image-name

Other CLIs: knctl, os, ibmcloud Autoscaling Deployment Options

GitOps using Cloud Build, GitLab, (e.g. branch or release triggers) github.com/mchmarny/maxprime/blob/master/deployments/cloudbuild.yaml

Local Build uses Dockerfile, deploy using gcloud docker build/tag/publish gcloud beta run deploy app --image=gcr.io/project/image

On-cluster Build (Build Templates or github.com/tektoncd/pipeline) kubectl apply -f build.yaml ko for quick iteration, no Dockerfile (golang only) github.com/google/ko ko apply -f config.yaml Day 2+

Service v1

v2 Knative Object Model

Service Route - named endpoint and a mechanism for routing traffic

Revisions - immutable snapshots

of code + config Route Configuration

Configuration - stream of environments for Revisions Revision 3

Service - top-level wrapper for managing Route/Configurations sets Revision 2

Revision 1 Simple Revision Management # List current revisions in demo namespace (filter on service name) kubectl get revisions -n demo -l serving.knative.dev/service=maxprime

NAME SERVICE NAME GENERATION READY maxprime-vq25k maxprime-vq25k-service 3 True maxprime-wtz1g maxprime-wtz1g-service 2 True maxprime-qtz5p maxprime-qtz5p-service 1 True

# Edit revision in service traffic section # (status/traffic[n]/revisionName) kubectl edit ksvc maxprime -n demo Blue/Green (deployment) apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: bg namespace: demo 100% Service Revision spec: template: spec: containers: - image: gcr.io/knative-samples/knative-route-demo:blue

github.com/mchmarny/knative-demos/tree/master/blue-green-deploy Blue/Green (update) spec: template:

metadata: name: bg-2 100% - bg.demo.knative.tech ... Revision (bg-1) traffic: - tag: current Service revisionName: bg-1 Revision (bg-2) percent: 100 0% - bg-candidate.demo.knative.tech - tag: candidate revisionName: bg-2 percent: 0 - tag: latest latest Revision: true

percent: 0 github.com/mchmarny/knative-demos/tree/master/blue-green-deploy Blue/Green (traffic split)

...

traffic: 60% 50% - tag: current 40% 30% revisionName: bg-1 20% percent: 50 10% Revision (bg-2) - tag: candidate revisionName: bg-2 Service percent: 50 Revision (bg-1) - tag: latest 90% latest Revision: true 80% 70% percent: 0 60% 50% 40%

github.com/mchmarny/knative-demos/tree/master/blue-green-deploy Blue/Green (rollback)

... traffic: - tag: previous revisionName: bg-1 percent: 100 0% Revision (bg-2) - tag: current revisionName: bg-2 Service percent: 0 Revision (bg-1) - tag: latest 100% latestRevision: true percent: 0

github.com/mchmarny/knative-demos/tree/master/blue-green-deploy Usage Patterns

Public Service Internal Service • Website • Mobile backend • Backing Microservices • API endpoint • Webhook • Eventing Targets Request Path Demo

Kubernetes Cluster

Knative HTTPS Logo Service Vision API

HTTPS

User curl -H "Content-Type: application/json" \ -d '{"id":"test","url":"https://storage.googleapis.com/kdemo-logos/k8s.png"}' \ -X POST https://klogo.demo.knative.tech/ | jq "." Request Path Demo

Kubernetes Cluster

Knative HTTPS Logo Service Vision API HTTP HTTPS Frontend UI

HTTP User HTTPS User Service Firestore API

OAuth

demo Request Path Demo

Kubernetes Cluster

Knative HTTPS Logo Service Vision API HTTP HTTPS Frontend UI

HTTP User HTTPS User Service Firestore API

OAuth

github.com/mchmarny/kdemo Request Path Demo

Kubernetes Cluster

Knative Logo Service HTTPS Vision API HTTP (cluster-local) HTTPS Frontend UI (external) HTTP User User Service HTTPS Firestore API (cluster-local)

OAuth

github.com/mchmarny/kdemo Request Path

# github.com/mchmarny/klogo # service.yaml apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: klogo labels: serving.knative.dev/visibility: cluster-local ...

github.com/mchmarny/kdemo Knative Eventing

Benefits Loosely coupled

● Orchestrates on/off cluster ● Use existing event sources event sources available or build your own

● Binds declaratively event ● Plugable channel sources, triggers, and services provisioners (e.g. PubSub. Kafka, NATS, In-Memory) ● Scales from just few events to live streaming pipelines

● Uses standard CloudEvents (CNCF Project) Knative Event Sources

Name Description

Apache Camel Allows to use Apache Camel components for pushing events into Knative

Apache Kafka Brings Apache Kafka messages into Knative

AWS SQS Brings AWS Simple Queue Service messages into Knative

Cron Job Uses an in-memory timer to produce events on the specified Cron schedule.

GCP PubSub Brings GCP PubSub messages into Knative

GitHub Brings GitHub organization/repository events into Knative

GitLab Brings GitLab repository events into Knative.

Google Cloud Scheduler Google Cloud Scheduler events in Knative when jobs are triggered

Google Brings bucket/object events into Knative

Kubernetes Brings Kubernetes cluster/infrastructure events into Knative

Full lists: https://github.com/knative/docs/tree/master/docs/eventing/sources Knative Event Broker

- 1-n per NS by default Simple Broker

- Discoverable endpoint apiVersion: eventing.knative.dev/v1alpha1 - Manages kind: Broker metadata: ● Channels name: b1 ● Ingress filter/policy namespace: demo spec: {} status: address: hostname: b1-broker.demo.svc.cluster.local Knative Eventing Objects

Namespace

Source Trigger ingress subscribe Service (Callable) Events filter= ✓

Broker publish

Source Trigger ingress subscribe Service Events filter= (Callable) ✓ ✓ CloudEvents

FTP FTP Event Source

GitHub GitHub Event Source Broker

GCS GCS Event Source

CloudEvent { "specversion": "0.2", "type": "com.github.pull.create", "source": "https://github.com/cloudevents/spec/pull/123", "id": "A234-1234-1234", "time": "2019-04-08T17:31:00Z", "datacontenttype": "application/json", "data": "{ GitHub Payload... }" } Knative Event Trigger

Simple Trigger - Uses CloudEvents apiVersion: eventing.knative.dev/v1alpha1 - Supports Filtering kind: Trigger metadata: - Can produce new events name: build-status-slack-notifier spec: filter: sourceAndType: type: com.google.build.status subscriber: ref: apiVersion: serving.knative.dev/v1alpha1 kind: Service name: slack-sender

Build status Slack notifications demo: https://github.com/mchmarny/knative-build-status-notifs Twitter Broker (default) Event Source 1 2 3 4 query:knative type:com.twitter

Trigger Trigger Trigger Trigger e type filter: type filter: type filter: type filter: com.twitter com.twitter. com.twitter com.twitter .negative positive

Sentiment Slack Event Store om.twitter.positive

om.twitter.negativ Scoring Publishing c

Service c Service Service Event Viewer (WebSocket)

Knative

FireStore Slack Collection Channel Eventing (knative-tweets (#twitterback) )

Demo 1. Save all tweets 2. Classify tweets 3. Send negative to 4. Display positive for reference based on sentiment Slack for review tweets in UI bit.ly/kn-tw-event Knative Eventing Demos bit.ly/kn-event-samples

* Cron job source to wire up weekly report * Process IoT Core events (through PubSub) * GCP PubSub (connector to many other GCP event sources) * Actuate on Kubernetes events * GitHub Webhooks processing ... In Closing

Optimized Knative-based Products Experience

Primitives Knative

Infrastructure Kubernetes Docs, Blog, Community Source & Samples knative.dev github.com/knative

Quick Start Questions? bit.ly/cr-gke slack.knative.dev

Anything else @mchmarny Rate today's session, please

Session page on conference website O’Reilly Events App