GKE Sandbox による保護


このドキュメントでは、ホストカーネルからのワークロード分離を改善するために、GKE Sandbox を使用するように Google Kubernetes Engine(GKE)で実行される Knative serving を構成する方法について説明します。

目標

  • Knative serving クラスタで GKE Sandbox を有効にする方法について理解する。
  • サンドボックス化されたノードで実行するように指定されたサービスをデプロイする。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

既存の Knative serving クラスタに GKE Sandbox ノードプールを追加する

既存の Knative serving クラスタに、GKE Sandbox の使用を有効にしたノードプールを追加します。この場所で、GKE Sandbox を使用するようにオプトインしたワークロードが実行されます。

GKE Sandbox ノードプールにワークロードをデプロイする

GKE クラスタに GKE Sandbox が有効になっているノードプールを追加したら、Knative serving の構成を更新します。また、新しいノードを使用するようにサービス仕様を更新します。これらの更新は 1 回だけ行う必要があります。

runtime クラスのフィーチャー トグルを有効にする

このセクションでは、knative-serving Namespace の config-features ConfigMap で Knative 機能と拡張機能フラグを使用して、Kubernetes runtime クラスを有効にします。runtime クラスを有効にするには、ConfigMap フラグ kubernetes.podspec-runtimeclassnameenabled に設定します。詳しくは、Knative の機能と拡張機能Kubernetes runtime クラスフラグを構成するをご覧ください。

  1. config-features ConfigMap を開いて編集します。

    kubectl edit configmap config-features -n knative-serving
    
  2. data フィールドに kubernetes.podspec-runtimeclassname: enabled フィーチャー トグルを追加します。

  3. 前述の手順の代わりに、次のコマンドを実行して、このフラグを Knative の機能に適用することもできます。

    kubectl patch configmap config-features \
        --type='json' \
        -p="[{'op': 'replace', 'path': '/data/kubernetes.podspec-runtimeclassname', 'value': 'enabled'}]" \
        -n knative-serving
    
  4. 編集内容を検証するには、次のコマンドを実行して ConfigMap を表示します。

    kubectl get configmap config-features -n knative-serving -o yaml
    

    ConfigMap は次のようになります。

    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: config-features
        namespace: knative-serving
        labels:
            serving.knative.dev/release: v0.22.0
    data:
        kubernetes.podspec-runtimeclassname: enabled
    

GKE Sandbox で実行されるように構成された Service をデプロイする

runtime クラス フィーチャー トグルを有効にした後、仕様で runtimeClassName を指定する Service を作成できます。サービスを GKE Sandbox ノードプールで実行する必要があることを示すには、runtimeClassNamegvisor に設定します。

  1. 次のコマンドを実行して、「Hello World」Knative アプリケーションをデプロイします。

    cat <<EOF | kubectl apply -f -
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
        name: helloworld-go
    spec:
        template:
            spec:
                runtimeClassName: gvisor
                containers:
                    -   image: gcr.io/knative-samples/helloworld-go
                        env:
                        -   name: TARGET
                            value: "gVisor User"
    EOF
    

    Kubernetes runtime クラス名機能が有効になっている場合、コマンドはエラーなしで終了します。

  2. 次のコマンドを実行して、実行中のサービスの Pod と構成された runtime クラスを取得します。

    kubectl get pods \
        -o=custom-columns='NAME:.metadata.name,RUNTIME CLASS:.spec.runtimeClassName,STATUS:.status.phase'
    

    出力は次のようになります。

    NAME                                              RUNTIME CLASS   STATUS
    helloworld-go-00001-deployment-55f58477f-fxm6m    gvisor          Running
    

次のステップ

新しく作成した GKE Sandbox ノードプールに信頼できないアプリをデプロイできることを確認したら、GKE Sandbox ノードプールで実行するその他の信頼できないサービスの Kubernetes 仕様に runtimeClassName: gvisor を追加できます。

その他の情報: