このドキュメントでは、ホストカーネルからのワークロード分離を改善するために、GKE Sandbox を使用するように Google Kubernetes Engine(GKE)で実行される Knative serving を構成する方法について説明します。
目標
- Knative serving クラスタで GKE Sandbox を有効にする方法について説明します。
- サンドボックス化されたノードで実行するように指定されたサービスをデプロイします。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- このチュートリアルは、Knative serving がクラスタにインストールおよび構成されていることを前提としています。
- コマンドライン環境が設定され、ツールが最新であることを確認してください。
既存の 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-runtimeclassname
を enabled
に設定します。詳しくは、Kubernetes ランタイム クラス、Knative の機能と拡張機能のフラグを構成するをご覧ください。
編集用に
config-features
ConfigMap を開きます。kubectl edit configmap config-features -n knative-serving
data
フィールドにkubernetes.podspec-runtimeclassname: enabled
フィーチャー トグルを追加します。前述の手順の代わりに、次のコマンドを実行して、このフラグを Knative の機能にパッチすることもできます。
kubectl patch configmap config-features \ --type='json' \ -p="[{'op': 'replace', 'path': '/data/kubernetes.podspec-runtimeclassname', 'value': 'enabled'}]" \ -n knative-serving
編集内容を検証するには、次のコマンドを実行して 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 ノードプールで実行する必要があることを示すには、runtimeClassName
を gvisor
に設定します。
次のコマンドを実行して、「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 ランタイム クラス名の機能が有効になっている場合、コマンドはエラーなしで終了します。
次のコマンドを実行して、実行中のサービスの 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
を追加できます。
その他の情報:
- GKE Sandbox のドキュメントのドキュメントでは、一部のサービスとの互換性が損なわれる可能性のある制限事項について理解します。
- gVisor(GKE Sandbox とも呼ばれます)に Knative アプリをデプロイする方法に関する詳細なガイドについては、Knative サービスのデプロイに関する gVisor ドキュメントをご覧ください。