K8S-DHCP
Kubernetes本地dhcp服务器。
该服务器可以通过创建和编辑kubernetes对象dhcpserver,dhcpsubnet 和可选的dhcphost 来配置。
服务器实例
要开始监听,至少要创建一个dhcpserver 对象:
apiVersion: dhcp.kaas.mirantis.com/v1alpha1
kind: DHCPServer
metadata:
name: dhcpserver-sample-1
spec:
listenInterface: enp0s3
listenAddress: 10.0.1.1
listenInterface如果这个字段为空,服务器将在所有接口上进行监听。listenAddress如果为空,服务器将监听 。0.0.0.0
子网
每个子网由dhcpsubnet 对象表示:
apiVersion: dhcp.kaas.mirantis.com/v1alpha1
kind: DHCPSubnet
metadata:
name: dhcpsubnet-sample-broadcast
spec:
subnet: 10.0.1.0/24
rangeFrom: 10.0.1.100
rangeTo: 10.0.1.200
gateway: 10.0.1.254
bootFileName: http://1.2.3.4/undionly.kpxe
leaseTime: 3600
dns:
- 1.1.1.1
- 8.8.8.8
options:
- id: 66
type: string
value: 10.12.0.1
subnet子网地址需要rangeFrom必须的rangeTo必需的gateway必需的bootFileName可选leaseTime需要dns可选的options响应中包含的dhcp选项的列表可选的
每个服务器实例可以为多个子网服务。服务器将为每个请求自动检测适当的子网,并根据dhcpsubnet 和可能的dhcplease 设置构建 dhcp 响应。
对未知子网的请求将被忽略。
静态主机
如果需要,可以通过创建dhcphost 对象来应用每个主机配置:
apiVersion: dhcp.kaas.mirantis.com/v1alpha1
kind: DHCPHost
metadata:
name: host-sample-1
spec:
subnet: 10.0.1.0/24
mac: "00:01:02:03:04:05"
ip: 10.0.1.20
gateway: 10.0.1.3
hostname: sample-pxe-node
dns:
- 1.1.1.1
- 8.8.4.4
options:
- id: 66
type: string
value: 1.1.2.2
serverHostName: example.net
bootFileName: http://10.1.2.3/alternate.ipxe
leaseTime: 3600
subnet是对子网的引用需要mac客户端硬件地址必需的ip客户端固定ip地址可以在范围之外,但必须在子网之内。如果是空的,将从池中取出gateway可选的hostname可选的dns可选的options可选的serverHostName可选的bootFileName可选的leaseTime可选的
当至少有一个dhcpserver ,服务器就开始监听和记录dhcp请求,当至少有一个dhcpsubnet ,就开始响应。
$ kubectl get dhcpservers
NAME INTERFACE LISTEN
dhcpserver-sample-br1 br1
dhcpserver-veth 1 veth1 10.7.0.1
$ kubectl get dhcpsubnets
NAME SUBNET FROM TO GATEWAY
dhcpsubnet-sample-br1 10.10.0.0/16 10.10.1.100 10.10.255.200 10.10.0.1
dhcpsubnet-sample-veth1 10.11.0.0/16 10.11.1.1 10.11.255.250 10.11.255.254
dhcpsubnet-test-relay 10.7.0.0/16 10.7.1.100 10.7.255.200 10.7.0.1
TODO:
- 尽量少保留dhcpleases对象。
- 检测另一个服务器的启动。
- 在启动服务器前加载所有子网、租约和主机。
- 配置命名空间。
- 记录服务器版本。
- 添加 ping 检查选项。
- 处理子网更新。
- 处理主机名。
- 支持dhcp NAK。
- 支持dhcp INFORM;
- 添加验证webhooks。
- 增加突变的webhooks,以增加OwnerRef;
- 条件性选项。
- 尊重请求的选项。
- 制作测试客户端。
- 在服务器/监听中添加ReuseAddr属性。
- 如果绑定失败则退出。
- dhcp选项43(vendor-option-space)。
K8S README
开始使用
你需要一个Kubernetes集群来运行。你可以使用Minikube获得一个本地集群进行测试,或者针对一个远程集群运行。**注意:**你的控制器将自动使用你的kubeconfig文件中的当前上下文(即任何集群kubectl cluster-info )。
在集群上运行
- 安装自定义资源的实例:
kubectl apply -f config/samples/
- 构建并推送你的镜像到
IMG所指定的位置:
make docker-build docker-push IMG=<some-registry>/k8s-dhcp:tag
- 用
IMG所指定的镜像将控制器部署到集群上:
make deploy IMG=<some-registry>/k8s-dhcp:tag
卸载CRD
要从集群中删除CRD:
make uninstall
卸载控制器
卸载控制器到集群上:
make undeploy
贡献
// TODO(用户)。添加详细的信息,说明你希望别人如何为这个项目做贡献
它是如何工作的
本项目旨在遵循Kubernetes运营商的模式
它使用了控制器,提供了一个协调功能,负责同步资源,直到集群上达到所需的状态。
测试一下
- 在集群中安装CRD。
make install
- 运行你的控制器(这将在前台运行,所以如果你想让它运行,请切换到一个新的终端)。
make run
注意你也可以通过运行以下程序一步到位。make install run
修改API定义
如果你正在编辑API定义,请用以下方法生成清单,如CRs或CRD:
make manifests
注意运行make --help ,了解所有潜在的make 目标的更多信息
许可证
Copyright 2022.
根据Apache许可证2.0版("许可证")进行许可;除非符合许可证的规定,否则您不得使用此文件。 您可以在以下网址获得许可证的副本
http://www.apache.org/licenses/LICENSE-2.0
除非适用的法律要求或书面同意,根据许可证分发的软件是以 "现状 "为基础的,没有任何形式的保证或条件,无论是明示的还是暗示的。 有关许可证下的权限和限制的具体语言,请参阅许可证。