Knative Status Report

Knative Status Report

2661b52b92e28d73635638a17c96f4af?s=128

Tsubasa Nagasawa

July 29, 2019
Tweet

Transcript

  1. Knative Status Report 2019-0729 Kubernetes MeetUp CyberAgent Media Business, Service

    Reliability Group Tsubasa Nagasawa (@toVersus)
  2. • Knative の概要 • Knative のゼロスケールの仕組み • Knative の現状とこれから

  3. 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.
  4. Serverless > Compute Serverless > Function

  5. Serverless Usage Models Portable No servers Pay only for usage

    Event-driven developer perspective
  6. Knative Launch Partners

  7. 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
  8. 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...
  9. 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
  10. 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
  11. Knative Service アプリケーションの生成から削除までのライフサイクルを管理 Configuration アプリケーションの状態管理 (現状と望ましい状態) Twelve-Factor App の思想に従って、コードと設定を分離 Revision

    コードと設定の不変のスナップショット Route トラフィックを Revision に紐付け Knative Serving Primitives
  12. 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
  13. 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%
  14. 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
  15. 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)
  16. 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)
  17. 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)
  18. Inside Knative Serving - Dominik Tornow, SAP & Andrew Chen,

    Google https://www.youtube.com/watch?v=-tvQgLbcNtg
  19. 1. ServerlessService が Private Service (Activator) の Endpoint をコピーして Public

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

    Service の Endpoint を上書き 2. 外部からのリクエストは Activator に転 送され、キューに溜める 3. Activator は Revision の Pod を増やす よう Autoscaler に依頼 4. Autoscaler は KPA を通して Deployment のレプリカ数を増加
  21. 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 を監視して判断
  22. 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 に上書 き
  23. 8. queue-proxy がアプリケーションにリクエ ストを転送 9. queue-proxy は処理中のリクエスト数を +1 して Autoscaler

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

    に伝える 10. アプリケーションがリクエストの処理を完 了すると queue-proxy にレスポンスを返 却 11. queue-proxy は処理中のリクエスト数を -1 して Autoscaler に伝える
  25. • 処理中のリクエスト数で 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.
  26. • オートスケーリングのルールを設定可能 ◦ Pod の並列処理数 ◦ 最大/最小スケール数 ◦ ゼロスケールまでの期間 •

    メトリクス・ログ監視 ◦ クラスター内に Fluentd DS/Prometheus/Grafana/ES Stack を構築 ◦ GKE なら Stack Driver に流すことが可能 • Knative の信頼性 ◦ Unit/E2E/Performance/Flaky テストの整備 ◦ test-infra ベースで GKE クラスターに対して各種テストが実行される Knative Serving Pros.
  27. • 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.
  28. 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 の追加
  29. • Burst Capacity の導入 ◦ 急激なトラフィック増加への暫定対応 • オートスケールまわりの安定性向上 ◦ Autoscaler/Activator

    の可用性向上 • Cold Start 時間の改善 ◦ Activator -> Pod へ直接リクエストを渡す • tag-to-digest の ECR 対応 • (Istio) Ingress Gateway への TLS 証明書の紐付け設定 Knative Serving v0.8.0 Features
  30. • Pipelined Cold Start • KPA から HPA Custom Metrics

    への移行 • Revision へのルーティング方法の拡張 ◦ (HTTP ヘッダーなどによる) Feature Flag ルーティングの導入 • Vertical Pod Autoscaler への対応 • 非同期リクエストへの対応 ◦ モバイル通知、DB マイグレーション、バッチ処理、ストリーミング処理など • Stateful なアプリケーションへの対応 Knative Serving Long-term Feature Requests
  31. • 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
  32. • 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
  33. 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