diff --git a/README.md b/README.md index 5fe7cdfb..aee2d319 100644 --- a/README.md +++ b/README.md @@ -67,38 +67,44 @@ kubectl apply -f https://raw.githubusercontent.com/KubeNetworks/kubevpn/master/s ### Connect to k8s cluster network ```shell -➜ ~ kubevpn connect +➜ ~ kubevpn connect -n default --kubeconfig ~/.kube/config +Password: +start to connect get cidr from cluster info... get cidr from cluster info ok get cidr from cni... +wait pod cni-net-dir-kubevpn to be running timeout, reason , ignore get cidr from svc... get cidr from svc ok +get cidr successfully traffic manager not exist, try to create it... -pod [kubevpn-traffic-manager] status is Pending -Container Reason Message - -pod [kubevpn-traffic-manager] status is Pending +label namespace default +create serviceAccount kubevpn-traffic-manager +create roles kubevpn-traffic-manager +create roleBinding kubevpn-traffic-manager +create service kubevpn-traffic-manager +create deployment kubevpn-traffic-manager +pod kubevpn-traffic-manager-799b5f5474-d7bp7 is Pending Container Reason Message control-plane ContainerCreating vpn ContainerCreating webhook ContainerCreating -pod [kubevpn-traffic-manager] status is Running +pod kubevpn-traffic-manager-799b5f5474-d7bp7 is Running Container Reason Message control-plane ContainerRunning vpn ContainerRunning webhook ContainerRunning +Creating mutatingWebhook_configuration for kubevpn-traffic-manager update ref count successfully port forward ready -your ip is 223.254.0.101 tunnel connected dns service ok - ---------------------------------------------------------------------------- - Now you can access resources in the kubernetes cluster, enjoy it :) ---------------------------------------------------------------------------- - ++---------------------------------------------------------------------------+ +| Now you can access resources in the kubernetes cluster, enjoy it :) | ++---------------------------------------------------------------------------+ +➜ ~ ``` **after you see this prompt, then leave this terminal alone, open a new terminal, continue operation** diff --git a/cmd/kubevpn/cmds/config.go b/cmd/kubevpn/cmds/config.go index ea76ea37..b212508a 100644 --- a/cmd/kubevpn/cmds/config.go +++ b/cmd/kubevpn/cmds/config.go @@ -16,7 +16,8 @@ import ( func CmdConfig(f cmdutil.Factory) *cobra.Command { cmd := &cobra.Command{ - Use: "config", + Use: "config", + Short: "Proxy kubeconfig which behind of ssh jump server", } cmd.AddCommand(cmdConfigAdd(f)) cmd.AddCommand(cmdConfigRemove(f)) @@ -27,36 +28,17 @@ func cmdConfigAdd(f cmdutil.Factory) *cobra.Command { var sshConf = &util.SshConfig{} cmd := &cobra.Command{ Use: "add", - Short: i18n.T("Clone workloads to target-kubeconfig cluster with same volume、env、and network"), - Long: templates.LongDesc(i18n.T(`Clone workloads to target-kubeconfig cluster with same volume、env、and network`)), + Short: "Proxy kubeconfig", + Long: templates.LongDesc(i18n.T(`proxy kubeconfig which behind of ssh jump server`)), Example: templates.Examples(i18n.T(` - # clone - - clone deployment in current cluster and current namespace - kubevpn clone deployment/productpage - - - clone deployment in current cluster with different namespace - kubevpn clone deployment/productpage -n test - - - clone deployment to another cluster - kubevpn clone deployment/productpage --target-kubeconfig ~/.kube/other-kubeconfig - - - clone multiple workloads - kubevpn clone deployment/authors deployment/productpage - or - kubevpn clone deployment authors productpage - - # clone with mesh, traffic with header a=1, will hit cloned workloads, otherwise hit origin workloads - kubevpn clone deployment/productpage --headers a=1 - - # clone workloads which api-server behind of bastion host or ssh jump host - kubevpn clone deployment/productpage --ssh-addr 192.168.1.100:22 --ssh-username root --ssh-keyfile ~/.ssh/ssh.pem --headers a=1 + # proxy api-server which api-server behind of bastion host or ssh jump host + kubevpn config add --ssh-addr 192.168.1.100:22 --ssh-username root --ssh-keyfile ~/.ssh/ssh.pem # it also support ProxyJump, like ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌────────────┐ │ pc ├────►│ ssh1 ├────►│ ssh2 ├────►│ ssh3 ├─────►... ─────► │ api-server │ └──────┘ └──────┘ └──────┘ └──────┘ └────────────┘ - kubevpn clone service/productpage --ssh-alias --headers a=1 - + kubevpn config add --ssh-alias `)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { // startup daemon process and sudo process @@ -88,36 +70,11 @@ func cmdConfigAdd(f cmdutil.Factory) *cobra.Command { func cmdConfigRemove(f cmdutil.Factory) *cobra.Command { cmd := &cobra.Command{ Use: "remove", - Short: i18n.T("Clone workloads to target-kubeconfig cluster with same volume、env、and network"), - Long: templates.LongDesc(i18n.T(`Clone workloads to target-kubeconfig cluster with same volume、env、and network`)), + Short: "Remove proxy kubeconfig", + Long: templates.LongDesc(i18n.T(`Remove proxy kubeconfig which behind of ssh jump server`)), Example: templates.Examples(i18n.T(` - # clone - - clone deployment in current cluster and current namespace - kubevpn clone deployment/productpage - - - clone deployment in current cluster with different namespace - kubevpn clone deployment/productpage -n test - - - clone deployment to another cluster - kubevpn clone deployment/productpage --target-kubeconfig ~/.kube/other-kubeconfig - - - clone multiple workloads - kubevpn clone deployment/authors deployment/productpage - or - kubevpn clone deployment authors productpage - - # clone with mesh, traffic with header a=1, will hit cloned workloads, otherwise hit origin workloads - kubevpn clone deployment/productpage --headers a=1 - - # clone workloads which api-server behind of bastion host or ssh jump host - kubevpn clone deployment/productpage --ssh-addr 192.168.1.100:22 --ssh-username root --ssh-keyfile ~/.ssh/ssh.pem --headers a=1 - - # it also support ProxyJump, like - ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌────────────┐ - │ pc ├────►│ ssh1 ├────►│ ssh2 ├────►│ ssh3 ├─────►... ─────► │ api-server │ - └──────┘ └──────┘ └──────┘ └──────┘ └────────────┘ - kubevpn clone service/productpage --ssh-alias --headers a=1 - + # remove proxy api-server which api-server behind of bastion host or ssh jump host + kubevpn config remove --kubeconfig /var/folders/30/cmv9c_5j3mq_kthx63sb1t5c0000gn/T/947048961.kubeconfig `)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { // startup daemon process and sudo process diff --git a/cmd/kubevpn/cmds/daemon.go b/cmd/kubevpn/cmds/daemon.go index d1627c6f..6f57e64a 100644 --- a/cmd/kubevpn/cmds/daemon.go +++ b/cmd/kubevpn/cmds/daemon.go @@ -16,8 +16,8 @@ func CmdDaemon(_ cmdutil.Factory) *cobra.Command { var opt = &daemon.SvrOption{} cmd := &cobra.Command{ Use: "daemon", - Short: i18n.T("Startup GRPC server"), - Long: i18n.T(`Startup GRPC server`), + Short: i18n.T("Startup kubevpn daemon server"), + Long: i18n.T(`Startup kubevpn daemon server`), PreRunE: func(cmd *cobra.Command, args []string) error { sockPath := daemon.GetSockPath(opt.IsSudo) err := os.Remove(sockPath) diff --git a/cmd/kubevpn/cmds/disconnect.go b/cmd/kubevpn/cmds/disconnect.go index ae4961e7..9e82c919 100644 --- a/cmd/kubevpn/cmds/disconnect.go +++ b/cmd/kubevpn/cmds/disconnect.go @@ -18,10 +18,13 @@ import ( func CmdDisconnect(f cmdutil.Factory) *cobra.Command { cmd := &cobra.Command{ - Use: "disconnect", - Short: i18n.T("Disconnect from kubernetes cluster network"), - Long: templates.LongDesc(i18n.T(`Disconnect from kubernetes cluster network`)), - Example: templates.Examples(i18n.T(``)), + Use: "disconnect", + Short: i18n.T("Disconnect from kubernetes cluster network"), + Long: templates.LongDesc(i18n.T(`Disconnect from kubernetes cluster network`)), + Example: templates.Examples(i18n.T(` + # disconnect from cluster network and restore proxy resource + kubevpn disconnect +`)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { err = daemon.StartupDaemon(cmd.Context()) return err diff --git a/cmd/kubevpn/cmds/get.go b/cmd/kubevpn/cmds/get.go index 189a1741..d7b56f2c 100644 --- a/cmd/kubevpn/cmds/get.go +++ b/cmd/kubevpn/cmds/get.go @@ -16,9 +16,10 @@ import ( func CmdGet(f cmdutil.Factory) *cobra.Command { cmd := &cobra.Command{ - Use: "get", - Short: i18n.T("Get resource to kubernetes cluster network"), - Long: templates.LongDesc(i18n.T(`Connect to kubernetes cluster network`)), + Use: "get", + Hidden: true, + Short: i18n.T("Get cluster resources which connected"), + Long: templates.LongDesc(i18n.T(`Get cluster resources which connected`)), Example: templates.Examples(i18n.T(` # Get resource to k8s cluster network kubevpn get pods @@ -31,7 +32,6 @@ func CmdGet(f cmdutil.Factory) *cobra.Command { │ pc ├────►│ ssh1 ├────►│ ssh2 ├────►│ ssh3 ├─────►... ─────► │ api-server │ └──────┘ └──────┘ └──────┘ └──────┘ └────────────┘ kubevpn get service --ssh-alias - `)), PreRunE: func(cmd *cobra.Command, args []string) error { // startup daemon process and sudo process diff --git a/cmd/kubevpn/cmds/leave.go b/cmd/kubevpn/cmds/leave.go index 4e8e4b9d..e5905726 100644 --- a/cmd/kubevpn/cmds/leave.go +++ b/cmd/kubevpn/cmds/leave.go @@ -9,6 +9,8 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" cmdutil "k8s.io/kubectl/pkg/cmd/util" + "k8s.io/kubectl/pkg/util/i18n" + "k8s.io/kubectl/pkg/util/templates" "github.com/wencaiwulue/kubevpn/pkg/daemon" "github.com/wencaiwulue/kubevpn/pkg/daemon/rpc" @@ -17,8 +19,12 @@ import ( func CmdLeave(f cmdutil.Factory) *cobra.Command { var leaveCmd = &cobra.Command{ Use: "leave", - Short: "leave reverse remote resource traffic to local machine", - Long: `leave remote traffic to local machine`, + Short: "Leave proxy resource", + Long: `leave proxy resource and restore it to origin`, + Example: templates.Examples(i18n.T(` + # leave proxy resource and restore it to origin + kubevpn leave deployment/authors +`)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { return daemon.StartupDaemon(cmd.Context()) }, diff --git a/cmd/kubevpn/cmds/list.go b/cmd/kubevpn/cmds/list.go index 4b6e46ec..4962b970 100644 --- a/cmd/kubevpn/cmds/list.go +++ b/cmd/kubevpn/cmds/list.go @@ -14,10 +14,13 @@ import ( func CmdList(f cmdutil.Factory) *cobra.Command { cmd := &cobra.Command{ - Use: "list", - Short: i18n.T("Disconnect from kubernetes cluster network"), - Long: templates.LongDesc(i18n.T(`Disconnect from kubernetes cluster network`)), - Example: templates.Examples(i18n.T(``)), + Use: "list", + Short: i18n.T("List proxy resources"), + Long: templates.LongDesc(i18n.T(`List proxy resources`)), + Example: templates.Examples(i18n.T(` + # list proxy resources + kubevpn list +`)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { return daemon.StartupDaemon(cmd.Context()) }, diff --git a/cmd/kubevpn/cmds/logs.go b/cmd/kubevpn/cmds/logs.go index 26a4acfd..575cb914 100644 --- a/cmd/kubevpn/cmds/logs.go +++ b/cmd/kubevpn/cmds/logs.go @@ -19,10 +19,15 @@ import ( func CmdLogs(f cmdutil.Factory) *cobra.Command { req := &rpc.LogRequest{} cmd := &cobra.Command{ - Use: "logs", - Short: i18n.T("Logs to kubernetes cluster network"), - Long: templates.LongDesc(i18n.T(`Logs to kubernetes cluster network`)), - Example: templates.Examples(i18n.T(``)), + Use: "logs", + Short: i18n.T("Log kubevpn daemon server"), + Long: templates.LongDesc(i18n.T(`Log kubevpn daemon server`)), + Example: templates.Examples(i18n.T(` + # show log for kubevpn daemon server + kubevpn logs + # follow more log + kubevpn logs -f +`)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { // startup daemon process and sudo process return daemon.StartupDaemon(cmd.Context()) diff --git a/cmd/kubevpn/cmds/quit.go b/cmd/kubevpn/cmds/quit.go index 42009d5c..a5920b9a 100644 --- a/cmd/kubevpn/cmds/quit.go +++ b/cmd/kubevpn/cmds/quit.go @@ -19,10 +19,13 @@ import ( func CmdQuit(f cmdutil.Factory) *cobra.Command { cmd := &cobra.Command{ - Use: "quit", - Short: i18n.T("Quit daemon"), - Long: templates.LongDesc(i18n.T(`Disconnect from cluster, leave proxy resources, and quit daemon`)), - Example: templates.Examples(i18n.T(``)), + Use: "quit", + Short: i18n.T("Quit kubevpn daemon server"), + Long: templates.LongDesc(i18n.T(`Disconnect from cluster, leave proxy resources, and quit daemon`)), + Example: templates.Examples(i18n.T(` + # before quit kubevpn, it will leave proxy resources to origin and disconnect from cluster + kubevpn quit +`)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { return daemon.StartupDaemon(cmd.Context()) }, diff --git a/cmd/kubevpn/cmds/remove.go b/cmd/kubevpn/cmds/remove.go index 4ee88e6a..70c14cb5 100644 --- a/cmd/kubevpn/cmds/remove.go +++ b/cmd/kubevpn/cmds/remove.go @@ -9,6 +9,8 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" cmdutil "k8s.io/kubectl/pkg/cmd/util" + "k8s.io/kubectl/pkg/util/i18n" + "k8s.io/kubectl/pkg/util/templates" "github.com/wencaiwulue/kubevpn/pkg/daemon" "github.com/wencaiwulue/kubevpn/pkg/daemon/rpc" @@ -17,8 +19,12 @@ import ( func CmdRemove(f cmdutil.Factory) *cobra.Command { var cmd = &cobra.Command{ Use: "remove", - Short: "Remove reverse remote resource traffic to local machine", - Long: `Remove remote traffic to local machine`, + Short: "Remove cloned resource", + Long: `Remove cloned resource`, + Example: templates.Examples(i18n.T(` + # leave proxy resources to origin + kubevpn remove deployment/authors +`)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { return daemon.StartupDaemon(cmd.Context()) }, diff --git a/cmd/kubevpn/cmds/root.go b/cmd/kubevpn/cmds/root.go index 5315c4ac..71c4a56d 100644 --- a/cmd/kubevpn/cmds/root.go +++ b/cmd/kubevpn/cmds/root.go @@ -47,25 +47,15 @@ func NewKubeVPNCommand() *cobra.Command { groups := templates.CommandGroups{ { - Message: "Client Commands:", + Message: "Develop commands:", Commands: []*cobra.Command{ CmdConnect(factory), CmdDisconnect(factory), - CmdQuit(factory), - CmdLogs(factory), CmdProxy(factory), - CmdList(factory), - CmdGet(factory), CmdLeave(factory), - CmdDev(factory), CmdClone(factory), - CmdConfig(factory), CmdRemove(factory), - CmdCp(factory), - CmdUpgrade(factory), - CmdReset(factory), - CmdVersion(factory), - CmdStatus(factory), + CmdDev(factory), // Hidden, Server Commands (DO NOT USE IT !!!) CmdControlPlane(factory), CmdServe(factory), @@ -73,6 +63,27 @@ func NewKubeVPNCommand() *cobra.Command { CmdWebhook(factory), }, }, + { + Message: "Management commands", + Commands: []*cobra.Command{ + CmdList(factory), + CmdGet(factory), + CmdConfig(factory), + CmdCp(factory), + CmdSSH(factory), + CmdReset(factory), + CmdQuit(factory), + }, + }, + { + Message: "Other commands", + Commands: []*cobra.Command{ + CmdLogs(factory), + CmdStatus(factory), + CmdVersion(factory), + CmdUpgrade(factory), + }, + }, } groups.Add(cmd) templates.ActsAsRootCommand(cmd, []string{"options"}, groups...) diff --git a/cmd/kubevpn/cmds/serve.go b/cmd/kubevpn/cmds/serve.go index 9616f6f1..3a56430c 100644 --- a/cmd/kubevpn/cmds/serve.go +++ b/cmd/kubevpn/cmds/serve.go @@ -9,6 +9,8 @@ import ( "github.com/spf13/cobra" "go.uber.org/automaxprocs/maxprocs" cmdutil "k8s.io/kubectl/pkg/cmd/util" + "k8s.io/kubectl/pkg/util/i18n" + "k8s.io/kubectl/pkg/util/templates" "github.com/wencaiwulue/kubevpn/pkg/config" "github.com/wencaiwulue/kubevpn/pkg/core" @@ -22,7 +24,11 @@ func CmdServe(_ cmdutil.Factory) *cobra.Command { Use: "serve", Hidden: true, Short: "Server side, startup traffic manager, forward inbound and outbound traffic", - Long: `Server side, startup traffic manager, forward inbound and outbound traffic.`, + Long: templates.LongDesc(`Server side, startup traffic manager, forward inbound and outbound traffic.`), + Example: templates.Examples(i18n.T(` + # serve node + kubevpn serve -L "tcp://:10800" -L "tun://127.0.0.1:8422?net=223.254.0.123/32" +`)), PreRun: func(*cobra.Command, []string) { util.InitLogger(config.Debug) runtime.GOMAXPROCS(0) diff --git a/cmd/kubevpn/cmds/status.go b/cmd/kubevpn/cmds/status.go index 504c3a8b..0c4d3a66 100644 --- a/cmd/kubevpn/cmds/status.go +++ b/cmd/kubevpn/cmds/status.go @@ -15,10 +15,13 @@ import ( func CmdStatus(f cmdutil.Factory) *cobra.Command { cmd := &cobra.Command{ - Use: "status", - Short: i18n.T("KubeVPN status"), - Long: templates.LongDesc(i18n.T(`KubeVPN status`)), - Example: templates.Examples(i18n.T(``)), + Use: "status", + Short: i18n.T("KubeVPN status"), + Long: templates.LongDesc(i18n.T(`KubeVPN status`)), + Example: templates.Examples(i18n.T(` + # show status for kubevpn status + kubevpn status +`)), PreRunE: func(cmd *cobra.Command, args []string) (err error) { return daemon.StartupDaemon(cmd.Context()) }, diff --git a/pkg/handler/connect.go b/pkg/handler/connect.go index fd705dac..00e8bbb5 100644 --- a/pkg/handler/connect.go +++ b/pkg/handler/connect.go @@ -892,6 +892,9 @@ func SshJump(ctx context.Context, conf *util.SshConfig, flags *pflag.FlagSet, pr } func SshJumpAndSetEnv(ctx context.Context, conf *util.SshConfig, flags *pflag.FlagSet, print bool) error { + if conf.Addr == "" && conf.ConfigAlias == "" { + return nil + } path, err := SshJump(ctx, conf, flags, print) if err != nil { return err