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 天前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
pe7er3 天前
macOS 应用无法打开(权限问题)解决方案
macos·mac
蝎子莱莱爱打怪5 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀5 天前
Docker部署Nacos
docker·容器
缓解AI焦虑5 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
1candobetter5 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
阿里云云原生5 天前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
kubernetes
至此流年莫相忘5 天前
Kubernetes实战篇之配置与存储
云原生·容器·kubernetes
小马爱打代码6 天前
Docker:完全指南从入门到精通
运维·docker·容器