feat: use one clientset

This commit is contained in:
fengcaiwen
2023-03-21 10:36:13 +08:00
parent feabc95ee8
commit 3f7a8f07ee
5 changed files with 135 additions and 67 deletions

View File

@@ -6,6 +6,7 @@ import (
"net/http"
log "github.com/sirupsen/logrus"
"k8s.io/client-go/kubernetes"
"k8s.io/kubectl/pkg/cmd/util"
"github.com/wencaiwulue/kubevpn/pkg/config"
@@ -13,7 +14,8 @@ import (
)
type dhcpServer struct {
f util.Factory
f util.Factory
clientset *kubernetes.Clientset
}
func (d *dhcpServer) rentIP(w http.ResponseWriter, r *http.Request) {
@@ -21,13 +23,7 @@ func (d *dhcpServer) rentIP(w http.ResponseWriter, r *http.Request) {
namespace := r.Header.Get("POD_NAMESPACE")
log.Infof("handling rent ip request, pod name: %s, ns: %s", podName, namespace)
clientset, err := d.f.KubernetesClientSet()
if err != nil {
log.Error(err)
w.WriteHeader(http.StatusBadRequest)
return
}
cmi := clientset.CoreV1().ConfigMaps(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()
if err != nil {
@@ -56,13 +52,7 @@ func (d *dhcpServer) releaseIP(w http.ResponseWriter, r *http.Request) {
}
log.Infof("handling release ip request, pod name: %s, ns: %s", podName, namespace)
clientset, err := d.f.KubernetesClientSet()
if err != nil {
log.Error(err)
w.WriteHeader(http.StatusBadRequest)
return
}
cmi := clientset.CoreV1().ConfigMaps(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 {

View File

@@ -12,6 +12,7 @@ import (
v1 "k8s.io/api/admission/v1"
"k8s.io/api/admission/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes"
cmdutil "k8s.io/kubectl/pkg/cmd/util"
"github.com/wencaiwulue/kubevpn/pkg/config"
@@ -19,7 +20,8 @@ import (
// admissionReviewHandler is a handler to handle business logic, holding an util.Factory
type admissionReviewHandler struct {
f cmdutil.Factory
f cmdutil.Factory
clientset *kubernetes.Clientset
}
// admitv1beta1Func handles a v1beta1 admission
@@ -122,12 +124,19 @@ func serve(w http.ResponseWriter, r *http.Request, admit admitHandler) {
}
func Main(f cmdutil.Factory) error {
h := &admissionReviewHandler{f: f}
clientset, err2 := f.KubernetesClientSet()
if err2 != nil {
return err2
}
h := &admissionReviewHandler{f: f, clientset: clientset}
http.HandleFunc("/pods", func(w http.ResponseWriter, r *http.Request) { serve(w, r, newDelegateToV1AdmitHandler(h.admitPods)) })
http.HandleFunc("/readyz", func(w http.ResponseWriter, req *http.Request) { w.Write([]byte("ok")) })
s := dhcpServer{f: f}
s := &dhcpServer{f: f, clientset: clientset}
http.HandleFunc(config.APIRentIP, s.rentIP)
http.HandleFunc(config.APIReleaseIP, s.releaseIP)
cert, ok := os.LookupEnv(config.TLSCertKey)
if !ok {
return fmt.Errorf("can not get %s from env", config.TLSCertKey)

View File

@@ -11,7 +11,6 @@ import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/kubectl/pkg/cmd/util/podcmd"
"github.com/wencaiwulue/kubevpn/pkg/config"
@@ -51,13 +50,7 @@ func (h *admissionReviewHandler) admitPods(ar v1.AdmissionReview) *v1.AdmissionR
pair := pod.Spec.Containers[i].Env[j]
if pair.Name == config.EnvInboundPodTunIP && pair.Value == "" {
found = true
var clientset *kubernetes.Clientset
clientset, err = h.f.KubernetesClientSet()
if err != nil {
log.Errorf("can not get clientset, err: %v", err)
return toV1AdmissionResponse(err)
}
cmi := clientset.CoreV1().ConfigMaps(ar.Request.Namespace)
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()
@@ -123,13 +116,7 @@ func (h *admissionReviewHandler) admitPods(ar v1.AdmissionReview) *v1.AdmissionR
if envVar.Name == config.EnvInboundPodTunIP && envVar.Value != "" {
ip, cidr, err := net.ParseCIDR(envVar.Value)
if err == nil {
var clientset *kubernetes.Clientset
clientset, err = h.f.KubernetesClientSet()
if err != nil {
log.Errorf("can not get clientset, err: %v", err)
return toV1AdmissionResponse(err)
}
cmi := clientset.CoreV1().ConfigMaps(ar.Request.Namespace)
cmi := h.clientset.CoreV1().ConfigMaps(ar.Request.Namespace)
ipnet := &net.IPNet{
IP: ip,
Mask: cidr.Mask,