mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-09-27 03:36:09 +08:00
hotfix: restore service target port while leave resource in gvisor mode (#476)
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
|
|
||||||
"github.com/wencaiwulue/kubevpn/v2/pkg/config"
|
"github.com/wencaiwulue/kubevpn/v2/pkg/config"
|
||||||
"github.com/wencaiwulue/kubevpn/v2/pkg/controlplane"
|
"github.com/wencaiwulue/kubevpn/v2/pkg/controlplane"
|
||||||
@@ -38,8 +39,15 @@ func (svr *Server) Leave(req *rpc.LeaveRequest, resp rpc.Daemon_LeaveServer) err
|
|||||||
log.Errorf("Failed to get unstructured object: %v", err)
|
log.Errorf("Failed to get unstructured object: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
u := object.Object.(*unstructured.Unstructured)
|
||||||
|
templateSpec, _, err := util.GetPodTemplateSpecPath(u)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to get template spec path: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
// add rollback func to remove envoy config
|
// add rollback func to remove envoy config
|
||||||
err = inject.UnPatchContainer(factory, maps, object, func(isFargateMode bool, rule *controlplane.Rule) bool {
|
var empty bool
|
||||||
|
empty, err = inject.UnPatchContainer(factory, maps, object, func(isFargateMode bool, rule *controlplane.Rule) bool {
|
||||||
if isFargateMode {
|
if isFargateMode {
|
||||||
return svr.connect.IsMe(util.ConvertWorkloadToUid(workload), rule.Headers)
|
return svr.connect.IsMe(util.ConvertWorkloadToUid(workload), rule.Headers)
|
||||||
}
|
}
|
||||||
@@ -49,6 +57,9 @@ func (svr *Server) Leave(req *rpc.LeaveRequest, resp rpc.Daemon_LeaveServer) err
|
|||||||
log.Errorf("Leaving workload %s failed: %v", workload, err)
|
log.Errorf("Leaving workload %s failed: %v", workload, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if empty {
|
||||||
|
err = inject.ModifyServiceTargetPort(resp.Context(), svr.connect.GetClientset(), namespace, templateSpec.Labels, map[int32]int32{})
|
||||||
|
}
|
||||||
svr.connect.LeavePortMap(workload)
|
svr.connect.LeavePortMap(workload)
|
||||||
err = util.RolloutStatus(resp.Context(), factory, namespace, workload, time.Minute*60)
|
err = util.RolloutStatus(resp.Context(), factory, namespace, workload, time.Minute*60)
|
||||||
}
|
}
|
||||||
|
@@ -43,12 +43,13 @@ func createOutboundPod(ctx context.Context, factory cmdutil.Factory, clientset *
|
|||||||
}
|
}
|
||||||
var deleteResource = func(ctx context.Context) {
|
var deleteResource = func(ctx context.Context) {
|
||||||
options := metav1.DeleteOptions{}
|
options := metav1.DeleteOptions{}
|
||||||
_ = clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Delete(ctx, config.ConfigMapPodTrafficManager+"."+namespace, options)
|
name := config.ConfigMapPodTrafficManager
|
||||||
_ = clientset.RbacV1().RoleBindings(namespace).Delete(ctx, config.ConfigMapPodTrafficManager, options)
|
_ = clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Delete(ctx, name+"."+namespace, options)
|
||||||
_ = clientset.RbacV1().Roles(namespace).Delete(ctx, config.ConfigMapPodTrafficManager, options)
|
_ = clientset.RbacV1().RoleBindings(namespace).Delete(ctx, name, options)
|
||||||
_ = clientset.CoreV1().ServiceAccounts(namespace).Delete(ctx, config.ConfigMapPodTrafficManager, options)
|
_ = clientset.RbacV1().Roles(namespace).Delete(ctx, name, options)
|
||||||
_ = clientset.CoreV1().Services(namespace).Delete(ctx, config.ConfigMapPodTrafficManager, options)
|
_ = clientset.CoreV1().ServiceAccounts(namespace).Delete(ctx, name, options)
|
||||||
_ = clientset.AppsV1().Deployments(namespace).Delete(ctx, config.ConfigMapPodTrafficManager, options)
|
_ = clientset.CoreV1().Services(namespace).Delete(ctx, name, options)
|
||||||
|
_ = clientset.AppsV1().Deployments(namespace).Delete(ctx, name, options)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -9,6 +9,7 @@ import (
|
|||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/utils/pointer"
|
"k8s.io/utils/pointer"
|
||||||
"sigs.k8s.io/yaml"
|
"sigs.k8s.io/yaml"
|
||||||
|
|
||||||
@@ -95,7 +96,14 @@ func (c *ConnectOptions) LeaveAllProxyResources(ctx context.Context) (err error)
|
|||||||
log.Errorf("Failed to get unstructured object: %v", err)
|
log.Errorf("Failed to get unstructured object: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = inject.UnPatchContainer(c.factory, c.clientset.CoreV1().ConfigMaps(c.Namespace), object, func(isFargateMode bool, rule *controlplane.Rule) bool {
|
u := object.Object.(*unstructured.Unstructured)
|
||||||
|
templateSpec, _, err := util.GetPodTemplateSpecPath(u)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to get template spec path: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var empty bool
|
||||||
|
empty, err = inject.UnPatchContainer(c.factory, c.clientset.CoreV1().ConfigMaps(c.Namespace), object, func(isFargateMode bool, rule *controlplane.Rule) bool {
|
||||||
if isFargateMode {
|
if isFargateMode {
|
||||||
return c.IsMe(util.ConvertWorkloadToUid(workload), rule.Headers)
|
return c.IsMe(util.ConvertWorkloadToUid(workload), rule.Headers)
|
||||||
}
|
}
|
||||||
@@ -105,6 +113,9 @@ func (c *ConnectOptions) LeaveAllProxyResources(ctx context.Context) (err error)
|
|||||||
log.Errorf("Failed to leave workload %s: %v", workload, err)
|
log.Errorf("Failed to leave workload %s: %v", workload, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if empty {
|
||||||
|
err = inject.ModifyServiceTargetPort(ctx, c.clientset, c.Namespace, templateSpec.Labels, map[int32]int32{})
|
||||||
|
}
|
||||||
c.LeavePortMap(workload)
|
c.LeavePortMap(workload)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
@@ -108,6 +108,9 @@ func ModifyServiceTargetPort(ctx context.Context, clientset *kubernetes.Clientse
|
|||||||
|
|
||||||
var svc *v1.Service
|
var svc *v1.Service
|
||||||
for _, item := range list.Items {
|
for _, item := range list.Items {
|
||||||
|
if item.Spec.Selector == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if labels.SelectorFromSet(item.Spec.Selector).Matches(labels.Set(podLabels)) {
|
if labels.SelectorFromSet(item.Spec.Selector).Matches(labels.Set(podLabels)) {
|
||||||
svc = &item
|
svc = &item
|
||||||
break
|
break
|
||||||
@@ -117,7 +120,11 @@ func ModifyServiceTargetPort(ctx context.Context, clientset *kubernetes.Clientse
|
|||||||
return fmt.Errorf("can not found service with selector: %v", podLabels)
|
return fmt.Errorf("can not found service with selector: %v", podLabels)
|
||||||
}
|
}
|
||||||
for i := range len(svc.Spec.Ports) {
|
for i := range len(svc.Spec.Ports) {
|
||||||
svc.Spec.Ports[i].TargetPort = intstr.FromInt32(m[svc.Spec.Ports[i].Port])
|
if p, found := m[svc.Spec.Ports[i].Port]; found {
|
||||||
|
svc.Spec.Ports[i].TargetPort = intstr.FromInt32(p)
|
||||||
|
} else {
|
||||||
|
svc.Spec.Ports[i].TargetPort = intstr.FromInt32(svc.Spec.Ports[i].Port)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_, err = clientset.CoreV1().Services(namespace).Update(ctx, svc, metav1.UpdateOptions{})
|
_, err = clientset.CoreV1().Services(namespace).Update(ctx, svc, metav1.UpdateOptions{})
|
||||||
return err
|
return err
|
||||||
|
@@ -114,12 +114,12 @@ func InjectVPNAndEnvoySidecar(ctx context.Context, f cmdutil.Factory, clientset
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterface, object *runtimeresource.Info, isMeFunc func(isFargateMode bool, rule *controlplane.Rule) bool) error {
|
func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterface, object *runtimeresource.Info, isMeFunc func(isFargateMode bool, rule *controlplane.Rule) bool) (bool, error) {
|
||||||
u := object.Object.(*unstructured.Unstructured)
|
u := object.Object.(*unstructured.Unstructured)
|
||||||
templateSpec, depth, err := util.GetPodTemplateSpecPath(u)
|
templateSpec, depth, err := util.GetPodTemplateSpecPath(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Failed to get template spec path: %v", err)
|
log.Errorf("Failed to get template spec path: %v", err)
|
||||||
return err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeID := fmt.Sprintf("%s.%s", object.Mapping.Resource.GroupResource().String(), object.Name)
|
nodeID := fmt.Sprintf("%s.%s", object.Mapping.Resource.GroupResource().String(), object.Name)
|
||||||
@@ -128,11 +128,11 @@ func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterfa
|
|||||||
empty, found, err = removeEnvoyConfig(mapInterface, nodeID, isMeFunc)
|
empty, found, err = removeEnvoyConfig(mapInterface, nodeID, isMeFunc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Failed to remove envoy config: %v", err)
|
log.Errorf("Failed to remove envoy config: %v", err)
|
||||||
return err
|
return false, err
|
||||||
}
|
}
|
||||||
if !found {
|
if !found {
|
||||||
log.Infof("Not found proxy resource %s", workload)
|
log.Infof("Not found proxy resource %s", workload)
|
||||||
return nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("Leaving workload %s", workload)
|
log.Infof("Leaving workload %s", workload)
|
||||||
@@ -147,7 +147,7 @@ func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterfa
|
|||||||
pod := &v1.Pod{ObjectMeta: templateSpec.ObjectMeta, Spec: templateSpec.Spec}
|
pod := &v1.Pod{ObjectMeta: templateSpec.ObjectMeta, Spec: templateSpec.Spec}
|
||||||
CleanupUselessInfo(pod)
|
CleanupUselessInfo(pod)
|
||||||
err = CreateAfterDeletePod(factory, pod, helper)
|
err = CreateAfterDeletePod(factory, pod, helper)
|
||||||
return err
|
return empty, err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("The %s is under controller management", workload)
|
log.Debugf("The %s is under controller management", workload)
|
||||||
@@ -162,15 +162,15 @@ func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterfa
|
|||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Failed to generate json patch: %v", err)
|
log.Errorf("Failed to generate json patch: %v", err)
|
||||||
return err
|
return empty, err
|
||||||
}
|
}
|
||||||
_, err = helper.Patch(object.Namespace, object.Name, types.JSONPatchType, bytes, &metav1.PatchOptions{})
|
_, err = helper.Patch(object.Namespace, object.Name, types.JSONPatchType, bytes, &metav1.PatchOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Failed to patch resource: %s %s: %v", object.Mapping.Resource.Resource, object.Name, err)
|
log.Errorf("Failed to patch resource: %s %s: %v", object.Mapping.Resource.Resource, object.Name, err)
|
||||||
return err
|
return empty, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return empty, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func addEnvoyConfig(mapInterface v12.ConfigMapInterface, nodeID string, tunIP util.PodRouteConfig, headers map[string]string, port []controlplane.ContainerPort, portmap map[int32]string) error {
|
func addEnvoyConfig(mapInterface v12.ConfigMapInterface, nodeID string, tunIP util.PodRouteConfig, headers map[string]string, port []controlplane.ContainerPort, portmap map[int32]string) error {
|
||||||
|
Reference in New Issue
Block a user