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 模式是最简洁、稳定、无需额外权限的方式。

相关推荐
天庭鸡腿哥12 分钟前
无须激活,安装即是Pro版!
microsoft·macos·visual studio·everything
九思x2 小时前
通过docker-compose.yml文件一次性安装mysql、minio、redis服务
运维·docker·容器
scx_link3 小时前
使用docker安装ollama及ollama拉取模型的总结
运维·docker·容器·ollama
lingggggaaaa5 小时前
CS配合CrossC2插件,实现MacOS/Linux上线
linux·运维·笔记·安全·macos
java_logo5 小时前
AdguardHome Docker 容器化部署指南
运维·docker·容器·jenkins·adguardhome·部署adguardhome·docker adguard
yuguo.im5 小时前
从零开始:Docker Compose YAML 文件深度解析与最佳实践
运维·docker·容器
码界奇点5 小时前
Unity WebGL输入支持终极指南解决浏览器输入难题的完整方案
unity·容器·游戏引擎·鸿蒙系统·webgl
yuguo.im6 小时前
Docker Compose 和 Docker Swarm
docker·容器
罗不丢6 小时前
docker镜像配置
运维·docker·容器
杰克逊的日记6 小时前
k8s某pod节点资源使用率过高,如何调整
linux·docker·kubernetes