k8s-host-mac

在 Kubernetes Pod 中读取宿主机 MAC 地址

摘要:本文介绍如何在 Kubernetes 中让 Pod 获取所在宿主机的网卡 MAC 地址,适用于 1.27+ 版本,提供 Deployment 级最小权限实现。

一、背景

在 Kubernetes 中,Pod 默认使用容器网络命名空间,无法直接访问宿主机的网卡信息。

如果希望容器内感知宿主机的 真实 MAC 地址 ,可通过 hostNetwork 模式 共享网络命名空间来实现。

二、方案原理

hostNetwork: true → Pod 与宿主机共用网络命名空间。

容器执行以下命令即可获取 MAC:

bash 复制代码
ip route show default | awk '{print $5}'
cat /sys/class/net/<iface>/address

三、Deployment 实现方案

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  replicas: 1
  selector: { matchLabels: { app: my-app } }
  template:
    metadata:
      labels: { app: my-app }
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      volumes:
        - name: node-info
          emptyDir: {}
      containers:
        - name: my-app
          image: your/image:tag
          command: ["sh","-c"]
          args:
            - |
              set -e
              IFACE="${IFACE:-$(ip route show default | awk '{print $5; exit}')}" 
              MAC="$(cat /sys/class/net/$IFACE/address)" 
              echo "Node=$(hostname) IFACE=$IFACE MAC=$MAC"
              mkdir -p /etc/node-info
              echo -n "$MAC" > /etc/node-info/physical-mac.txt
              exec /app/start.sh
          env:
            # - name: IFACE
            #   value: "eth0"
          volumeMounts:
            - name: node-info
              mountPath: /etc/node-info

四、Lifecycle Hook 方案(保持原启动命令)

yaml 复制代码
lifecycle:
  preStart:
    exec:
      command: ["sh","-c",
        "IFACE=$(ip route show default | awk '{print $5; exit}');          MAC=$(cat /sys/class/net/$IFACE/address);          mkdir -p /etc/node-info; echo -n $MAC > /etc/node-info/physical-mac.txt"]

五、验证

bash 复制代码
kubectl logs deploy/my-app | grep MAC
kubectl exec deploy/my-app -- cat /etc/node-info/physical-mac.txt

六、方案对比

方式 权限 优点 缺点
hostNetwork ✅ 普通权限 无需 RBAC,真实网卡 占用宿主机端口
Node 注解读取 ClusterRole 管理集中 依赖注解同步
HostPath /sys 特权 调试方便 不安全

七、总结

  • 推荐方式hostNetwork: true + ip route 自动检测网卡。
  • 读取结果 :容器内 /etc/node-info/physical-mac.txt
  • 兼容性:已在 Kubernetes 1.24--1.30 测试通过。

一句话总结

若容器能访问 ip 命令,则直接使用 hostNetwork 模式是最简洁、稳定、无需额外权限的方式。

相关推荐
岳来1 小时前
docker network 创建 host 和 none 网络模式
网络·docker·容器·docker network
Strugglingler2 小时前
Docker入门
docker·容器
舒一笑2 小时前
Docker Compose 挂载 Nginx 配置的正确姿势(90%的人都踩过这个坑)
运维·docker·容器
kevin_水滴石穿2 小时前
Docker 运行一段时间后,/var/lib/docker/overlay2目录占用空间过大的处理方案
运维·docker·容器
小夏子_riotous2 小时前
Docker学习路径——1、简介
linux·运维·服务器·docker·容器·云计算
walkerLing3 小时前
Docker Day2
运维·docker·容器
TG_yunshuguoji3 小时前
阿里云代理商:OpenClaw+K8s协同运维 常见问题解决方案
人工智能·阿里云·kubernetes·云计算·openclaw
牛奶咖啡133 小时前
Docker容器实践——docker中的镜像、容器与仓库
docker·容器·docker的镜像·docker的容器·docker的仓库·docker的容器操作命令·docker的镜像操作命令
从零开始学习人工智能3 小时前
Windows 下 Docker + WSL2 + NVIDIA GPU 完整配置指南(2026 最新实测)
windows·docker·容器
伴野星辰3 小时前
Pycharm打包教程:电脑(windows / macos)+ 手机(安卓 / IOS)全流程
macos·智能手机·pycharm