預設情況下,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實現節點級監控。
將變數
<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: /sysspec.hostNetwork:設定為true即可為Pod開啟主機網路模式。spec.dnsPolicy:需設定為ClusterFirstWithHostNet,以保證Pod可以解析叢集內網域名稱。spec.containers.ports:聲明監聽的連接埠,該連接埠號碼應與容器內應用實際監聽的連接埠保持一致。
建立DaemonSet。
kubectl apply -f node-exporter.yaml預期輸出:
daemonset/node-exporter created查看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>登入節點。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。