Slide 1

Slide 1 text

Knative Status Report 2019-0729 Kubernetes MeetUp CyberAgent Media Business, Service Reliability Group Tsubasa Nagasawa (@toVersus)

Slide 2

Slide 2 text

● Knative の概要 ● Knative のゼロスケールの仕組み ● Knative の現状とこれから

Slide 3

Slide 3 text

Knative Kubernetes native platform for serverless workload [kay-native] ● Build: Source to Container ● Serving: Request-driven, scale-to-zero, container-based compute. ● Eventing: Attach work to event sources.

Slide 4

Slide 4 text

Serverless > Compute Serverless > Function

Slide 5

Slide 5 text

Serverless Usage Models Portable No servers Pay only for usage Event-driven developer perspective

Slide 6

Slide 6 text

Knative Launch Partners

Slide 7

Slide 7 text

Knative Community Enabled Build Serving Kubernetes Platform Products Primitives Events ... Google Cloud Run SAP Kyma Pivotal Function Service IBM Cloud Functions Red Hat Openshift Cloud Functions Pivotal riff TriggerMesh T-mobile Jazz Rancher Rio

Slide 8

Slide 8 text

apiVersion: apps/v1 kind: Deployment metadata: name: grpc-k8s spec: selector: matchLabels: app: grpc-k8s template: metadata: labels: app: grpc-k8s spec: containers: - name: user-container image: docker.io/mattmoor/grpc-ping-go ports: - name: h2c containerPort: 8080 readinessProbe: tcpSocket: port: 8080 periodSeconds: 1 apiVersion: v1 kind: Service metadata: name: grpc-k8s spec: ports: - name: http2 port: 80 targetPort: h2c selector: app: grpc-k8s apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: grpc-istio spec: gateways: - knative-ingress-gateway.knative-serving.svc.cluster.local hosts: - k8s.mattmoor.io http: - match: - authority: regex: ^k8s\.mattmoor\.io(?::\d{1,5})?$ route: - destination: host: grpc-k8s.default.svc.cluster.local port: number: 80 weight: 100 apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: grpc-k8s spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: grpc-k8s minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 Kubernetes Deployment and others...

Slide 9

Slide 9 text

apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: grpc-knative spec: template: spec: containers: - image: docker.io/mattmoor/grpc-ping-go ports: - name: h2c containerPort: 8080 Knative Service

Slide 10

Slide 10 text

apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: grpc-knative spec: template: metadata: annotations: autoscaling.knative.dev/minScale: "1" autoscaling.knative.dev/maxScale: "10" spec: containerConcurrency: 200 containers: - image: docker.io/mattmoor/grpc-ping-go ports: - name: h2c containerPort: 8080 Knative Service

Slide 11

Slide 11 text

Knative Service アプリケーションの生成から削除までのライフサイクルを管理 Configuration アプリケーションの状態管理 (現状と望ましい状態) Twelve-Factor App の思想に従って、コードと設定を分離 Revision コードと設定の不変のスナップショット Route トラフィックを Revision に紐付け Knative Serving Primitives

Slide 12

Slide 12 text

apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: grpc-knative spec: template: spec: containers: - image: docker.io/mattmoor/grpc-ping-go ports: - name: h2c containerPort: 8080 Revision (grpc-knative-s nmml) Configuration (grpc-knative) records history of Route (grpc-knative) Service (grpc-knative) traffic: 100% Knative Service

Slide 13

Slide 13 text

apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: grpc-knative spec: template: spec: containers: - image: docker.io/mattmoor/grpc-ping-go ports: - name: h2c containerPort: 8080 traffic: - latestRevision: true percent: 100 Configuration (grpc-knative) records history of Route (grpc-knative) Service (grpc-knative) Revision (grpc-knative-s nmml) Knative Service traffic: 100%

Slide 14

Slide 14 text

apiVersion: serving.knative.dev/v1beta1 kind: Configuration metadata: name: grpc-knative spec: template: spec: containers: - image: docker.io/mattmoor/grpc-ping-go ports: - name: h2c containerPort: 8080 --- apiVersion: serving.knative.dev/v1beta1 kind: Route metadata: name: grpc-knative spec: traffic: - latestRevision: true percent: 100 Revision (grpc-knative-s nmml) Configuration (grpc-knative) records history of Route (grpc-knative) Service (grpc-knative) traffic: 100% Knative Configuration & Route

Slide 15

Slide 15 text

apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: grpc-knative spec: template: metadata: name: grpc-knative-00001 spec: containers: - image: docker.io/mattmoor/grpc-ping-go ports: - name: h2c containerPort: 8080 traffic: - latestRevision: true percent: 100 Configuration (grpc-knative) records history of Route (grpc-knative) Service (grpc-knative) traffic: 100% Revision (grpc-knative-s nmml) Revision (grpc-knative-0 0001) Knative Service (rolling update)

Slide 16

Slide 16 text

apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: grpc-knative spec: template: metadata: name: grpc-knative-00002 spec: containers: - image: docker.io/mattmoor/grpc-ping-go args: ["-value=KNATIVE"] ports: - name: h2c containerPort: 8080 traffic: - revisionName: grpc-knative-00001 percent: 100 tag: blue - revisionName: grpc-knative-00002 percent: 0 tag: green Revision (grpc-knative-s nmml) Configuration (grpc-knative) records history of Route (grpc-knative) Service (grpc-knative) Revision (grpc-knative-0 0001) Revision (grpc-knative-0 0002) traffic: 100% Knative Service (rolling update)

Slide 17

Slide 17 text

apiVersion: serving.knative.dev/v1beta1 kind: Service metadata: name: grpc-knative spec: template: metadata: name: grpc-knative-00002 spec: containers: - image: docker.io/mattmoor/grpc-ping-go args: ["-value=KNATIVE"] ports: - name: h2c containerPort: 8080 traffic: - revisionName: grpc-knative-00001 percent: 0 tag: blue - revisionName: grpc-knative-00002 percent: 100 tag: green Revision (grpc-knative-s nmml) Configuration (grpc-knative) records history of Route (grpc-knative) Service (grpc-knative) Revision (grpc-knative-0 0001) Revision (grpc-knative-0 0002) traffic: 100% Knative Service (rolling update)

Slide 18

Slide 18 text

Inside Knative Serving - Dominik Tornow, SAP & Andrew Chen, Google https://www.youtube.com/watch?v=-tvQgLbcNtg

Slide 19

Slide 19 text

1. ServerlessService が Private Service (Activator) の Endpoint をコピーして Public Service の Endpoint を上書き 3 つの Service ● Public Service (without selector) ● Private Service (Activator) ● Private Service (Revision)

Slide 20

Slide 20 text

1. ServerlessService が Private Service (Activator) の Endpoint をコピーして Public Service の Endpoint を上書き 2. 外部からのリクエストは Activator に転 送され、キューに溜める 3. Activator は Revision の Pod を増やす よう Autoscaler に依頼 4. Autoscaler は KPA を通して Deployment のレプリカ数を増加

Slide 21

Slide 21 text

1. ServerlessService が Private Service (Activator) の Endpoint をコピーして Public Service の Endpoint を上書き 2. 外部からのリクエストは Activator に転 送され、キューに溜める 3. Activator は Revision の Pod を増やす よう Autoscaler に依頼 4. Autoscaler は KPA を通して Deployment のレプリカ数を増加 5. Activator は、Pod がリクエストを処理で きるか Private Service (Revision) の Endpoint を監視して判断

Slide 22

Slide 22 text

1. ServerlessService が Private Service (Activator) の Endpoint をコピーして Public Service の Endpoint を上書き 2. 外部からのリクエストは Activator に転 送され、キューに溜める 3. Activator は Revision の Pod を増やす よう Autoscaler に依頼 4. Autoscaler は KPA を通して Deployment のレプリカ数を増加 5. Activator は、Pod がリクエストを処理で きるか Private Service (Revision) の Endpoint を監視して判断 6. Activator は、Revision Endpoint が有効 になったらその ClusterIP にリクエストを 転送 7. 同時に ServerlessService が Private Service (Revision) の Endpoint をコピー して Public Service の Endpoint に上書 き

Slide 23

Slide 23 text

8. queue-proxy がアプリケーションにリクエ ストを転送 9. queue-proxy は処理中のリクエスト数を +1 して Autoscaler に伝える

Slide 24

Slide 24 text

8. queue-proxy がアプリケーションにリクエ ストを転送 9. queue-proxy は処理中のリクエスト数を +1 して Autoscaler に伝える 10. アプリケーションがリクエストの処理を完 了すると queue-proxy にレスポンスを返 却 11. queue-proxy は処理中のリクエスト数を -1 して Autoscaler に伝える

Slide 25

Slide 25 text

● 処理中のリクエスト数で Pod が自動スケール ○ デフォルト: 100 リクエスト ● imagePullPolicy: Always からの解放 ○ イメージのタグを digest に変換 (tag-to-digest) して Revision に紐付け ● Front LB は 1 台共有で、マルチテナント対応可能 ○ 複数ドメイン同居可能 ● Istio 依存からの脱却 ○ Gloo, Ambassador に対応済み (SMI? Ingress v2?) ○ Cold Start (non Istio side-car) ~ 3 s ● GKE, OpenShift, IKS との親和性が高い (EKS...) ○ Supported Kubernetes version: v1.11, v1.12, v1.13 ● 独自のオートスケーラーを実装可能 Knative Serving Pros.

Slide 26

Slide 26 text

● オートスケーリングのルールを設定可能 ○ Pod の並列処理数 ○ 最大/最小スケール数 ○ ゼロスケールまでの期間 ● メトリクス・ログ監視 ○ クラスター内に Fluentd DS/Prometheus/Grafana/ES Stack を構築 ○ GKE なら Stack Driver に流すことが可能 ● Knative の信頼性 ○ Unit/E2E/Performance/Flaky テストの整備 ○ test-infra ベースで GKE クラスターに対して各種テストが実行される Knative Serving Pros.

Slide 27

Slide 27 text

● Pod : Container = 1 : 1 ○ Sidecar/ Init Containers 未対応 ● Pod にマウントできる Volume の制限 ○ secret, configMap, projected のみサポート ● Pod へのリクエスト分散 ○ Service のエンドポイントにリクエストを投げるので kube-proxy 依存 ● nodeSelector, Node Affinity, Tolerations 非サポート ● ゼロスケールのタイミング ● FQDN の命名規則の制約 ○ クラスター内で重複しないように設定する必要あり ● Non-Inteligent Autoscaling Algorithm ○ リクエストが一定の割合で増えているのを検知して事前に Pod をスケールとか無理 Knative Serving Cons.

Slide 28

Slide 28 text

Road to Knative Serving v1 v0.7.0 (v1beta1) 2019/06/25 2019/07/24 2019/08/06 2019/09/17 1 year anniversary v0.8.0 (v1rc1) v0.9.0 (v1) ● Burst Capacity の導入 ● オートスケール周りの安定性向上 ● Cold Start 時間の改善 ● manual TLS/mTLS サポート ● Cold Start 時間の改善 (< 1 sec) ● HPA ゼロスケール対応 ● Activator パフォーマンス改善 ● Serving API の仕様整理 ● パフォーマンステストの追加 ● Validation の追加

Slide 29

Slide 29 text

● Burst Capacity の導入 ○ 急激なトラフィック増加への暫定対応 ● オートスケールまわりの安定性向上 ○ Autoscaler/Activator の可用性向上 ● Cold Start 時間の改善 ○ Activator -> Pod へ直接リクエストを渡す ● tag-to-digest の ECR 対応 ● (Istio) Ingress Gateway への TLS 証明書の紐付け設定 Knative Serving v0.8.0 Features

Slide 30

Slide 30 text

● Pipelined Cold Start ● KPA から HPA Custom Metrics への移行 ● Revision へのルーティング方法の拡張 ○ (HTTP ヘッダーなどによる) Feature Flag ルーティングの導入 ● Vertical Pod Autoscaler への対応 ● 非同期リクエストへの対応 ○ モバイル通知、DB マイグレーション、バッチ処理、ストリーミング処理など ● Stateful なアプリケーションへの対応 Knative Serving Long-term Feature Requests

Slide 31

Slide 31 text

● Serving Operator ○ Knative Serving のインストールからアップデートまでを管理 ● kn ○ Knative Serving リソースを操作するための CLI (CI/CD 用途) ● Observaility ○ Telegraf/Fluent Bit ベースでメトリクスやログを外部のサービスに転送 ● ko ○ import パス指定で Go アプリケーションをビルド /デプロイ (≒ Jib in Java) ● kf ○ Knative 上で実現する CF (Cloud Foundry) ● kubeflow/kfserving ○ Knative 上で機械学習モデルを提供 Knative Sub Projects

Slide 32

Slide 32 text

● Knative Serving API Specification ● Knative Runtime Contract ● [Tech Talk] Knative Serving API 101 ● [TechTalk] Knative Autoscaling ● [Blog] Knative v0.3 Autoscaling — A Love Story ● [Video] Knative: Scaling From 0 to Infinity ● 2019 Autoscaling Roadmap ● Knativeで実現するKubernetes上のサーバーレスアーキテクチャ Knative References

Slide 33

Slide 33 text

Simple 1-click build and deploy, configurable when you need to Source to container or URL safely within your cluster Extendable Easy to configure event sources Plugable event bus and persistence Automatic Automatically deploys containers and provision ingress Scale based on requests Scale down to zero ● Set of primitives (build, events, serving...) ● Solves for modern development patterns ● Implements learnings from Google, partners github.com/knative Join Knative community knative/docs/community Have questions? Knative.slack.com Knative News? @KnativeProject Ingredients for Serverless