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

相关推荐
未来侦察班2 小时前
一晃13年过去了,苹果的Airdrop依然很坚挺。
macos·ios·苹果vision pro
金刚猿2 小时前
01_虚拟机中间件部署_root 用户安装 docker 容器,配置非root用户权限
docker·中间件·容器
JH_Kong3 小时前
解决 WSL 中 Docker 权限问题:从踩坑到完整修复
docker·容器
陈桴浮海5 小时前
Kustomize实战:从0到1实现K8s多环境配置管理与资源部署
云原生·容器·kubernetes
张小凡vip5 小时前
Kubernetes--k8s中部署redis数据库服务
redis·kubernetes
Hello.Reader6 小时前
Flink Kubernetes HA(高可用)实战原理、前置条件、配置项与数据保留机制
贪心算法·flink·kubernetes
普通网友7 小时前
苹果笔记本(Mac)连接手机完全指南
macos·智能手机
ShiLiu_mtx7 小时前
k8s - 7
云原生·容器·kubernetes
Aftery的博客9 小时前
Xcode运行报错:SDK does not contain ‘libarclite‘ at the path
macos·cocoa·xcode
MonkeyKing_sunyuhua11 小时前
docker compose up -d --build 完全使用新代码打包的方法
docker·容器·eureka