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 Sandbox が有効化されているノードプールがある GKE クラスタを取得したら、Knative serving 構成を更新します。また、新しいノードを使用するように、各サービス仕様を更新します。この更新は 1 回だけ必要です。

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

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

  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 をデプロイする

ランタイム クラス フィーチャー トグルを有効にした後、仕様で 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 ランタイム クラス名の機能が有効になっている場合、コマンドはエラーなしで終了します。

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

    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 を追加できます。

その他の情報: