k8sp / sextant

Fully automatic installation of CoreOS+Kubernetes clusters
Apache License 2.0
91 stars 29 forks source link

网络环境中已存在DHCP服务的情况下,如何使用另一个DHCP服务自动安装k8s集群 #73

Open typhoonzero opened 8 years ago

typhoonzero commented 8 years ago

如题,k8s集群的部署环境会基于某些已经存在DHCP服务的集群环境,比如云知声的环境和百分点的环境。所以需要一种方式,能避免k8s集群自动安装后自动分配的IP和现有已存在的环境发生冲突。现有的方案和想法:

  1. 将k8s集群和现有的集群物理隔开
  2. 使用DHCP,将第一次分配给同一MAC地址的IP,之后始终分配给这个MAC地址
  3. 使用DHCP作为安装过程引导的IP自动分配,安装过程使用DHCP客户端或自定义的分配IP的程序完成IP的分配,并配置成为静态IP,之后的系统重启就不会再访问DHCP服务了
wangkuiyi commented 8 years ago
  1. 需要DHCP有记忆功能?这个怎么实现呢?
  2. 是说node第一次从DHCP拿到了IP之后,就把IP写入自己的/etc/network/interfaces文件里?那么如果DHCP忘记了这个IP曾经分配出去过,接下来分给了一台新机器,是不是就导致机群里有两台机器IP冲突了?
LestDou commented 8 years ago

@typhoonzero @wangkuiyi DHCP的ip绑定mac是通过dhcp配置实现的 假如使用这种方式的话,那么想实现自动化就需要程序去生成mac对应的ip配置追加到dhcp配置,然后还需要重启dhcp服务才能生效 如果使用@wangkuiyi所说的2方式,那么就没有必要去使用dhcp,直接分配到cc中就可以 假如ip无法固定则当前会有以下问题需要解决:

  1. 机器硬件故障无法快速定位到物理机器
  2. 监控如何去做 (例如ping监控等)
  3. 如果机器重启,则会通过dhcp自动进入pxe,引导重装系统。(但可以修改BIOS配置避免开机获取pxe信息,但这需要人工干预)
typhoonzero commented 8 years ago

最终MAC和IP还是需要有绑定的关系的,而且一旦使用DHCP分配好的IP,就需要保留足够长的时间。

这个链接里有提到,可以使用_omshell_完成DHCP的配置而无需重启DHCP服务: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s1-dhcp-configuring-server.html

现在已经有2处现成的地方可以做这件事:

  1. DHCP:节点启动后,使用omshell更新DHCP,将MAC和IP绑定
  2. SkyDNS:节点启动后,先从SkyDNS的etcd查找对应自己MAC地址的记录,如果有,则分配这个IP;如果没有,就使用DHCP获取IP,并更新etcd

如果要使用DHCP的go语言客户端,可以参考:https://golanglibs.com/top?q=DHCP

typhoonzero commented 8 years ago

会将IP生成和cert生成(https://github.com/k8sp/auto-install/pull/71 ),解藕,并独立作为两个功能。

IP生成可采用上述方法2 。在cc中定义一个unit(systemd service),使用一个脚本或程序,完成检查SkyDNS中的记录,有责恢复,无则生成。

后续的操作将依赖这个服务即可保持唯一的ip

pineking commented 8 years ago

我有两个问题:

  1. 为什么需要IP和mac地址绑定?
  2. 如果需要绑定,我支持在DHCP的配置里将MAC和IP地址绑定,然后各个节点通过DHCP获取IP地址

上面的讨论: 假如ip无法固定则当前会有以下问题需要解决:

  1. 机器硬件故障无法快速定位到物理机器 【pineking】hostname用mac能否解决快速定位的问题?
  2. 监控如何去做 (例如ping监控等) 【pineking】ping监控是什么意思?
  3. 如果机器重启,则会通过dhcp自动进入pxe,引导重装系统。(但可以修改BIOS配置避免开机获取pxe信息,但这需要人工干预) 【pineking】这个和DHCP没关系,是PXE的问题吧,设置成硬盘引导优先就可以了,而且不影响第一次PXE安装系统
pineking commented 8 years ago
  1. SkyDNS:节点启动后,先从SkyDNS的etcd查找对应自己MAC地址的记录,如果有,则分配这个IP;如果没有,就使用DHCP获取IP,并更新etcd IP生成可采用上述方法2 。在cc中定义一个unit(systemd service),使用一个脚本或程序,完成检查SkyDNS中的记录,有责恢复,无则生成。

【pineking】这个对skydns功能理解有点问题, skydns不是这么用的,skydns只在bootstrapper上启动,通过查询etcd里的hostname和IP的存储信息提供dns服务,可以看做是用etcd做信息存储后端的类bind的dns 服务软件,各个节点上并没有skydns,只是用bootstrapper当做nameserver,来获取dns解析

节点启动后,先从SkyDNS的etcd查找对应自己MAC地址的记录,如果有,则分配这个IP;如果没有,就使用DHCP获取IP,并更新etcd

【pineking】 节点上不存在skydns的概念,节点获取IP之前,没法和etcd通讯吧,我觉得还是IP还是来自同一个分发源,多IP来源会有很多不可预料的情况,容易冲突。

pineking commented 8 years ago

需要DHCP有记忆功能?这个怎么实现呢? 【pineking】dhcp的租约是不是你所说的记忆功能,在租约期的一半时间client会主动申请续约

是说node第一次从DHCP拿到了IP之后,就把IP写入自己的/etc/network/interfaces文件里?那么如果DHCP忘记了这个IP曾经分配出去过,接下来分给了一台新机器,是不是就导致机群里有两台机器IP冲突了?

【pineking】IP还是统一由一个地方分配比较好,不要分配和静态并存,多个来源

pineking commented 8 years ago

我觉得skydhcp可以满足我们的要求,像skydns一样,用etcd做dhcp后端存储,不需要自己在dhcp配置里写死IP和mac绑定,https://github.com/skynetservices/skydns/issues/135

typhoonzero commented 8 years ago

为什么需要IP和mac地址绑定?

同意IP需要有一个统一的地方分配。维护数据一致性会非常头疼。

@pineking skydhcp我看看,有点意思。

pineking commented 8 years ago

@typhoonzero 我现在觉得DHCP这种基础服务依赖etcd,有点不靠谱,etcd挂了,DHCP就挂了

好处是skydns和skydhcp都用 etcd,信息共享,节点就不需要set-dns-to-etcd 向etcd汇报自己的hostname了

typhoonzero commented 8 years ago

@pineking 之前的讨论也提到了,集群依赖DHCP服务也有问题,DHCP挂了,这个集群都有问题,尤其是开了coreos自动更新。etcd还好可以配置成集群。

typhoonzero commented 8 years ago

最安全稳定的是host起来之后就分配好静态IP地址。

pineking commented 8 years ago

@typhoonzero 静态IP感觉灵活性不足,后面想调整不容易,通过DHCP,调整在bootstrapper上改dhcp配置就可以了,而且dhcp通过IP和MAC绑定,也能实现静态IP分配的效果

typhoonzero commented 8 years ago

如果使用DHCP我们就需要有一个方案确保DHCP服务是高可用的,避免CoreOS发版导致集群节点都无法正常配置网络

typhoonzero commented 8 years ago

参考链接:如何配置同一个集群的2个DHCP服务,以及如何配置DHCP的高可用 http://serverfault.com/questions/368512/can-i-have-multiple-dhcp-servers-on-one-network

另外,我觉得可以把“静态IP”和“DHCP”作为用户的选项,在cloud-config-server启动的时候传入分别实现不同功能。满足不同场景的需求。

wangkuiyi commented 8 years ago

这个图中 http://www.tcpipguide.com/free/t_DHCPLeaseAllocationProcess-2.htm 展示了网络中可以有多个DHCP server。Client会选一个。至于具体怎么选择,还需要再看看。

typhoonzero commented 8 years ago

我在做 通过cloud-config-server 启动参数增加可以设置worker通过cc配置静态网络,不增加此参数则默认都适用DHCP

其中涉及到固定几种网络的方式:

  1. 单网卡静态IP配置(百分点这类机器很少)
  2. 配置2个网卡作为bond0--作为普遍的worker节点
  3. 配置2个网卡作为bond0, 另外2个网卡作为bond1--作为web前端机,通常有内网IP和外网IP

@wangkuiyi @pineking 看下是否还有其他的网络配置需求。