すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Pod がホストネットワーク (hostNetwork) を使用するように構成する

最終更新日:Nov 14, 2025

デフォルトでは、Pod のネットワークトラフィックはノードカーネルを介して転送されます。このプロセスはパフォーマンスの低下を引き起こす可能性があります。より高いネットワークパフォーマンスを実現するために、Pod がホストネットワークモード (hostNetwork) を使用するように構成できます。このモードでは、Pod がノードのネットワーク名前空間を共有でき、パフォーマンス専有型の Container Network Interface (CNI) プラグインやノードレベルのモニタリングに適しています。

重要

本番環境では、ホストネットワークモードを絶対に必要とする Pod にのみ構成してください。ホストネットワークモードの Pod は、そのノードのネットワーク名前空間を使用します。これにより、攻撃の潜在的な影響が増大します。Pod は ネットワークポリシー によって制限されなくなります。代わりに、クラスターセキュリティグループ のルールによって制限されます。

使用方法

ホストネットワークモードを有効にするには、hostNetworktrue に設定します。次に、dnsPolicyClusterFirstWithHostNet に設定して、Pod がクラスター内のドメイン名を解決できるようにします。最後に、コンテナー内のプロセスのリスニングポートに一致する containerPort を宣言します。

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  hostNetwork: true # ホストネットワークモードを有効にします。
  dnsPolicy: ClusterFirstWithHostNet # Pod がクラスター内のドメイン名を解決できるようにします。
  containers:
  - ...
    ports:
      - containerPort: 12000 # コンテナーがリッスンするポート。これは、コンテナー内のプロセス用に構成されたポートと一致する必要があります。ポート 12000 は一例です。
  ...

適用範囲

ホストネットワークモードは、ワークロードを作成するときにのみ構成できます。既存の Pod を変更してホストネットワークモードを使用することはできません。

手順

次の例では、ホストネットワークモードが有効になっている Pod を使用する DaemonSet をデプロイして、node-exporter でノードレベルのモニタリングを実行します。

  1. <REGION_ID> 変数を、クラスターがデプロイされているリージョンの ID に置き換えます。次に、node-exporter.yaml という名前のファイルを作成して保存します。

    リージョン ID の詳細については、「リージョンとゾーン」をご参照ください。
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: node-exporter-demo
      labels:
        app: node-exporter-demo
    spec:
      selector:
        matchLabels:
          app: node-exporter-demo
      template:
        metadata:
          labels:
            app: node-exporter-demo
        spec:
          hostNetwork: true # ホストネットワークモードを有効にします。
          hostPID: true 
          dnsPolicy: ClusterFirstWithHostNet # Pod がクラスター内のドメイン名を解決できるようにします。
          containers:
          - name: node-exporter-demo
            image: registry-<REGION_ID>-vpc.ack.aliyuncs.com/acs/node-exporter:v0.17.0-slim # <REGION_ID> をクラスターのリージョン ID に置き換えます。
            args:
            - '--path.procfs=/host/proc'
            - '--path.sysfs=/host/sys'
            - '--web.listen-address=0.0.0.0:20000'
            ports:
            - name: metrics
              containerPort: 20000
            volumeMounts:
            - name: proc
              mountPath: /host/proc
              readOnly: true
            - name: sys
              mountPath: /host/sys
              readOnly: true
            resources:
              requests:
                memory: "64Mi"
                cpu: "100m"
              limits:
                memory: "128Mi"
                cpu: "200m"
          volumes:
          - name: proc
            hostPath:
              path: /proc
          - name: sys
            hostPath:
              path: /sys
    
    • spec.hostNetwork: このパラメーターを true に設定して、Pod のホストネットワークモードを有効にします。

    • spec.dnsPolicy: このパラメーターを ClusterFirstWithHostNet に設定して、Pod がクラスター内のドメイン名を解決できるようにします。

    • spec.containers.ports: リスニングポートを指定します。このポート番号は、コンテナー内のアプリケーションがリッスンするポートと一致する必要があります。

  2. DaemonSet を作成します。

    kubectl apply -f node-exporter.yaml

    期待される出力:

    daemonset/node-exporter created
  3. Pod 情報を確認します。Pod の IP アドレスがそのノードの IP アドレスと同じ場合、ホストネットワークモードが有効になっています。

    kubectl get pod -o wide

    次の出力は、Pod の IP アドレスがノードの IP アドレスと同じであることを示しています。

    NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                      NOMINATED NODE   READINESS GATES
    node-exporter-demo-49v**   1/1     Running   0          15h     10.***.8.109     xx-xxxx.10.***.8.109      <none>           <none>
    node-exporter-demo-jdx**   1/1     Running   0          15h     10.***.203.146   xx-xxxx.10.***.203.146    <none>           <none>
    node-exporter-demo-krg**   1/1     Running   0          15h     10.***.105.151   xx-xxxx.10.***.105.151    <none>           <none>
  4. ノードにログオンします。Pod はノードのポート 20000 で直接リッスンします。構成を検証するには、ノードから localhost:20000 でサービスにアクセスします。コマンドがノードのメトリックデータを返した場合、構成は成功です。

    curl localhost:20000/metrics

よくある質問

Pod が Pending 状態になるのはなぜですか?

Pod が長時間 Pending 状態のままである理由は次のとおりです。

  • Pod によって宣言されたポートがノードですでに使用されています。コンテナー内のプロセスがポートにバインドできないため、Pod の起動に失敗します。次のポートは選択しないでください。

    • コアクラスターコンポーネントのポート: 6443、9890、9099、10250、10256、および 30000 から 32767。

    • 標準サービスポート: 22、53、80、および 443。

    • 他のサービスで使用されるカスタムポート。

  • Pod Security Admission (PSA) 構成を使用する場合、ホストネットワークモードの Pod のデプロイメントがブロックされることがあります。PSA 構成を使用する場合は、名前空間が次のラベルを使用していることを確認してください。

    重要

    このラベルを設定すると、Pod にすべての特権操作を実行する権限が付与されます。このラベルは注意して使用してください。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: my-privileged-ns
      labels:
        pod-security.kubernetes.io/enforce: privileged
    pod-security.kubernetes.io の構成詳細については、「Pod Security Admission」をご参照ください。
  • コンテナーセキュリティポリシー を使用する場合は、ポリシーが Pod のホストネットワークの使用を許可し、Pod ポートが許可された範囲内にあることを確認してください。

Pod がクラスターのドメイン名を解決できないのはなぜですか?

クラスター内のドメイン名を解決するには、ホストネットワークモードの Pod を spec.dnsPolicy: ClusterFirstWithHostNet で構成する必要があります。Pod の構成方法の例については、「手順」セクションをご参照ください。