Kubernetes本地dhcp服务器的详细指南

509 阅读4分钟

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 )。

在集群上运行

  1. 安装自定义资源的实例:
kubectl apply -f config/samples/
  1. 构建并推送你的镜像到IMG 所指定的位置:
make docker-build docker-push IMG=<some-registry>/k8s-dhcp:tag
  1. IMG 所指定的镜像将控制器部署到集群上:
make deploy IMG=<some-registry>/k8s-dhcp:tag

卸载CRD

要从集群中删除CRD:

make uninstall

卸载控制器

卸载控制器到集群上:

make undeploy

贡献

// TODO(用户)。添加详细的信息,说明你希望别人如何为这个项目做贡献

它是如何工作的

本项目旨在遵循Kubernetes运营商的模式

它使用了控制器,提供了一个协调功能,负责同步资源,直到集群上达到所需的状态。

测试一下

  1. 在集群中安装CRD。
make install
  1. 运行你的控制器(这将在前台运行,所以如果你想让它运行,请切换到一个新的终端)。
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

除非适用的法律要求或书面同意,根据许可证分发的软件是以 "现状 "为基础的,没有任何形式的保证或条件,无论是明示的还是暗示的。 有关许可证下的权限和限制的具体语言,请参阅许可证。