mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-10-21 22:39:36 +08:00
feat: disable envoy stream timeout
This commit is contained in:
@@ -55,7 +55,7 @@ var connectCmd = &cobra.Command{
|
|||||||
if err := connect.DoConnect(); err != nil {
|
if err := connect.DoConnect(); err != nil {
|
||||||
log.Errorln(err)
|
log.Errorln(err)
|
||||||
handler.Cleanup(syscall.SIGQUIT)
|
handler.Cleanup(syscall.SIGQUIT)
|
||||||
return
|
select {}
|
||||||
}
|
}
|
||||||
fmt.Println(`---------------------------------------------------------------------------`)
|
fmt.Println(`---------------------------------------------------------------------------`)
|
||||||
fmt.Println(` Now you can access resources in the kubernetes cluster, enjoy it :) `)
|
fmt.Println(` Now you can access resources in the kubernetes cluster, enjoy it :) `)
|
||||||
|
@@ -63,6 +63,7 @@ func (a *Virtual) To() (
|
|||||||
Routes: rr,
|
Routes: rr,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
MaxDirectResponseBodySizeBytes: nil,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -147,6 +148,12 @@ func ToRoute(clusterName string, headers map[string]string) *route.Route {
|
|||||||
ClusterSpecifier: &route.RouteAction_Cluster{
|
ClusterSpecifier: &route.RouteAction_Cluster{
|
||||||
Cluster: clusterName,
|
Cluster: clusterName,
|
||||||
},
|
},
|
||||||
|
Timeout: durationpb.New(0),
|
||||||
|
IdleTimeout: durationpb.New(0),
|
||||||
|
MaxStreamDuration: &route.RouteAction_MaxStreamDuration{
|
||||||
|
MaxStreamDuration: durationpb.New(0),
|
||||||
|
GrpcTimeoutHeaderMax: durationpb.New(0),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -164,6 +171,12 @@ func DefaultRoute() *route.Route {
|
|||||||
ClusterSpecifier: &route.RouteAction_Cluster{
|
ClusterSpecifier: &route.RouteAction_Cluster{
|
||||||
Cluster: "origin_cluster",
|
Cluster: "origin_cluster",
|
||||||
},
|
},
|
||||||
|
Timeout: durationpb.New(0),
|
||||||
|
IdleTimeout: durationpb.New(0),
|
||||||
|
MaxStreamDuration: &route.RouteAction_MaxStreamDuration{
|
||||||
|
MaxStreamDuration: durationpb.New(0),
|
||||||
|
GrpcTimeoutHeaderMax: durationpb.New(0),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -188,9 +201,6 @@ func ToListener(listenerName string, routeName string, port int32, p corev1.Prot
|
|||||||
httpManager := &httpconnectionmanager.HttpConnectionManager{
|
httpManager := &httpconnectionmanager.HttpConnectionManager{
|
||||||
CodecType: httpconnectionmanager.HttpConnectionManager_AUTO,
|
CodecType: httpconnectionmanager.HttpConnectionManager_AUTO,
|
||||||
StatPrefix: "http",
|
StatPrefix: "http",
|
||||||
HttpFilters: []*httpconnectionmanager.HttpFilter{{
|
|
||||||
Name: wellknown.Router,
|
|
||||||
}},
|
|
||||||
RouteSpecifier: &httpconnectionmanager.HttpConnectionManager_Rds{
|
RouteSpecifier: &httpconnectionmanager.HttpConnectionManager_Rds{
|
||||||
Rds: &httpconnectionmanager.Rds{
|
Rds: &httpconnectionmanager.Rds{
|
||||||
ConfigSource: &core.ConfigSource{
|
ConfigSource: &core.ConfigSource{
|
||||||
@@ -211,6 +221,10 @@ func ToListener(listenerName string, routeName string, port int32, p corev1.Prot
|
|||||||
RouteConfigName: routeName,
|
RouteConfigName: routeName,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
HttpFilters: []*httpconnectionmanager.HttpFilter{{
|
||||||
|
Name: wellknown.Router,
|
||||||
|
}},
|
||||||
|
StreamIdleTimeout: durationpb.New(0),
|
||||||
}
|
}
|
||||||
|
|
||||||
tcpConfig := &tcpproxy.TcpProxy{
|
tcpConfig := &tcpproxy.TcpProxy{
|
||||||
|
@@ -68,7 +68,7 @@ func (p *Processor) ProcessFile(file NotifyMessage) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
p.logger.Debugf("will serve snapshot %+v, nodeID: %s", snapshot, config.Uid)
|
p.logger.Debugf("will serve snapshot %+v, nodeID: %s", snapshot, config.Uid)
|
||||||
if err = p.cache.SetSnapshot(context.TODO(), config.Uid, snapshot); err != nil {
|
if err = p.cache.SetSnapshot(context.Background(), config.Uid, snapshot); err != nil {
|
||||||
p.logger.Errorf("snapshot error %q for %v", err, snapshot)
|
p.logger.Errorf("snapshot error %q for %v", err, snapshot)
|
||||||
p.logger.Fatal(err)
|
p.logger.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@@ -86,7 +86,7 @@ func (h *tunHandler) Handle(ctx context.Context, conn net.Conn) {
|
|||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
h.chExit <- struct{}{}
|
h.chExit <- struct{}{}
|
||||||
default:
|
default:
|
||||||
log.Warnf("next loop, err: %v", err)
|
log.Debugf("next loop, err: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -79,7 +79,7 @@ func usingResolver(clientConfig *miekgdns.ClientConfig) {
|
|||||||
func usingNetworkSetup(ip string, namespace string) {
|
func usingNetworkSetup(ip string, namespace string) {
|
||||||
networkSetup(ip, namespace)
|
networkSetup(ip, namespace)
|
||||||
var ctx context.Context
|
var ctx context.Context
|
||||||
ctx, cancel = context.WithCancel(context.TODO())
|
ctx, cancel = context.WithCancel(context.Background())
|
||||||
go func() {
|
go func() {
|
||||||
ticker := time.NewTicker(time.Second * 10)
|
ticker := time.NewTicker(time.Second * 10)
|
||||||
newWatcher, _ := fsnotify.NewWatcher()
|
newWatcher, _ := fsnotify.NewWatcher()
|
||||||
|
@@ -3,6 +3,7 @@ package exchange
|
|||||||
import (
|
import (
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
|
"k8s.io/utils/pointer"
|
||||||
|
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/config"
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/util"
|
"github.com/wencaiwulue/kubevpn/pkg/util"
|
||||||
@@ -20,8 +21,6 @@ func RemoveContainer(spec *corev1.PodSpec) {
|
|||||||
func AddContainer(spec *corev1.PodSpec, c util.PodRouteConfig) {
|
func AddContainer(spec *corev1.PodSpec, c util.PodRouteConfig) {
|
||||||
// remove vpn container if already exist
|
// remove vpn container if already exist
|
||||||
RemoveContainer(spec)
|
RemoveContainer(spec)
|
||||||
t := true
|
|
||||||
zero := int64(0)
|
|
||||||
spec.Containers = append(spec.Containers, corev1.Container{
|
spec.Containers = append(spec.Containers, corev1.Container{
|
||||||
Name: config.ContainerSidecarVPN,
|
Name: config.ContainerSidecarVPN,
|
||||||
Image: config.Image,
|
Image: config.Image,
|
||||||
@@ -63,8 +62,8 @@ kubevpn serve -L "tun://0.0.0.0:8421/${TrafficManagerRealIP}:8422?net=${InboundP
|
|||||||
//"SYS_MODULE",
|
//"SYS_MODULE",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
RunAsUser: &zero,
|
RunAsUser: pointer.Int64(0),
|
||||||
Privileged: &t,
|
Privileged: pointer.Bool(true),
|
||||||
},
|
},
|
||||||
Resources: corev1.ResourceRequirements{
|
Resources: corev1.ResourceRequirements{
|
||||||
Requests: map[corev1.ResourceName]resource.Quantity{
|
Requests: map[corev1.ResourceName]resource.Quantity{
|
||||||
|
@@ -3,6 +3,7 @@ package handler
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -15,6 +16,7 @@ import (
|
|||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
v12 "k8s.io/client-go/kubernetes/typed/core/v1"
|
v12 "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
"k8s.io/client-go/util/retry"
|
"k8s.io/client-go/util/retry"
|
||||||
|
"k8s.io/utils/pointer"
|
||||||
|
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/config"
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/dns"
|
"github.com/wencaiwulue/kubevpn/pkg/dns"
|
||||||
@@ -59,7 +61,7 @@ func updateServiceRefCount(serviceInterface v12.ServiceInterface, name string, i
|
|||||||
retry.DefaultRetry,
|
retry.DefaultRetry,
|
||||||
func(err error) bool { return !k8serrors.IsNotFound(err) },
|
func(err error) bool { return !k8serrors.IsNotFound(err) },
|
||||||
func() error {
|
func() error {
|
||||||
service, err := serviceInterface.Get(context.TODO(), name, v1.GetOptions{})
|
service, err := serviceInterface.Get(context.Background(), name, v1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("update ref-count failed, increment: %d, error: %v", increment, err)
|
log.Errorf("update ref-count failed, increment: %d, error: %v", increment, err)
|
||||||
return err
|
return err
|
||||||
@@ -75,7 +77,7 @@ func updateServiceRefCount(serviceInterface v12.ServiceInterface, name string, i
|
|||||||
"value": strconv.Itoa(curCount + increment),
|
"value": strconv.Itoa(curCount + increment),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
_, err = serviceInterface.Patch(context.TODO(), config.ConfigMapPodTrafficManager, types.JSONPatchType, p, v1.PatchOptions{})
|
_, err = serviceInterface.Patch(context.Background(), config.ConfigMapPodTrafficManager, types.JSONPatchType, p, v1.PatchOptions{})
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -87,7 +89,7 @@ func updateServiceRefCount(serviceInterface v12.ServiceInterface, name string, i
|
|||||||
|
|
||||||
func cleanUpTrafficManagerIfRefCountIsZero(clientset *kubernetes.Clientset, namespace string) {
|
func cleanUpTrafficManagerIfRefCountIsZero(clientset *kubernetes.Clientset, namespace string) {
|
||||||
updateServiceRefCount(clientset.CoreV1().Services(namespace), config.ConfigMapPodTrafficManager, -1)
|
updateServiceRefCount(clientset.CoreV1().Services(namespace), config.ConfigMapPodTrafficManager, -1)
|
||||||
pod, err := clientset.CoreV1().Services(namespace).Get(context.TODO(), config.ConfigMapPodTrafficManager, v1.GetOptions{})
|
pod, err := clientset.CoreV1().Services(namespace).Get(context.Background(), config.ConfigMapPodTrafficManager, v1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
@@ -99,12 +101,12 @@ func cleanUpTrafficManagerIfRefCountIsZero(clientset *kubernetes.Clientset, name
|
|||||||
}
|
}
|
||||||
// if refcount is less than zero or equals to zero, means nobody is using this traffic pod, so clean it
|
// if refcount is less than zero or equals to zero, means nobody is using this traffic pod, so clean it
|
||||||
if refCount <= 0 {
|
if refCount <= 0 {
|
||||||
zero := int64(0)
|
|
||||||
log.Info("refCount is zero, prepare to clean up resource")
|
log.Info("refCount is zero, prepare to clean up resource")
|
||||||
deleteOptions := v1.DeleteOptions{GracePeriodSeconds: &zero}
|
|
||||||
// keep configmap
|
// keep configmap
|
||||||
//_ = clientset.CoreV1().ConfigMaps(namespace).Delete(context.TODO(), config.ConfigMapPodTrafficManager, deleteOptions)
|
p := []byte(fmt.Sprintf(`[{"op": "remove", "path": "/data/%s"}]`, config.KeyDHCP))
|
||||||
_ = clientset.CoreV1().Services(namespace).Delete(context.TODO(), config.ConfigMapPodTrafficManager, deleteOptions)
|
_, err = clientset.CoreV1().ConfigMaps(namespace).Patch(context.Background(), config.ConfigMapPodTrafficManager, types.JSONPatchType, p, v1.PatchOptions{})
|
||||||
_ = clientset.AppsV1().Deployments(namespace).Delete(context.TODO(), config.ConfigMapPodTrafficManager, deleteOptions)
|
deleteOptions := v1.DeleteOptions{GracePeriodSeconds: pointer.Int64(0)}
|
||||||
|
_ = clientset.CoreV1().Services(namespace).Delete(context.Background(), config.ConfigMapPodTrafficManager, deleteOptions)
|
||||||
|
_ = clientset.AppsV1().Deployments(namespace).Delete(context.Background(), config.ConfigMapPodTrafficManager, deleteOptions)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -19,10 +19,12 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/watch"
|
"k8s.io/apimachinery/pkg/watch"
|
||||||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||||
|
"k8s.io/cli-runtime/pkg/resource"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||||
"k8s.io/kubectl/pkg/polymorphichelpers"
|
"k8s.io/kubectl/pkg/polymorphichelpers"
|
||||||
|
"k8s.io/kubectl/pkg/scheme"
|
||||||
|
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/config"
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/core"
|
"github.com/wencaiwulue/kubevpn/pkg/core"
|
||||||
@@ -64,6 +66,29 @@ func (c *ConnectOptions) createRemoteInboundPod() (err error) {
|
|||||||
TrafficManagerRealIP: c.routerIP.String(),
|
TrafficManagerRealIP: c.routerIP.String(),
|
||||||
Route: config.CIDR.String(),
|
Route: config.CIDR.String(),
|
||||||
}
|
}
|
||||||
|
RollbackFuncList = append(RollbackFuncList, func() {
|
||||||
|
r := c.factory.NewBuilder().
|
||||||
|
WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...).
|
||||||
|
NamespaceParam(c.Namespace).DefaultNamespace().
|
||||||
|
ResourceTypeOrNameArgs(true, workload).
|
||||||
|
ContinueOnError().
|
||||||
|
Latest().
|
||||||
|
Flatten().
|
||||||
|
Do()
|
||||||
|
if r.Err() == nil {
|
||||||
|
_ = r.Visit(func(info *resource.Info, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rollbacker, err := polymorphichelpers.RollbackerFn(c.factory, info.ResourceMapping())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = rollbacker.Rollback(info.Object, nil, 0, cmdutil.DryRunNone)
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
// means mesh mode
|
// means mesh mode
|
||||||
if len(c.Headers) != 0 {
|
if len(c.Headers) != 0 {
|
||||||
err = InjectVPNAndEnvoySidecar(c.factory, c.clientset.CoreV1().ConfigMaps(c.Namespace), c.Namespace, workload, configInfo, c.Headers)
|
err = InjectVPNAndEnvoySidecar(c.factory, c.clientset.CoreV1().ConfigMaps(c.Namespace), c.Namespace, workload, configInfo, c.Headers)
|
||||||
@@ -74,6 +99,7 @@ func (c *ConnectOptions) createRemoteInboundPod() (err error) {
|
|||||||
log.Error(err)
|
log.Error(err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
RollbackFuncList = RollbackFuncList[0 : len(RollbackFuncList)-1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -90,7 +116,7 @@ func (c *ConnectOptions) DoConnect() (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.routerIP, err = CreateOutboundPod(c.clientset, c.Namespace, trafficMangerNet.String(), c.cidrs)
|
c.routerIP, err = CreateOutboundPod(c.factory, c.clientset, c.Namespace, trafficMangerNet.String(), c.cidrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -349,12 +375,12 @@ func (c *ConnectOptions) PreCheckResource() {
|
|||||||
if object.Mapping.Resource.Resource != "services" {
|
if object.Mapping.Resource.Resource != "services" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
get, err := c.clientset.CoreV1().Services(c.Namespace).Get(context.TODO(), object.Name, metav1.GetOptions{})
|
get, err := c.clientset.CoreV1().Services(c.Namespace).Get(context.Background(), object.Name, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if ns, selector, err := polymorphichelpers.SelectorsForObject(get); err == nil {
|
if ns, selector, err := polymorphichelpers.SelectorsForObject(get); err == nil {
|
||||||
list, err := c.clientset.CoreV1().Pods(ns).List(context.TODO(), metav1.ListOptions{
|
list, err := c.clientset.CoreV1().Pods(ns).List(context.Background(), metav1.ListOptions{
|
||||||
LabelSelector: selector.String(),
|
LabelSelector: selector.String(),
|
||||||
})
|
})
|
||||||
// if pod is not empty, using pods to find top controller
|
// if pod is not empty, using pods to find top controller
|
||||||
|
@@ -30,8 +30,6 @@ import (
|
|||||||
|
|
||||||
// patch a sidecar, using iptables to do port-forward let this pod decide should go to 233.254.254.100 or request to 127.0.0.1
|
// patch a sidecar, using iptables to do port-forward let this pod decide should go to 233.254.254.100 or request to 127.0.0.1
|
||||||
func InjectVPNAndEnvoySidecar(factory cmdutil.Factory, clientset v12.ConfigMapInterface, namespace, workloads string, c util.PodRouteConfig, headers map[string]string) error {
|
func InjectVPNAndEnvoySidecar(factory cmdutil.Factory, clientset v12.ConfigMapInterface, namespace, workloads string, c util.PodRouteConfig, headers map[string]string) error {
|
||||||
//t := true
|
|
||||||
//zero := int64(0)
|
|
||||||
object, err := util.GetUnstructuredObject(factory, namespace, workloads)
|
object, err := util.GetUnstructuredObject(factory, namespace, workloads)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -109,8 +107,6 @@ func InjectVPNAndEnvoySidecar(factory cmdutil.Factory, clientset v12.ConfigMapIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterface, namespace, workloads string, headers map[string]string) error {
|
func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterface, namespace, workloads string, headers map[string]string) error {
|
||||||
//t := true
|
|
||||||
//zero := int64(0)
|
|
||||||
object, err := util.GetUnstructuredObject(factory, namespace, workloads)
|
object, err := util.GetUnstructuredObject(factory, namespace, workloads)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -156,7 +152,7 @@ func UnPatchContainer(factory cmdutil.Factory, mapInterface v12.ConfigMapInterfa
|
|||||||
}
|
}
|
||||||
|
|
||||||
func addEnvoyConfig(mapInterface v12.ConfigMapInterface, nodeID string, localTUNIP string, headers map[string]string, port []v1.ContainerPort) error {
|
func addEnvoyConfig(mapInterface v12.ConfigMapInterface, nodeID string, localTUNIP string, headers map[string]string, port []v1.ContainerPort) error {
|
||||||
configMap, err := mapInterface.Get(context.TODO(), config.ConfigMapPodTrafficManager, metav1.GetOptions{})
|
configMap, err := mapInterface.Get(context.Background(), config.ConfigMapPodTrafficManager, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -199,7 +195,7 @@ func addEnvoyConfig(mapInterface v12.ConfigMapInterface, nodeID string, localTUN
|
|||||||
}
|
}
|
||||||
|
|
||||||
func removeEnvoyConfig(mapInterface v12.ConfigMapInterface, nodeID string, headers map[string]string) (bool, error) {
|
func removeEnvoyConfig(mapInterface v12.ConfigMapInterface, nodeID string, headers map[string]string) (bool, error) {
|
||||||
configMap, err := mapInterface.Get(context.TODO(), config.ConfigMapPodTrafficManager, metav1.GetOptions{})
|
configMap, err := mapInterface.Get(context.Background(), config.ConfigMapPodTrafficManager, metav1.GetOptions{})
|
||||||
if k8serrors.IsNotFound(err) {
|
if k8serrors.IsNotFound(err) {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"k8s.io/utils/pointer"
|
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -26,22 +25,37 @@ import (
|
|||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/util/retry"
|
"k8s.io/client-go/util/retry"
|
||||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||||
|
"k8s.io/kubectl/pkg/polymorphichelpers"
|
||||||
|
"k8s.io/kubectl/pkg/util/podutils"
|
||||||
|
"k8s.io/utils/pointer"
|
||||||
|
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/config"
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/exchange"
|
"github.com/wencaiwulue/kubevpn/pkg/exchange"
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/util"
|
"github.com/wencaiwulue/kubevpn/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateOutboundPod(clientset *kubernetes.Clientset, namespace string, trafficManagerIP string, nodeCIDR []*net.IPNet) (net.IP, error) {
|
func CreateOutboundPod(factory cmdutil.Factory, clientset *kubernetes.Clientset, namespace string, trafficManagerIP string, nodeCIDR []*net.IPNet) (ip net.IP, err error) {
|
||||||
podInterface := clientset.CoreV1().Pods(namespace)
|
podInterface := clientset.CoreV1().Pods(namespace)
|
||||||
serviceInterface := clientset.CoreV1().Services(namespace)
|
serviceInterface := clientset.CoreV1().Services(namespace)
|
||||||
|
|
||||||
service, err := serviceInterface.Get(context.Background(), config.ConfigMapPodTrafficManager, metav1.GetOptions{})
|
service, err := serviceInterface.Get(context.Background(), config.ConfigMapPodTrafficManager, metav1.GetOptions{})
|
||||||
if err == nil && service != nil {
|
if err == nil {
|
||||||
log.Infoln("traffic manager already exist, reuse it")
|
_, err = polymorphichelpers.AttachablePodForObjectFn(factory, service, 2*time.Second)
|
||||||
updateServiceRefCount(serviceInterface, service.GetName(), 1)
|
if err == nil {
|
||||||
return net.ParseIP(service.Spec.ClusterIP), nil
|
log.Infoln("traffic manager already exist, reuse it")
|
||||||
|
updateServiceRefCount(serviceInterface, service.GetName(), 1)
|
||||||
|
return net.ParseIP(service.Spec.ClusterIP), nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
var f = func() {
|
||||||
|
_ = serviceInterface.Delete(context.Background(), config.ConfigMapPodTrafficManager, metav1.DeleteOptions{})
|
||||||
|
_ = clientset.AppsV1().Deployments(namespace).Delete(context.Background(), config.ConfigMapPodTrafficManager, metav1.DeleteOptions{})
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
f()
|
||||||
log.Infoln("traffic manager not exist, try to create it...")
|
log.Infoln("traffic manager not exist, try to create it...")
|
||||||
udp8422 := "8422-for-udp"
|
udp8422 := "8422-for-udp"
|
||||||
tcp10800 := "10800-for-tcp"
|
tcp10800 := "10800-for-tcp"
|
||||||
@@ -198,29 +212,42 @@ kubevpn serve -L "tcp://:10800" -L "tun://:8422?net=${TrafficManagerIP}" --debug
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
watchStream, err := podInterface.Watch(context.TODO(), metav1.ListOptions{
|
watchStream, err := podInterface.Watch(context.Background(), metav1.ListOptions{
|
||||||
LabelSelector: fields.OneTermEqualSelector("app", config.ConfigMapPodTrafficManager).String(),
|
LabelSelector: fields.OneTermEqualSelector("app", config.ConfigMapPodTrafficManager).String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer watchStream.Stop()
|
defer watchStream.Stop()
|
||||||
if _, err = clientset.AppsV1().Deployments(namespace).Create(context.TODO(), deployment, metav1.CreateOptions{}); err != nil {
|
if _, err = clientset.AppsV1().Deployments(namespace).Create(context.Background(), deployment, metav1.CreateOptions{}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var phase v1.PodPhase
|
var last string
|
||||||
out:
|
out:
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case e := <-watchStream.ResultChan():
|
case e := <-watchStream.ResultChan():
|
||||||
if podT, ok := e.Object.(*v1.Pod); ok {
|
if podT, ok := e.Object.(*v1.Pod); ok {
|
||||||
if phase != podT.Status.Phase {
|
var sb = strings.Builder{}
|
||||||
log.Infof("pod %s status is %s", config.ConfigMapPodTrafficManager, podT.Status.Phase)
|
sb.WriteString(fmt.Sprintf("pod %s status is %s", config.ConfigMapPodTrafficManager, podT.Status.Phase))
|
||||||
|
for _, status := range podT.Status.ContainerStatuses {
|
||||||
|
if status.State.Waiting != nil {
|
||||||
|
if len(status.State.Waiting.Reason) != 0 {
|
||||||
|
sb.WriteString(fmt.Sprintf(" reason: %s", status.State.Waiting.Reason))
|
||||||
|
}
|
||||||
|
if len(status.State.Waiting.Message) != 0 {
|
||||||
|
sb.WriteString(fmt.Sprintf(" message: %s", status.State.Waiting.Message))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if podT.Status.Phase == v1.PodRunning {
|
|
||||||
|
if last != sb.String() {
|
||||||
|
log.Infof(sb.String())
|
||||||
|
}
|
||||||
|
if podutils.IsPodReady(podT) {
|
||||||
break out
|
break out
|
||||||
}
|
}
|
||||||
phase = podT.Status.Phase
|
last = sb.String()
|
||||||
}
|
}
|
||||||
case <-time.Tick(time.Minute * 60):
|
case <-time.Tick(time.Minute * 60):
|
||||||
return nil, errors.New(fmt.Sprintf("wait pod %s to be ready timeout", config.ConfigMapPodTrafficManager))
|
return nil, errors.New(fmt.Sprintf("wait pod %s to be ready timeout", config.ConfigMapPodTrafficManager))
|
||||||
@@ -302,9 +329,8 @@ func InjectVPNSidecar(factory cmdutil.Factory, namespace, workloads string, conf
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createAfterDeletePod(factory cmdutil.Factory, p *v1.Pod, helper *pkgresource.Helper) error {
|
func createAfterDeletePod(factory cmdutil.Factory, p *v1.Pod, helper *pkgresource.Helper) error {
|
||||||
zero := int64(0)
|
|
||||||
if _, err := helper.DeleteWithOptions(p.Namespace, p.Name, &metav1.DeleteOptions{
|
if _, err := helper.DeleteWithOptions(p.Namespace, p.Name, &metav1.DeleteOptions{
|
||||||
GracePeriodSeconds: &zero,
|
GracePeriodSeconds: pointer.Int64(0),
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
@@ -318,7 +344,7 @@ func createAfterDeletePod(factory cmdutil.Factory, p *v1.Pod, helper *pkgresourc
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
clientset, err := factory.KubernetesClientSet()
|
clientset, err := factory.KubernetesClientSet()
|
||||||
get, err := clientset.CoreV1().Pods(p.Namespace).Get(context.TODO(), p.Name, metav1.GetOptions{})
|
get, err := clientset.CoreV1().Pods(p.Namespace).Get(context.Background(), p.Name, metav1.GetOptions{})
|
||||||
if err != nil || get.Status.Phase != v1.PodRunning {
|
if err != nil || get.Status.Phase != v1.PodRunning {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -353,10 +379,9 @@ func removeInboundContainer(factory cmdutil.Factory, namespace, workloads string
|
|||||||
helper := pkgresource.NewHelper(object.Client, object.Mapping)
|
helper := pkgresource.NewHelper(object.Client, object.Mapping)
|
||||||
|
|
||||||
// pods
|
// pods
|
||||||
zero := int64(0)
|
|
||||||
if len(path) == 0 {
|
if len(path) == 0 {
|
||||||
_, err = helper.DeleteWithOptions(object.Namespace, object.Name, &metav1.DeleteOptions{
|
_, err = helper.DeleteWithOptions(object.Namespace, object.Name, &metav1.DeleteOptions{
|
||||||
GracePeriodSeconds: &zero,
|
GracePeriodSeconds: pointer.Int64(0),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -377,7 +402,6 @@ func removeInboundContainer(factory cmdutil.Factory, namespace, workloads string
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
//t := true
|
|
||||||
_, err = helper.Patch(object.Namespace, object.Name, types.JSONPatchType, bytes, &metav1.PatchOptions{
|
_, err = helper.Patch(object.Namespace, object.Name, types.JSONPatchType, bytes, &metav1.PatchOptions{
|
||||||
//Force: &t,
|
//Force: &t,
|
||||||
})
|
})
|
||||||
|
@@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"k8s.io/utils/pointer"
|
||||||
"net"
|
"net"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -180,9 +181,8 @@ func TestDeleteAndCreate(t *testing.T) {
|
|||||||
err = json.Unmarshal(marshal, &pp)
|
err = json.Unmarshal(marshal, &pp)
|
||||||
|
|
||||||
helper := pkgresource.NewHelper(object.Client, object.Mapping)
|
helper := pkgresource.NewHelper(object.Client, object.Mapping)
|
||||||
zero := int64(0)
|
|
||||||
if _, err = helper.DeleteWithOptions(object.Namespace, object.Name, &metav1.DeleteOptions{
|
if _, err = helper.DeleteWithOptions(object.Namespace, object.Name, &metav1.DeleteOptions{
|
||||||
GracePeriodSeconds: &zero,
|
GracePeriodSeconds: pointer.Int64(0),
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -200,7 +200,7 @@ func TestDeleteAndCreate(t *testing.T) {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
clientset, err := factory.KubernetesClientSet()
|
clientset, err := factory.KubernetesClientSet()
|
||||||
get, err := clientset.CoreV1().Pods(p.Namespace).Get(context.TODO(), p.Name, metav1.GetOptions{})
|
get, err := clientset.CoreV1().Pods(p.Namespace).Get(context.Background(), p.Name, metav1.GetOptions{})
|
||||||
if err != nil || get.Status.Phase != corev1.PodRunning {
|
if err != nil || get.Status.Phase != corev1.PodRunning {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -230,11 +230,13 @@ func TestReadiness(t *testing.T) {
|
|||||||
}
|
}
|
||||||
helper := pkgresource.NewHelper(object.Client, object.Mapping)
|
helper := pkgresource.NewHelper(object.Client, object.Mapping)
|
||||||
removePatch, restorePatch := patch(*podTemplateSpec, path)
|
removePatch, restorePatch := patch(*podTemplateSpec, path)
|
||||||
_, err = patchs(helper, object.Namespace, object.Name, removePatch)
|
marshal, _ := json.Marshal(removePatch)
|
||||||
|
bytes, _ := json.Marshal(restorePatch)
|
||||||
|
_, err = patchs(helper, object.Namespace, object.Name, marshal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
_, err = patchs(helper, object.Namespace, object.Name, restorePatch)
|
_, err = patchs(helper, object.Namespace, object.Name, bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ import (
|
|||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
"k8s.io/utils/pointer"
|
||||||
|
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/config"
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/util"
|
"github.com/wencaiwulue/kubevpn/pkg/util"
|
||||||
@@ -23,8 +24,6 @@ func RemoveContainers(spec *v1.PodTemplateSpec) {
|
|||||||
func AddMeshContainer(spec *v1.PodTemplateSpec, nodeId string, c util.PodRouteConfig) {
|
func AddMeshContainer(spec *v1.PodTemplateSpec, nodeId string, c util.PodRouteConfig) {
|
||||||
// remove envoy proxy containers if already exist
|
// remove envoy proxy containers if already exist
|
||||||
RemoveContainers(spec)
|
RemoveContainers(spec)
|
||||||
zero := int64(0)
|
|
||||||
t := true
|
|
||||||
spec.Spec.Containers = append(spec.Spec.Containers, v1.Container{
|
spec.Spec.Containers = append(spec.Spec.Containers, v1.Container{
|
||||||
Name: config.ContainerSidecarVPN,
|
Name: config.ContainerSidecarVPN,
|
||||||
Image: config.Image,
|
Image: config.Image,
|
||||||
@@ -62,8 +61,8 @@ kubevpn serve -L "tun:/${TrafficManagerRealIP}:8422?net=${InboundPodTunIP}&route
|
|||||||
//"SYS_MODULE",
|
//"SYS_MODULE",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
RunAsUser: &zero,
|
RunAsUser: pointer.Int64(0),
|
||||||
Privileged: &t,
|
Privileged: pointer.Bool(true),
|
||||||
},
|
},
|
||||||
Resources: v1.ResourceRequirements{
|
Resources: v1.ResourceRequirements{
|
||||||
Requests: map[v1.ResourceName]resource.Quantity{
|
Requests: map[v1.ResourceName]resource.Quantity{
|
||||||
|
@@ -49,7 +49,7 @@ func TestFunctions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func pingPodIP(t *testing.T) {
|
func pingPodIP(t *testing.T) {
|
||||||
ctx, f := context.WithTimeout(context.TODO(), time.Second*60)
|
ctx, f := context.WithTimeout(context.Background(), time.Second*60)
|
||||||
defer f()
|
defer f()
|
||||||
list, err := clientset.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{})
|
list, err := clientset.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -74,7 +74,7 @@ func pingPodIP(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func healthCheckPod(t *testing.T) {
|
func healthCheckPod(t *testing.T) {
|
||||||
podList, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{
|
podList, err := clientset.CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{
|
||||||
LabelSelector: fields.OneTermEqualSelector("app", "productpage").String(),
|
LabelSelector: fields.OneTermEqualSelector("app", "productpage").String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -97,7 +97,7 @@ func healthCheckPod(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func healthCheckService(t *testing.T) {
|
func healthCheckService(t *testing.T) {
|
||||||
serviceList, err := clientset.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{
|
serviceList, err := clientset.CoreV1().Services(namespace).List(context.Background(), metav1.ListOptions{
|
||||||
LabelSelector: fields.OneTermEqualSelector("app", "productpage").String(),
|
LabelSelector: fields.OneTermEqualSelector("app", "productpage").String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -121,7 +121,7 @@ func healthCheckService(t *testing.T) {
|
|||||||
|
|
||||||
func shortDomain(t *testing.T) {
|
func shortDomain(t *testing.T) {
|
||||||
var app = "productpage"
|
var app = "productpage"
|
||||||
serviceList, err := clientset.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{
|
serviceList, err := clientset.CoreV1().Services(namespace).List(context.Background(), metav1.ListOptions{
|
||||||
LabelSelector: fields.OneTermEqualSelector("app", app).String(),
|
LabelSelector: fields.OneTermEqualSelector("app", app).String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -145,7 +145,7 @@ func shortDomain(t *testing.T) {
|
|||||||
|
|
||||||
func fullDomain(t *testing.T) {
|
func fullDomain(t *testing.T) {
|
||||||
var app = "productpage"
|
var app = "productpage"
|
||||||
serviceList, err := clientset.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{
|
serviceList, err := clientset.CoreV1().Services(namespace).List(context.Background(), metav1.ListOptions{
|
||||||
LabelSelector: fields.OneTermEqualSelector("app", app).String(),
|
LabelSelector: fields.OneTermEqualSelector("app", app).String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -267,7 +267,7 @@ func server(port int) {
|
|||||||
|
|
||||||
func kubevpnConnect(t *testing.T) {
|
func kubevpnConnect(t *testing.T) {
|
||||||
var ctx context.Context
|
var ctx context.Context
|
||||||
ctx, cancelFunc = context.WithCancel(context.TODO())
|
ctx, cancelFunc = context.WithCancel(context.Background())
|
||||||
ctx, cancel := context.WithTimeout(ctx, 2*time.Hour)
|
ctx, cancel := context.WithTimeout(ctx, 2*time.Hour)
|
||||||
|
|
||||||
cmd := exec.CommandContext(ctx, "kubevpn", "connect", "--debug", "--workloads", "deployments/reviews")
|
cmd := exec.CommandContext(ctx, "kubevpn", "connect", "--debug", "--workloads", "deployments/reviews")
|
||||||
|
@@ -74,7 +74,7 @@ func GetCIDRFromResourceUgly(clientset *kubernetes.Clientset, namespace string)
|
|||||||
//172.17.0.3
|
//172.17.0.3
|
||||||
//172.17.0.7
|
//172.17.0.7
|
||||||
//172.17.0.2
|
//172.17.0.2
|
||||||
podList, _ := clientset.CoreV1().Pods(namespace).List(context.TODO(), v1.ListOptions{})
|
podList, _ := clientset.CoreV1().Pods(namespace).List(context.Background(), v1.ListOptions{})
|
||||||
for _, pod := range podList.Items {
|
for _, pod := range podList.Items {
|
||||||
if pod.Spec.HostNetwork {
|
if pod.Spec.HostNetwork {
|
||||||
continue
|
continue
|
||||||
@@ -87,7 +87,7 @@ func GetCIDRFromResourceUgly(clientset *kubernetes.Clientset, namespace string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// (2) get service CIDR
|
// (2) get service CIDR
|
||||||
serviceList, _ := clientset.CoreV1().Services(namespace).List(context.TODO(), v1.ListOptions{})
|
serviceList, _ := clientset.CoreV1().Services(namespace).List(context.Background(), v1.ListOptions{})
|
||||||
for _, service := range serviceList.Items {
|
for _, service := range serviceList.Items {
|
||||||
if ip := net.ParseIP(service.Spec.ClusterIP); ip != nil {
|
if ip := net.ParseIP(service.Spec.ClusterIP); ip != nil {
|
||||||
mask := net.CIDRMask(16, 32)
|
mask := net.CIDRMask(16, 32)
|
||||||
|
@@ -27,7 +27,7 @@ import (
|
|||||||
|
|
||||||
// get cidr by dump cluster info
|
// get cidr by dump cluster info
|
||||||
func getCIDRByDumpClusterInfo(clientset *kubernetes.Clientset) ([]*net.IPNet, error) {
|
func getCIDRByDumpClusterInfo(clientset *kubernetes.Clientset) ([]*net.IPNet, error) {
|
||||||
p, err := clientset.CoreV1().Pods("kube-system").List(context.TODO(), v1.ListOptions{
|
p, err := clientset.CoreV1().Pods("kube-system").List(context.Background(), v1.ListOptions{
|
||||||
FieldSelector: fields.OneTermEqualSelector("status.phase", string(v12.PodRunning)).String(),
|
FieldSelector: fields.OneTermEqualSelector("status.phase", string(v12.PodRunning)).String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -102,7 +102,7 @@ func getCIDRFromCNI(clientset *kubernetes.Clientset, restclient *rest.RESTClient
|
|||||||
|
|
||||||
func getServiceCIDRByCreateSvc(serviceInterface corev1.ServiceInterface) (*net.IPNet, error) {
|
func getServiceCIDRByCreateSvc(serviceInterface corev1.ServiceInterface) (*net.IPNet, error) {
|
||||||
defaultCIDRIndex := "valid IPs is"
|
defaultCIDRIndex := "valid IPs is"
|
||||||
_, err := serviceInterface.Create(context.TODO(), &v12.Service{
|
_, err := serviceInterface.Create(context.Background(), &v12.Service{
|
||||||
ObjectMeta: v1.ObjectMeta{GenerateName: "foo-svc-"},
|
ObjectMeta: v1.ObjectMeta{GenerateName: "foo-svc-"},
|
||||||
Spec: v12.ServiceSpec{Ports: []v12.ServicePort{{Port: 80}}, ClusterIP: "0.0.0.0"},
|
Spec: v12.ServiceSpec{Ports: []v12.ServicePort{{Port: 80}}, ClusterIP: "0.0.0.0"},
|
||||||
}, v1.CreateOptions{})
|
}, v1.CreateOptions{})
|
||||||
@@ -135,7 +135,7 @@ func getPodCIDRFromCNI(clientset *kubernetes.Clientset, restclient *rest.RESTCli
|
|||||||
|
|
||||||
conf, err := libcni.ConfListFromFile(content)
|
conf, err := libcni.ConfListFromFile(content)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
log.Infoln("get cni %s config", conf.Name)
|
log.Infoln("get cni config", conf.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
result := parseCIDRFromString(content)
|
result := parseCIDRFromString(content)
|
||||||
@@ -270,7 +270,7 @@ func createCIDRPod(clientset *kubernetes.Clientset, namespace string) (*v12.Pod,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getPodCIDRFromPod(clientset *kubernetes.Clientset, namespace string, svc *net.IPNet) ([]*net.IPNet, error) {
|
func getPodCIDRFromPod(clientset *kubernetes.Clientset, namespace string, svc *net.IPNet) ([]*net.IPNet, error) {
|
||||||
get, err := clientset.CoreV1().Pods(namespace).Get(context.TODO(), name, v1.GetOptions{})
|
get, err := clientset.CoreV1().Pods(namespace).Get(context.Background(), name, v1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@@ -62,3 +62,21 @@ func TestElegant(t *testing.T) {
|
|||||||
fmt.Println(net.String())
|
fmt.Println(net.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCal(t *testing.T) {
|
||||||
|
ints := []int{
|
||||||
|
5, 26,
|
||||||
|
8, 22,
|
||||||
|
25, 8,
|
||||||
|
8, 10,
|
||||||
|
25, 23,
|
||||||
|
8, 22,
|
||||||
|
8, 24,
|
||||||
|
8, 23,
|
||||||
|
}
|
||||||
|
sum := 0
|
||||||
|
for _, i := range ints {
|
||||||
|
sum += i
|
||||||
|
}
|
||||||
|
println(sum)
|
||||||
|
}
|
||||||
|
@@ -42,7 +42,6 @@ import (
|
|||||||
"k8s.io/kubectl/pkg/cmd/exec"
|
"k8s.io/kubectl/pkg/cmd/exec"
|
||||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||||
"k8s.io/kubectl/pkg/polymorphichelpers"
|
"k8s.io/kubectl/pkg/polymorphichelpers"
|
||||||
"k8s.io/kubectl/pkg/util/interrupt"
|
|
||||||
|
|
||||||
"github.com/wencaiwulue/kubevpn/pkg/config"
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
||||||
)
|
)
|
||||||
@@ -74,7 +73,7 @@ func GetAvailableTCPPortOrDie() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func WaitPod(podInterface v12.PodInterface, list metav1.ListOptions, checker func(*v1.Pod) bool) error {
|
func WaitPod(podInterface v12.PodInterface, list metav1.ListOptions, checker func(*v1.Pod) bool) error {
|
||||||
ctx, cancelFunc := context.WithTimeout(context.TODO(), time.Minute*60)
|
ctx, cancelFunc := context.WithTimeout(context.Background(), time.Minute*60)
|
||||||
defer cancelFunc()
|
defer cancelFunc()
|
||||||
watch, err := podInterface.Watch(ctx, list)
|
watch, err := podInterface.Watch(ctx, list)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -379,18 +378,18 @@ func RolloutStatus(factory cmdutil.Factory, namespace, workloads string, timeout
|
|||||||
lw := &cache.ListWatch{
|
lw := &cache.ListWatch{
|
||||||
ListFunc: func(options metav1.ListOptions) (k8sruntime.Object, error) {
|
ListFunc: func(options metav1.ListOptions) (k8sruntime.Object, error) {
|
||||||
options.FieldSelector = fieldSelector
|
options.FieldSelector = fieldSelector
|
||||||
return client.Resource(info.Mapping.Resource).Namespace(info.Namespace).List(context.TODO(), options)
|
return client.Resource(info.Mapping.Resource).Namespace(info.Namespace).List(context.Background(), options)
|
||||||
},
|
},
|
||||||
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
|
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
|
||||||
options.FieldSelector = fieldSelector
|
options.FieldSelector = fieldSelector
|
||||||
return client.Resource(info.Mapping.Resource).Namespace(info.Namespace).Watch(context.TODO(), options)
|
return client.Resource(info.Mapping.Resource).Namespace(info.Namespace).Watch(context.Background(), options)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the rollout isn't done yet, keep watching deployment status
|
// if the rollout isn't done yet, keep watching deployment status
|
||||||
ctx, cancel := watchtools.ContextWithOptionalTimeout(context.Background(), timeout)
|
ctx, cancel := watchtools.ContextWithOptionalTimeout(context.Background(), timeout)
|
||||||
intr := interrupt.New(nil, cancel)
|
defer cancel()
|
||||||
return intr.Run(func() error {
|
return func() error {
|
||||||
_, err = watchtools.UntilWithSync(ctx, lw, &unstructured.Unstructured{}, nil, func(e watch.Event) (bool, error) {
|
_, err = watchtools.UntilWithSync(ctx, lw, &unstructured.Unstructured{}, nil, func(e watch.Event) (bool, error) {
|
||||||
switch t := e.Type; t {
|
switch t := e.Type; t {
|
||||||
case watch.Added, watch.Modified:
|
case watch.Added, watch.Modified:
|
||||||
@@ -415,7 +414,7 @@ func RolloutStatus(factory cmdutil.Factory, namespace, workloads string, timeout
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
return err
|
return err
|
||||||
})
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
type proxyWriter struct {
|
type proxyWriter struct {
|
||||||
|
Reference in New Issue
Block a user