全部產品
Search
文件中心

Container Service for Kubernetes:配置Pod使用主機網路模式(hostNetwork)

更新時間:Nov 14, 2025

預設情況下,Pod的網路流量會經過節點核心轉寄,存在一定的效能損耗。將Pod配置為主機網路模式(hostNetwork)可以獲得更高的網路效能,並共用節點的網路命名空間,以滿足高效能CNI外掛程式、節點級監控等需求。

重要

在生產環境中,請只為絕對必要的Pod配置主機網路模式。主機網路模式的Pod使用所在節點的網路命名空間,遭受攻擊時的影響面更大。該Pod將不再受到網路原則(Network Policy)的限制,而受叢集安全性群組規則限制。

使用方式

開啟主機網路模式,需要將 hostNetwork 設定為 true,並配置 dnsPolicy 為 ClusterFirstWithHostNet 以支援叢集網域名稱解析,同時聲明的 containerPort 也必須與容器內進程的監聽連接埠保持一致。

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  hostNetwork: true # 開啟主機網路模式
  dnsPolicy: ClusterFirstWithHostNet # 保證Pod可以解析叢集內網域名稱
  containers:
  - ...
    ports:
      - containerPort: 12000 # 容器監聽的連接埠,需與容器內進程配置一致,12000僅為樣本
  ...

適用範圍

僅支援在建立工作負載時配置,不支援將已有Pod調整為主機網路模式。

操作步驟

下方樣本DaemonSet使用主機網路模式Pod,通過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>需替換為叢集所在地區
            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與所在節點相同,表明Pod已啟用主機網路模式。

    kubectl get pod -o wide

    預期輸出如下,Pod 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即可訪問Pod服務,成功擷取節點指標資料表示配置成功。

    curl localhost:20000/metrics

常見問題

為什麼Pod處於Pending狀態?

下列原因都可能導致Pod長時間處於Pending狀態:

  • Pod聲明的連接埠在節點上已被佔用,容器內進程無法綁定連接埠,導致Pod啟動失敗,請勿選擇下列連接埠:

    • 叢集核心組件連接埠:6443、9890、9099、10250、10256、30000-32767。

    • 標準服務連接埠:22、53、80、443。

    • 其他業務使用的自訂連接埠。

  • 如果使用了Pod Security Admission相關配置,可能會阻礙主機網路模式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。