このドキュメントでは、ホストカーネルからのワークロード分離を改善するために、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 クラスタに GKE Sandbox が有効になっているノードプールを追加したら、Knative serving の構成を更新します。また、新しいノードを使用するようにサービス仕様を更新します。これらの更新は 1 回だけ行う必要があります。
runtime クラスのフィーチャー トグルを有効にする
このセクションでは、knative-serving
Namespace の config-features
ConfigMap で Knative 機能と拡張機能フラグを使用して、Kubernetes runtime クラスを有効にします。runtime クラスを有効にするには、ConfigMap フラグ kubernetes.podspec-runtimeclassname
を enabled
に設定します。詳しくは、Knative の機能と拡張機能で Kubernetes runtime クラスとフラグを構成するをご覧ください。
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 をデプロイする
runtime クラス フィーチャー トグルを有効にした後、仕様で 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 runtime クラス名機能が有効になっている場合、コマンドはエラーなしで終了します。
次のコマンドを実行して、実行中のサービスの 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
を追加できます。
その他の情報:
- GKE Sandbox のドキュメントのドキュメントには、一部のサービスとの互換性が損なわれる可能性のある制限事項が記載されています。
- gVisor(GKE Sandbox とも呼ばれます)への Knative アプリのデプロイの詳細なガイドについては、Knative サービスのデプロイに関する gVisor のドキュメントをご覧ください。