Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Knative Status Report

Knative Status Report

Tsubasa Nagasawa

July 29, 2019
Tweet

More Decks by Tsubasa Nagasawa

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

  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.

    View full-size slide

  4. Serverless > Compute
    Serverless > Function

    View full-size slide

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

    View full-size slide

  6. Knative Launch Partners

    View full-size slide

  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

    View full-size slide

  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...

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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%

    View full-size slide

  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

    View full-size slide

  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)

    View full-size slide

  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)

    View full-size slide

  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)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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 を監視して判断

    View full-size slide

  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 に上書

    View full-size slide

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

    View full-size slide

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

    11. queue-proxy は処理中のリクエスト数を
    -1 して Autoscaler に伝える

    View full-size slide

  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.

    View full-size slide

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

    View full-size slide

  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.

    View full-size slide

  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 の追加

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide