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 小时前
从零开始的云原生之旅(十七):K8s 配置管理最佳实践
云原生·容器·kubernetes
德生coding2 小时前
linux系统多网卡共用一个MAC地址的使用问题
macos
q***T5832 小时前
Docker文本处理开发
运维·docker·容器
biubiubiu07062 小时前
给Docker设置代理
运维·docker·容器
Hellc0072 小时前
Docker网段与阿里云RDS内网冲突:深度分析与解决方案
阿里云·docker·容器
h***83932 小时前
Docker测试框架使用指南
运维·docker·容器
稚辉君.MCA_P8_Java2 小时前
玻尔 SpringBoot性能优化
大数据·spring boot·后端·性能优化·kubernetes
7***n753 小时前
Docker镜像瘦身
运维·docker·容器
企鹅侠客4 小时前
Kubernetes-node资源预留
云原生·容器·kubernetes