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