feat: support ipv6

This commit is contained in:
wencaiwulue
2023-03-31 22:25:43 +08:00
committed by wencaiwulue
parent 16eb86290f
commit 2227a82125
38 changed files with 779 additions and 460 deletions

View File

@@ -19,43 +19,44 @@ type dhcpServer struct {
}
func (d *dhcpServer) rentIP(w http.ResponseWriter, r *http.Request) {
podName := r.Header.Get("POD_NAME")
namespace := r.Header.Get("POD_NAMESPACE")
podName := r.Header.Get(config.HeaderPodName)
namespace := r.Header.Get(config.HeaderPodNamespace)
log.Infof("handling rent ip request, pod name: %s, ns: %s", podName, namespace)
cmi := d.clientset.CoreV1().ConfigMaps(namespace)
dhcp := handler.NewDHCPManager(cmi, namespace, &net.IPNet{IP: config.RouterIP, Mask: config.CIDR.Mask})
random, err := dhcp.RentIPRandom()
dhcp := handler.NewDHCPManager(cmi, namespace)
v4, v6, err := dhcp.RentIPRandom()
if err != nil {
log.Error(err)
w.WriteHeader(http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusOK)
_, err = w.Write([]byte(random.String()))
// todo patch annotation
_, err = w.Write([]byte(fmt.Sprintf("%s,%s", v4.String(), v6.String())))
if err != nil {
log.Error(err)
}
}
func (d *dhcpServer) releaseIP(w http.ResponseWriter, r *http.Request) {
podName := r.Header.Get("POD_NAME")
namespace := r.Header.Get("POD_NAMESPACE")
ip := r.Header.Get("IP")
podName := r.Header.Get(config.HeaderPodName)
namespace := r.Header.Get(config.HeaderPodNamespace)
_, ipNet, err := net.ParseCIDR(ip)
if err != nil {
log.Errorf("ip is invailed, ip: %s, err: %v", ip, err)
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(fmt.Sprintf("ip is invailed, ip: %s, err: %v", ip, err)))
return
var ips []net.IP
for _, s := range []string{r.Header.Get(config.HeaderIPv4), r.Header.Get(config.HeaderIPv6)} {
ip, _, err := net.ParseCIDR(s)
if err != nil {
log.Errorf("ip is invailed, ip: %s, err: %v", ip.String(), err)
continue
}
ips = append(ips, ip)
}
log.Infof("handling release ip request, pod name: %s, ns: %s", podName, namespace)
cmi := d.clientset.CoreV1().ConfigMaps(namespace)
dhcp := handler.NewDHCPManager(cmi, namespace, &net.IPNet{IP: config.RouterIP, Mask: config.CIDR.Mask})
err = dhcp.ReleaseIpToDHCP(ipNet)
if err != nil {
dhcp := handler.NewDHCPManager(cmi, namespace)
if err := dhcp.ReleaseIpToDHCP(ips...); err != nil {
log.Error(err)
w.WriteHeader(http.StatusBadRequest)
return

View File

@@ -46,14 +46,14 @@ func (h *admissionReviewHandler) admitPods(ar v1.AdmissionReview) *v1.AdmissionR
var found bool
for i := 0; i < len(pod.Spec.Containers); i++ {
if pod.Spec.Containers[i].Name == config.ContainerSidecarVPN {
var v4, v6 *net.IPNet
for j := 0; j < len(pod.Spec.Containers[i].Env); j++ {
pair := pod.Spec.Containers[i].Env[j]
if pair.Name == config.EnvInboundPodTunIP && pair.Value == "" {
if pair.Name == config.EnvInboundPodTunIPv4 && pair.Value == "" {
found = true
cmi := h.clientset.CoreV1().ConfigMaps(ar.Request.Namespace)
dhcp := handler.NewDHCPManager(cmi, ar.Request.Namespace, &net.IPNet{IP: config.RouterIP, Mask: config.CIDR.Mask})
var random *net.IPNet
random, err = dhcp.RentIPRandom()
dhcp := handler.NewDHCPManager(cmi, ar.Request.Namespace)
v4, v6, err = dhcp.RentIPRandom()
if err != nil {
log.Errorf("rent ip random failed, err: %v", err)
return toV1AdmissionResponse(err)
@@ -62,9 +62,16 @@ func (h *admissionReviewHandler) admitPods(ar v1.AdmissionReview) *v1.AdmissionR
if accessor, errT := meta.Accessor(ar.Request.Object); errT == nil {
name = accessor.GetName()
}
log.Infof("rent ip %s for pod %s in namespace: %s", random.String(), name, ar.Request.Namespace)
pod.Spec.Containers[i].Env[j].Value = random.String()
log.Infof("rent ipv4: %s ipv6: %s for pod %s in namespace: %s", v4.String(), v6.String(), name, ar.Request.Namespace)
}
}
for j := 0; j < len(pod.Spec.Containers[i].Env); j++ {
pair := pod.Spec.Containers[i].Env[j]
if pair.Name == config.EnvInboundPodTunIPv4 && v4 != nil {
pod.Spec.Containers[i].Env[j].Value = v4.String()
}
if pair.Name == config.EnvInboundPodTunIPv6 && v6 != nil {
pod.Spec.Containers[i].Env[j].Value = v6.String()
}
}
}
@@ -110,28 +117,24 @@ func (h *admissionReviewHandler) admitPods(ar v1.AdmissionReview) *v1.AdmissionR
return toV1AdmissionResponse(err)
}
name, _ := podcmd.FindContainerByName(&pod, config.ContainerSidecarVPN)
if name != nil {
for _, envVar := range name.Env {
if envVar.Name == config.EnvInboundPodTunIP && envVar.Value != "" {
ip, cidr, err := net.ParseCIDR(envVar.Value)
if err == nil {
cmi := h.clientset.CoreV1().ConfigMaps(ar.Request.Namespace)
ipnet := &net.IPNet{
IP: ip,
Mask: cidr.Mask,
}
err = handler.NewDHCPManager(cmi, ar.Request.Namespace, &net.IPNet{IP: config.RouterIP, Mask: config.CIDR.Mask}).ReleaseIpToDHCP(ipnet)
if err != nil {
log.Errorf("release ip to dhcp err: %v, ip: %s", err, envVar.Value)
} else {
log.Errorf("release ip to dhcp ok, ip: %s", envVar.Value)
}
container, _ := podcmd.FindContainerByName(&pod, config.ContainerSidecarVPN)
if container != nil {
var ips []net.IP
for _, envVar := range container.Env {
if envVar.Name == config.EnvInboundPodTunIPv4 || envVar.Name == config.EnvInboundPodTunIPv6 {
if ip, _, err := net.ParseCIDR(envVar.Value); err == nil {
ips = append(ips, ip)
}
}
}
cmi := h.clientset.CoreV1().ConfigMaps(ar.Request.Namespace)
err := handler.NewDHCPManager(cmi, ar.Request.Namespace).ReleaseIpToDHCP(ips...)
if err != nil {
log.Errorf("release ip to dhcp err: %v, ips: %v", err, ips)
} else {
log.Errorf("release ip to dhcp ok, ip: %v", ips)
}
}
return &v1.AdmissionResponse{
Allowed: true,
}