デフォルトでは、Pod のネットワークトラフィックはノードカーネルを介して転送されます。このプロセスはパフォーマンスの低下を引き起こす可能性があります。より高いネットワークパフォーマンスを実現するために、Pod がホストネットワークモード (hostNetwork) を使用するように構成できます。このモードでは、Pod がノードのネットワーク名前空間を共有でき、パフォーマンス専有型の Container Network Interface (CNI) プラグインやノードレベルのモニタリングに適しています。
本番環境では、ホストネットワークモードを絶対に必要とする Pod にのみ構成してください。ホストネットワークモードの Pod は、そのノードのネットワーク名前空間を使用します。これにより、攻撃の潜在的な影響が増大します。Pod は ネットワークポリシー によって制限されなくなります。代わりに、クラスターセキュリティグループ のルールによって制限されます。
使用方法
ホストネットワークモードを有効にするには、hostNetwork を true に設定します。次に、dnsPolicy を ClusterFirstWithHostNet に設定して、Pod がクラスター内のドメイン名を解決できるようにします。最後に、コンテナー内のプロセスのリスニングポートに一致する containerPort を宣言します。
apiVersion: v1
kind: Pod
metadata:
...
spec:
hostNetwork: true # ホストネットワークモードを有効にします。
dnsPolicy: ClusterFirstWithHostNet # Pod がクラスター内のドメイン名を解決できるようにします。
containers:
- ...
ports:
- containerPort: 12000 # コンテナーがリッスンするポート。これは、コンテナー内のプロセス用に構成されたポートと一致する必要があります。ポート 12000 は一例です。
...適用範囲
ホストネットワークモードは、ワークロードを作成するときにのみ構成できます。既存の Pod を変更してホストネットワークモードを使用することはできません。
手順
次の例では、ホストネットワークモードが有効になっている Pod を使用する DaemonSet をデプロイして、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> をクラスターのリージョン 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 createdPod 情報を確認します。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>ノードにログオンします。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: privilegedpod-security.kubernetes.ioの構成詳細については、「Pod Security Admission」をご参照ください。コンテナーセキュリティポリシー を使用する場合は、ポリシーが Pod のホストネットワークの使用を許可し、Pod ポートが許可された範囲内にあることを確認してください。
Pod がクラスターのドメイン名を解決できないのはなぜですか?
クラスター内のドメイン名を解決するには、ホストネットワークモードの Pod を spec.dnsPolicy: ClusterFirstWithHostNet で構成する必要があります。Pod の構成方法の例については、「手順」セクションをご参照ください。