mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-12-24 11:51:13 +08:00
feat: support ipv6
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user