Windows HostProcess コンテナーを使用する

HostProcess/特権コンテナーは、Windows コンテナー モデルを拡張して、Kubernetes クラスター管理のシナリオをより幅広くすることを可能にします。 HostProcess コンテナーはホスト上で直接実行され、通常のプロセスと同様の動作とアクセスを維持します。 HostProcess コンテナーを使用すると、ユーザーは、コンテナーによって提供されるバージョン管理とデプロイ方法を維持しながら、ホスト アクセスを必要とする管理操作と機能をパッケージ化して配布することができます。

特権デーモンセットは、Kubernetes で変更を実行したり、Linux ホストを監視したりできますが、Windows ホストは監視できません。 HostProcess コンテナーは、Windows でホストの昇格に相当します。

制限事項

  • HostProcess コンテナーには、Kubernetes 1.23 以降が必要です。
  • HostProcess コンテナーには、containerd 1.6 以上のコンテナー ランタイムが必要です。
  • Windows オペレーティング システムの制限により、HostProcess ポッドに含めることができるのは HostProcess コンテナーのみです。 特権のない Windows コンテナーでは、ホスト IP 名前空間と vNIC を共有できません。
  • HostProcess コンテナーは、ホスト上でプロセスとして実行されます。 これらのコンテナーがホストから分離していることは、HostProcess ユーザー アカウントに課されるリソースの制約のみです。
  • HostProcess コンテナーでは、ファイルシステム分離と Hyper-V 分離はサポートされていません。
  • ボリューム マウントはサポートされており、コンテナー ボリュームの下にマウントされます。 「ボリューム マウント」を参照してください。
  • 既定では、ホスト プロセス コンテナーで使用できるホスト ユーザー アカウントのセットが制限されています。 「ユーザー アカウントの選択」を参照してください。
  • ディスク、メモリ、CPU 数などのリソースの制限は、ホスト上のプロセスと同じように機能します。
  • 名前付きパイプ マウントと Unix ドメイン ソケットは直接サポートされていませんが、たとえば \\.\pipe\* などのホスト パスでアクセスできます。

HostProcess ワークロードを実行する

デプロイで HostProcess 機能を使用するには、hostProcess: truehostNetwork: true を設定します。

    spec:
      ...
      securityContext:
         windowsOptions:
           hostProcess: true
           ...
      hostNetwork: true
      containers:
      ...

Windows ノードをもつ既存の AKS クラスターで HostProcess 機能を使用するワークロードの例を実行するには、次の内容のように hostprocess.yaml を作成します。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: privileged-daemonset
  namespace: kube-system
  labels:
    app: privileged-daemonset
spec:
  selector:
    matchLabels:
      app: privileged-daemonset
  template:
    metadata:
      labels:
        app: privileged-daemonset
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      securityContext:
        windowsOptions:
          hostProcess: true
          runAsUserName: "NT AUTHORITY\\SYSTEM"
      hostNetwork: true
      containers:
        - name: powershell
          image: mcr.microsoft.com/powershell:lts-nanoserver-1809 # or lts-nanoserver-ltsc2022
          command:
            - powershell.exe
            - -Command
            - Start-Sleep -Seconds 2147483
      terminationGracePeriodSeconds: 0

kubectl を使用してワークロードの例を実行します。

kubectl apply -f hostprocess.yaml

次の出力が表示されます。

$ kubectl apply -f hostprocess.yaml
daemonset.apps/privileged-daemonset created

ポッドのログを表示して、ワークロードで HostProcess コンテナーの機能が使用されていることを確認します。

kubectl を使用して、kube-system 名前空間内のポッドの名前を検索します。

$ kubectl get pods --namespace kube-system

NAME                                  READY   STATUS    RESTARTS   AGE
...
privileged-daemonset-12345            1/1     Running   0          2m13s

kubectl log を使用してポッドのログを表示し、ポッドに管理者権限があることを確認します。

$ kubectl logs privileged-daemonset-12345 --namespace kube-system
InvalidOperation: Unable to find type [Security.Principal.WindowsPrincipal].
Process has admin rights:

次のステップ

HostProcess コンテナーと Kubernetes アップストリームへの Microsoft の貢献の詳細については、「v1.22 のアルファ: Windows HostProcess コンテナー」を参照してください。