Docker MAC地址生成

我有一个关于在Docker容器和UUID生成中运行的应用程序的问题。

这是我们的场景:

  • 目前我们的应用程序正在使用事件驱动框架。

  • 对于我们根据mac地址生成UUID的事件,pid,
    时间戳和计数器。

  • 为了在像CoreOS这样的分布式系统上运行容器(虽然机会非常非常低),但不能保证用于生成UUID的所有参数对于每个容器都是唯一的,因为集群中一个服务器上的一个容器可以生成UUID使用相同的mac,pid,时间戳和计数器作为集群上的另一个容器。

  • 实质上,如果这两个UUID都是生成一个事件并发送给我们的消息总线的话,那么显然会有冲突。

在我们的分析中,这种情况似乎归结为每个Docker容器上的mac地址的唯一性。

所以要坦率地说:

  • 容器内的MAC地址有多独特?
  • 如果没有手动设置,如何生成MAC地址?

从我读到的generateMacAddr函数 ( 编辑回答涉及1.3.0-dev ,但是对于17.05仍然是正确的 ), docker0生成的MAC地址本质上是docker0网桥上容器接口的IPv4地址:它们保证一致与IP地址。

根据docker0网桥的子网(通常为255.255.0.0必须具有65,534个可路由地址。 这确实减less了UUID产生的熵,但是MAC地址冲突是不可能的,因为IP必须是唯一的,并且在同一个docker服务器/ CoreOS主机上的两个容器中的MAC,PID,时间和计数器相同的情况不应该是可能的。

但是,两台CoreOS主机(每台主机都运行一台docker服务器)可能会select相同的随机子网,从而导致不同主机上的容器可能出现重复的MAC。 您可以通过在每个主机上为docker服务器设置一个固定的CIDR来避开这个问题:

--fixed-cidr=CIDR – 使用像172.167.1.0/28这样的标准CIDR表示法来限制docker0子网的IP范围。 此范围必须是固定IP的IPv4范围(例如: 10.20.0.0/16 ),并且必须是网桥IP范围的子集( docker0或使用--bridge设置)。 例如,使用--fixed-cidr=192.168.1.0/25 ,您的容器的IP将从192.168.1.0/24子网的前半部分中select。

这应该确保群集中唯一的MAC地址。

原始的IEEE 802 MAC地址来自原始的施乐以太网寻址scheme。 该48位地址空间可能包含248或281,474,976,710,656个可能的MAC地址。

资源

如果您担心熵不足(IP到MAC映射大大降低了熵),则更好的select可能是使用不同的UUID生成机制。 UUID版本3,4和5 不考虑MAC地址 。 或者,您可以在UUID生成中包含主机MAC。

当然,这个“相当大的MAC空间减less”是否会对UUID的产生有什么影响,应该在任何代码改变之前进行testing。

与上面链接的来源:

 // Generate a IEEE802 compliant MAC address from the given IP address. // // The generator is guaranteed to be consistent: the same IP will always yield the same // MAC address. This is to avoid ARP cache issues. func generateMacAddr(ip net.IP) net.HardwareAddr { hw := make(net.HardwareAddr, 6) // The first byte of the MAC address has to comply with these rules: // 1. Unicast: Set the least-significant bit to 0. // 2. Address is locally administered: Set the second-least-significant bit (U/L) to 1. // 3. As "small" as possible: The veth address has to be "smaller" than the bridge address. hw[0] = 0x02 // The first 24 bits of the MAC represent the Organizationally Unique Identifier (OUI). // Since this address is locally administered, we can do whatever we want as long as // it doesn't conflict with other addresses. hw[1] = 0x42 // Insert the IP address into the last 32 bits of the MAC address. // This is a simple way to guarantee the address will be consistent and unique. copy(hw[2:], ip.To4()) return hw }