{"id":13735419,"url":"https://github.com/kubenetworks/kubevpn","last_synced_at":"2025-05-14T20:02:26.424Z","repository":{"id":43192231,"uuid":"389076818","full_name":"kubenetworks/kubevpn","owner":"kubenetworks","description":"KubeVPN offers a Cloud Native Dev Environment that connects to kubernetes cluster network. ","archived":false,"fork":false,"pushed_at":"2025-04-09T14:24:13.000Z","size":66116,"stargazers_count":1116,"open_issues_count":5,"forks_count":60,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-09T14:31:33.697Z","etag":null,"topics":["cloud-native","control-plane","developer-tools","devops","docker","envoy","k8s","kt-connect","kubernetes","kubevpn","local-development","mesh","minikube","network","nocalhost","proxy","service-mesh","telepresence","tools","tunnel"],"latest_commit_sha":null,"homepage":"https://kubevpn.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kubenetworks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-24T11:08:44.000Z","updated_at":"2025-04-09T14:19:42.000Z","dependencies_parsed_at":"2023-09-24T07:17:29.112Z","dependency_job_id":"f2c325fa-47af-46ae-bd6c-46d24937d863","html_url":"https://github.com/kubenetworks/kubevpn","commit_stats":{"total_commits":932,"total_committers":15,"mean_commits":62.13333333333333,"dds":0.5869098712446352,"last_synced_commit":"9d704dd4cf87166d80df31d1574d82d928ca093b"},"previous_names":["kubenetworks/kubevpn","wencaiwulue/kubevpn"],"tags_count":68,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubenetworks%2Fkubevpn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubenetworks%2Fkubevpn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubenetworks%2Fkubevpn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubenetworks%2Fkubevpn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kubenetworks","download_url":"https://codeload.github.com/kubenetworks/kubevpn/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248961186,"owners_count":21189991,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloud-native","control-plane","developer-tools","devops","docker","envoy","k8s","kt-connect","kubernetes","kubevpn","local-development","mesh","minikube","network","nocalhost","proxy","service-mesh","telepresence","tools","tunnel"],"created_at":"2024-08-03T03:01:06.673Z","updated_at":"2025-04-14T20:56:42.046Z","avatar_url":"https://github.com/kubenetworks.png","language":"Go","funding_links":[],"categories":["Software Packages","Go","软件包","Go Tools"],"sub_categories":["DevOps Tools","DevOps 工具"],"readme":"![kubevpn](https://raw.githubusercontent.com/wencaiwulue/kubevpn/master/samples/flat_log.png)\n\n[![GitHub Workflow][1]](https://github.com/kubenetworks/kubevpn/actions)\n[![Go Version][2]](https://github.com/kubenetworks/kubevpn/blob/master/go.mod)\n[![Go Report][3]](https://goreportcard.com/report/github.com/wencaiwulue/kubevpn)\n[![Maintainability][4]](https://codeclimate.com/github/kubenetworks/kubevpn/maintainability)\n[![GitHub License][5]](https://github.com/kubenetworks/kubevpn/blob/main/LICENSE)\n[![Docker Pulls][6]](https://hub.docker.com/r/naison/kubevpn)\n[![Releases][7]](https://github.com/kubenetworks/kubevpn/releases)\n[![GoDoc](https://godoc.org/github.com/kubenetworks/kubevpn?status.png)](https://pkg.go.dev/github.com/wencaiwulue/kubevpn/v2)\n[![codecov](https://codecov.io/gh/wencaiwulue/kubevpn/graph/badge.svg?token=KMDSINSDEP)](https://codecov.io/gh/wencaiwulue/kubevpn)\n[![Snapcraft](https://snapcraft.io/kubevpn/badge.svg)](https://snapcraft.io/kubevpn)\n\n[1]: https://img.shields.io/github/actions/workflow/status/kubenetworks/kubevpn/release.yml?logo=github\n\n[2]: https://img.shields.io/github/go-mod/go-version/kubenetworks/kubevpn?logo=go\n\n[3]: https://goreportcard.com/badge/github.com/wencaiwulue/kubevpn?style=flat\n\n[4]: https://api.codeclimate.com/v1/badges/b5b30239174fc6603aca/maintainability\n\n[5]: https://img.shields.io/github/license/kubenetworks/kubevpn\n\n[6]: https://img.shields.io/docker/pulls/naison/kubevpn?logo=docker\n\n[7]: https://img.shields.io/github/v/release/kubenetworks/kubevpn?logo=smartthings\n\n# KubeVPN\n\n[中文](README_ZH.md) | [English](README.md) | [Wiki](https://github.com/kubenetworks/kubevpn/wiki/Architecture)\n\nKubeVPN offers a Cloud-Native Dev Environment that seamlessly connects to your Kubernetes cluster network.\n\nGain access to the Kubernetes cluster network effortlessly using service names or Pod IP/Service IP. Facilitate the\ninterception of inbound traffic from remote Kubernetes cluster services to your local PC through a service mesh and\nmore.\n\nFor instance, you have the flexibility to run your Kubernetes pod within a local Docker container, ensuring an identical\nenvironment, volume, and network setup.\nWith KubeVPN, empower yourself to develop applications entirely on your local PC!\n\n![arch](docs/en/images/kubevpn-proxy-tun-arch.svg)\n\n## Content\n\n1. [QuickStart](./README.md#quickstart)\n2. [Functions](./README.md#functions)\n3. [Architecture](./README.md#architecture)\n4. [Contributions](./README.md#Contributions)\n\n## QuickStart\n\n### Install from script ( macOS / Linux)\n\n```shell\ncurl -fsSL https://kubevpn.dev/install.sh | sh\n```\n\n\n### Install from [brew](https://brew.sh/) (macOS / Linux)\n\n```shell\nbrew install kubevpn\n```\n\n### Install from [snap](https://snapcraft.io/kubevpn) (Linux)\n\n```shell\nsudo snap install kubevpn\n```\n\n### Install from [scoop](https://scoop.sh/) (Windows)\n\n```shell\nscoop bucket add extras\nscoop install kubevpn\n```\n\n### Install from [krew](https://krew.sigs.k8s.io/) (Windows / macOS / Linux)\n\n```shell\nkubectl krew index add kubevpn https://github.com/kubenetworks/kubevpn.git\nkubectl krew install kubevpn/kubevpn \nkubectl kubevpn \n```\n\n### Install from GitHub release (Windows / macOS / Linux)\n\n[https://github.com/kubenetworks/kubevpn/releases/latest](https://github.com/kubenetworks/kubevpn/releases/latest)\n\n### Install bookinfo as demo application\n\n```shell\nkubectl apply -f https://raw.githubusercontent.com/kubenetworks/kubevpn/master/samples/bookinfo.yaml\n```\n\nFor clean up after test\n\n```shell\nkubectl delete -f https://raw.githubusercontent.com/kubenetworks/kubevpn/master/samples/bookinfo.yaml\n```\n\n## Functions\n\n### Connect to k8s cluster network\n\nuse command `kubevpn connect` connect to k8s cluster network, prompt `Password:` need to input computer\npassword. to enable root operation (create a tun device).\n\n```shell\n➜  ~ kubevpn connect\nPassword:\nStarting connect\nGetting network CIDR from cluster info...\nGetting network CIDR from CNI...\nGetting network CIDR from services...\nLabeling Namespace default\nCreating ServiceAccount kubevpn-traffic-manager\nCreating Roles kubevpn-traffic-manager\nCreating RoleBinding kubevpn-traffic-manager\nCreating Service kubevpn-traffic-manager\nCreating MutatingWebhookConfiguration kubevpn-traffic-manager\nCreating Deployment kubevpn-traffic-manager\n\nPod kubevpn-traffic-manager-66d969fd45-9zlbp is Pending\nContainer     Reason            Message\ncontrol-plane ContainerCreating\nvpn           ContainerCreating\nwebhook       ContainerCreating\n\nPod kubevpn-traffic-manager-66d969fd45-9zlbp is Running\nContainer     Reason           Message\ncontrol-plane ContainerRunning\nvpn           ContainerRunning\nwebhook       ContainerRunning\n\nForwarding port...\nConnected tunnel\nAdding route...\nConfigured DNS service\n+----------------------------------------------------------+\n| Now you can access resources in the kubernetes cluster ! |\n+----------------------------------------------------------+\n➜  ~\n```\n\nalready connected to cluster network, use command `kubevpn status` to check status\n\n```shell\n➜  ~ kubevpn status\nID Mode Cluster               Kubeconfig                 Namespace Status\n0  full ccijorbccotmqodvr189g /Users/naison/.kube/config default   Connected\n➜  ~\n```\n\nuse pod `productpage-788df7ff7f-jpkcs` IP `172.29.2.134`\n\n```shell\n➜  ~ kubectl get pods -o wide\nNAME                                       READY   STATUS             RESTARTS   AGE     IP                NODE              NOMINATED NODE   READINESS GATES\nauthors-dbb57d856-mbgqk                    3/3     Running            0          7d23h   172.29.2.132      192.168.0.5       \u003cnone\u003e           \u003cnone\u003e\ndetails-7d8b5f6bcf-hcl4t                   1/1     Running            0          61d     172.29.0.77       192.168.104.255   \u003cnone\u003e           \u003cnone\u003e\nkubevpn-traffic-manager-66d969fd45-9zlbp   3/3     Running            0          74s     172.29.2.136      192.168.0.5       \u003cnone\u003e           \u003cnone\u003e\nproductpage-788df7ff7f-jpkcs               1/1     Running            0          61d     172.29.2.134      192.168.0.5       \u003cnone\u003e           \u003cnone\u003e\nratings-77b6cd4499-zvl6c                   1/1     Running            0          61d     172.29.0.86       192.168.104.255   \u003cnone\u003e           \u003cnone\u003e\nreviews-85c88894d9-vgkxd                   1/1     Running            0          24d     172.29.2.249      192.168.0.5       \u003cnone\u003e           \u003cnone\u003e\n```\n\nuse `ping` to test connection, seems good\n\n```shell\n➜  ~ ping 172.29.2.134\nPING 172.29.2.134 (172.29.2.134): 56 data bytes\n64 bytes from 172.29.2.134: icmp_seq=0 ttl=63 time=55.727 ms\n64 bytes from 172.29.2.134: icmp_seq=1 ttl=63 time=56.270 ms\n64 bytes from 172.29.2.134: icmp_seq=2 ttl=63 time=55.228 ms\n64 bytes from 172.29.2.134: icmp_seq=3 ttl=63 time=54.293 ms\n^C\n--- 172.29.2.134 ping statistics ---\n4 packets transmitted, 4 packets received, 0.0% packet loss\nround-trip min/avg/max/stddev = 54.293/55.380/56.270/0.728 ms\n```\n\nuse service `productpage` IP `172.21.10.49`\n\n```shell\n➜  ~ kubectl get services -o wide\nNAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                              AGE     SELECTOR\nauthors                   ClusterIP   172.21.5.160    \u003cnone\u003e        9080/TCP                             114d    app=authors\ndetails                   ClusterIP   172.21.6.183    \u003cnone\u003e        9080/TCP                             114d    app=details\nkubernetes                ClusterIP   172.21.0.1      \u003cnone\u003e        443/TCP                              319d    \u003cnone\u003e\nkubevpn-traffic-manager   ClusterIP   172.21.2.86     \u003cnone\u003e        8422/UDP,10800/TCP,9002/TCP,80/TCP   2m28s   app=kubevpn-traffic-manager\nproductpage               ClusterIP   172.21.10.49    \u003cnone\u003e        9080/TCP                             114d    app=productpage\nratings                   ClusterIP   172.21.3.247    \u003cnone\u003e        9080/TCP                             114d    app=ratings\nreviews                   ClusterIP   172.21.8.24     \u003cnone\u003e        9080/TCP                             114d    app=reviews\n```\n\nuse command `curl` to test service connection\n\n```shell\n➜  ~ curl 172.21.10.49:9080\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003ctitle\u003eSimple Bookstore App\u003c/title\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n```\n\nseems good too~\n\n### Domain resolve\n\nsupport k8s dns name resolve.\n\na Pod/Service named `productpage` in the `default` namespace can successfully resolve by following name:\n\n- `productpage`\n- `productpage.default`\n- `productpage.default.svc.cluster.local`\n\n```shell\n➜  ~ curl productpage.default.svc.cluster.local:9080\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003ctitle\u003eSimple Bookstore App\u003c/title\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n```\n\n### Short domain resolve\n\nTo access the service in the cluster, service name or you can use the short domain name, such\nas `productpage`\n\n```shell\n➜  ~ curl productpage:9080\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003ctitle\u003eSimple Bookstore App\u003c/title\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"\u003e\n...\n```\n\n***Disclaimer:*** This only works on the namespace where kubevpn-traffic-manager is deployed. Otherwise,\nuse [Domain resolve](./README.md#domain-resolve)\n\n### Connect to multiple kubernetes cluster network\n\n- Mode `lite`: can connect to multiple cluster network, design for only connecting to multiple cluster network.\n- Mode `Full`: not only connect to cluster network, it also supports proxy workloads inbound traffic to local PC.\n\nalready connected cluster `ccijorbccotmqodvr189g` with mode `full`\n\n```shell\n➜  ~ kubevpn status\nID Mode Cluster               Kubeconfig                 Namespace Status\n0  full ccijorbccotmqodvr189g /Users/naison/.kube/config default   Connected\n```\n\nthen connect to another cluster `ccidd77aam2dtnc3qnddg` with mode `lite`\n\n```shell\n➜  ~ kubevpn connect -n default --kubeconfig ~/.kube/dev_config --lite\nStarting connect\nGot network CIDR from cache\nUse exist traffic manager\nForwarding port...\nConnected tunnel\nAdding route...\nConfigured DNS service\n+----------------------------------------------------------+\n| Now you can access resources in the kubernetes cluster ! |\n+----------------------------------------------------------+\n```\n\nuse command `kubevpn status` to check connection status\n\n```shell\n➜  ~ kubevpn status\nID Mode Cluster               Kubeconfig                     Namespace Status\n0  full ccijorbccotmqodvr189g /Users/naison/.kube/config     default   Connected\n1  lite ccidd77aam2dtnc3qnddg /Users/naison/.kube/dev_config default   Connected\n➜  ~\n```\n\n### Reverse proxy\n\nuse command `kubevpn proxy` to proxy all inbound traffic to local computer.\n\n```shell\n➜  ~ kubevpn proxy deployment/productpage\nConnected to cluster\nInjecting inbound sidecar for deployment/productpage\nChecking rollout status for deployment/productpage\nWaiting for deployment \"productpage\" rollout to finish: 1 old replicas are pending termination...\nWaiting for deployment \"productpage\" rollout to finish: 1 old replicas are pending termination...\nRollout successfully for deployment/productpage\n+----------------------------------------------------------+\n| Now you can access resources in the kubernetes cluster ! |\n+----------------------------------------------------------+\n➜  ~\n```\n\nFor local testing, save the following code as `hello.go`\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n)\n\nfunc main() {\n\thttp.HandleFunc(\"/\", func(writer http.ResponseWriter, request *http.Request) {\n\t\t_, _ = io.WriteString(writer, \"Hello world!\")\n\t\tfmt.Printf(\"\u003e\u003eReceived request: %s %s from %s\\n\", request.Method, request.RequestURI, request.RemoteAddr)\n\t})\n\t_ = http.ListenAndServe(\":9080\", nil)\n}\n```\n\nand compile it\n\n```\ngo build hello.go\n```\n\nthen run it\n\n```\n./hello \u0026\n```\n\n```shell\nexport selector=productpage\nexport pod=`kubectl get pods -l app=${selector} -n default -o jsonpath='{.items[0].metadata.name}'`\nexport pod_ip=`kubectl get pod $pod -n default -o jsonpath='{.status.podIP}'`\ncurl -v -H \"foo: bar\" http://$pod_ip:9080/health\n```\n\nresponse would like below\n\n```\n❯ curl -v -H \"foo: bar\" http://$pod_ip:9080/health\n*   Trying 192.168.72.77:9080...\n* Connected to 192.168.72.77 (192.168.72.77) port 9080 (#0)\n\u003e GET /health HTTP/1.1\n\u003e Host: 192.168.72.77:9080\n\u003e User-Agent: curl/7.87.0\n\u003e Accept: */*\n\u003e foo: bar\n\u003e \n\u003e\u003eReceived request: GET /health from xxx.xxx.xxx.xxx:52974\n* Mark bundle as not supporting multiuse\n\u003c HTTP/1.1 200 OK\n\u003c Date: Sat, 04 Nov 2023 10:19:50 GMT\n\u003c Content-Length: 12\n\u003c Content-Type: text/plain; charset=utf-8\n\u003c \n* Connection #0 to host 192.168.72.77 left intact\nHello world!\n```\n\nalso you can access via service name\n\n```shell\n➜  ~ curl productpage:9080\nHello world!%\n➜  ~ curl productpage.default.svc.cluster.local:9080\nHello world!%\n```\n\n### Reverse proxy with mesh\n\nSupport HTTP, GRPC and WebSocket etc. with specific header `\"foo: bar\"` will route to your local machine\n\n```shell\n➜  ~ kubevpn proxy deployment/productpage --headers foo=bar\nConnected to cluster\nInjecting inbound sidecar for deployment/productpage\nChecking rollout status for deployment/productpage\nWaiting for deployment \"productpage\" rollout to finish: 1 old replicas are pending termination...\nWaiting for deployment \"productpage\" rollout to finish: 1 old replicas are pending termination...\nRollout successfully for deployment/productpage\n+----------------------------------------------------------+\n| Now you can access resources in the kubernetes cluster ! |\n+----------------------------------------------------------+\n➜  ~\n```\n\nfirst access without header \"foo: bar\", it will access existing pod on kubernetes cluster.\n\n```shell\n➜  ~ curl productpage:9080\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003ctitle\u003eSimple Bookstore App\u003c/title\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n...\n```\n\nNow let's access local service with header `\"foo: bar\"`\n\n```shell\n➜  ~ curl productpage:9080 -H \"foo: bar\"\n\u003e\u003eReceived request: GET / from xxx.xxx.xxx.xxx:51296\nHello world!  \n```\n\nIf you want to cancel proxy, just run command:\n\n```shell\n➜  ~ kubevpn leave deployments/productpage\nLeaving workload deployments/productpage\nChecking rollout status for deployments/productpage\nWaiting for deployment \"productpage\" rollout to finish: 0 out of 1 new replicas have been updated...\nWaiting for deployment \"productpage\" rollout to finish: 1 old replicas are pending termination...\nWaiting for deployment \"productpage\" rollout to finish: 1 old replicas are pending termination...\nRollout successfully for deployments/productpage\n```\n\n### Dev mode in local Docker 🐳\n\nRun the Kubernetes pod in the local Docker container, and cooperate with the service mesh to intercept the traffic with\nthe specified header to the local, or all the traffic to the local.\n\n```shell\n➜  ~ kubevpn dev deployment/authors --headers foo=bar --entrypoint sh\nStarting connect\nGot network CIDR from cache\nUse exist traffic manager\nForwarding port...\nConnected tunnel\nAdding route...\nConfigured DNS service\nInjecting inbound sidecar for deployment/authors\nPatching workload deployment/authors\nChecking rollout status for deployment/authors\nWaiting for deployment \"authors\" rollout to finish: 0 out of 1 new replicas have been updated...\nWaiting for deployment \"authors\" rollout to finish: 1 old replicas are pending termination...\ndeployment \"authors\" successfully rolled out\nRollout successfully for Deployment.apps/authors \ntar: removing leading '/' from member names\n/var/folders/30/cmv9c_5j3mq_kthx63sb1t5c0000gn/T/4563987760170736212:/var/run/secrets/kubernetes.io/serviceaccount\ntar: Removing leading `/' from member names\ntar: Removing leading `/' from hard link targets\n/var/folders/30/cmv9c_5j3mq_kthx63sb1t5c0000gn/T/4044542168121221027:/var/run/secrets/kubernetes.io/serviceaccount\ncreate docker network 56c25058d4b7498d02c2c2386ccd1b2b127cb02e8a1918d6d24bffd18570200e\nCreated container: nginx_default_kubevpn_a9a22\nWait container nginx_default_kubevpn_a9a22 to be running...\nContainer nginx_default_kubevpn_a9a22 is running on port 80/tcp:80 8888/tcp:8888 9080/tcp:9080 now\nWARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested\nCreated main container: authors_default_kubevpn_a9a22\n/opt/microservices # ls\napp\n/opt/microservices # ps -ef\nPID   USER     TIME  COMMAND\n    1 root      0:00 nginx: master process nginx -g daemon off;\n   29 101       0:00 nginx: worker process\n   30 101       0:00 nginx: worker process\n   31 101       0:00 nginx: worker process\n   32 101       0:00 nginx: worker process\n   33 101       0:00 nginx: worker process\n   34 root      0:00 {sh} /usr/bin/qemu-x86_64 /bin/sh sh\n   44 root      0:00 ps -ef\n/opt/microservices # apk add curl\nfetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz\nfetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz\n(1/4) Installing brotli-libs (1.0.9-r5)\n(2/4) Installing nghttp2-libs (1.43.0-r0)\n(3/4) Installing libcurl (8.0.1-r0)\n(4/4) Installing curl (8.0.1-r0)\nExecuting busybox-1.33.1-r3.trigger\nOK: 8 MiB in 19 packages\n/opt/microservices # ./app \u0026\n/opt/microservices # 2023/09/30 13:41:58 Start listening http port 9080 ...\n\n/opt/microservices # curl localhost:9080/health\n{\"status\":\"Authors is healthy\"} /opt/microservices # echo \"continue testing pod access...\"\ncontinue testing pod access...\n/opt/microservices # exit\nCreated container: default_authors\nWait container default_authors to be running...\nContainer default_authors is running now\nDisconnecting from the cluster...\nLeaving workload deployments.apps/authors\nDisconnecting from the cluster...\nPerforming cleanup operations\nClearing DNS settings\n➜  ~\n```\n\nYou can see that it will start up two containers with docker, mapping to pod two container, and share port with same\nnetwork, you can use `localhost:port`\nto access another container. And more, all environment、volume and network are the same as remote kubernetes pod, it is\ntruly consistent with the kubernetes runtime. Makes develop on local PC come true.\n\n```shell\n➜  ~ docker ps\nCONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                                                NAMES\nafdecf41c08d   naison/authors:latest           \"sh\"                     37 seconds ago   Up 36 seconds                                                                        authors_default_kubevpn_a9a22\nfc04e42799a5   nginx:latest                    \"/docker-entrypoint.…\"   37 seconds ago   Up 37 seconds   0.0.0.0:80-\u003e80/tcp, 0.0.0.0:8888-\u003e8888/tcp, 0.0.0.0:9080-\u003e9080/tcp   nginx_default_kubevpn_a9a22\n➜  ~\n```\n\nHere is how to access pod in local docker container\n\n```shell\nexport authors_pod=`kubectl get pods -l app=authors -n default -o jsonpath='{.items[0].metadata.name}'`\nexport authors_pod_ip=`kubectl get pod $authors_pod -n default -o jsonpath='{.status.podIP}'`\ncurl -kv -H \"foo: bar\" http://$authors_pod_ip:80/health\n```\n\nVerify logs of nginx container\n\n```shell\ndocker logs $(docker ps --format '{{.Names}}' | grep nginx_default_kubevpn)\n```\n\nIf you just want to start up a docker image, you can use a simple way like this:\n\n```shell\nkubevpn dev deployment/authors --no-proxy\n```\n\nExample：\n\n```shell\n➜  ~ kubevpn dev deployment/authors --no-proxy\nStarting connect\nGot network CIDR from cache\nUse exist traffic manager\nForwarding port...\nConnected tunnel\nAdding route...\nConfigured DNS service\ntar: removing leading '/' from member names\n/var/folders/30/cmv9c_5j3mq_kthx63sb1t5c0000gn/T/5631078868924498209:/var/run/secrets/kubernetes.io/serviceaccount\ntar: Removing leading `/' from member names\ntar: Removing leading `/' from hard link targets\n/var/folders/30/cmv9c_5j3mq_kthx63sb1t5c0000gn/T/1548572512863475037:/var/run/secrets/kubernetes.io/serviceaccount\ncreate docker network 56c25058d4b7498d02c2c2386ccd1b2b127cb02e8a1918d6d24bffd18570200e\nCreated container: nginx_default_kubevpn_ff34b\nWait container nginx_default_kubevpn_ff34b to be running...\nContainer nginx_default_kubevpn_ff34b is running on port 80/tcp:80 8888/tcp:8888 9080/tcp:9080 now\nWARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested\nCreated main container: authors_default_kubevpn_ff34b\n2023/09/30 14:02:31 Start listening http port 9080 ...\n\n```\n\nNow the main process will hang up to show you log.\n\nIf you want to specify the image to start the container locally, you can use the parameter `--dev-image`. When the\nimage does not exist locally, it will be pulled from the corresponding mirror warehouse. If you want to specify startup\nparameters, you can use `--entrypoint` parameter, replace it with the command you want to execute, such\nas `--entrypoint /bin/bash`, for more parameters, see `kubevpn dev --help`.\n\n### DinD ( Docker in Docker ) use kubevpn in Docker\n\nIf you want to start the development mode locally using Docker in Docker (DinD), because the program will read and\nwrite the `/tmp` directory, you need to manually add the parameter `-v /tmp:/tmp` (outer docker) and another thing is\nyou\nneed to special parameter `--network` (inner docker) for sharing network and pid\n\nExample:\n\n```shell\ndocker run -it --privileged --sysctl net.ipv6.conf.all.disable_ipv6=0 -v /var/run/docker.sock:/var/run/docker.sock -v /tmp:/tmp -v ~/.kube/config:/root/.kube/config --platform linux/amd64 ghcr.io/kubenetworks/kubevpn:latest\n```\n\n```shell\n➜  ~ docker run -it --privileged --sysctl net.ipv6.conf.all.disable_ipv6=0 -v /var/run/docker.sock:/var/run/docker.sock -v /tmp:/tmp -v ~/.kube/vke:/root/.kube/config --platform linux/amd64 ghcr.io/kubenetworks/kubevpn:latest\nUnable to find image 'ghcr.io/kubenetworks/kubevpn:latest' locally\nlatest: Pulling from ghcr.io/kubenetworks/kubevpn\n9c704ecd0c69: Already exists\n4987d0a976b5: Pull complete\n8aa94c4fc048: Pull complete\n526fee014382: Pull complete\n6c1c2bedceb6: Pull complete\n97ac845120c5: Pull complete\nca82aef6a9eb: Pull complete\n1fd9534c7596: Pull complete\n588bd802eb9c: Pull complete\nDigest: sha256:368db2e0d98f6866dcefd60512960ce1310e85c24a398fea2a347905ced9507d\nStatus: Downloaded newer image for ghcr.io/kubenetworks/kubevpn:latest\nWARNING: image with reference ghcr.io/kubenetworks/kubevpn was found but does not match the specified platform: wanted linux/amd64, actual: linux/arm64\nroot@5732124e6447:/app# kubevpn dev deployment/authors --headers user=naison --entrypoint sh\nhostname is 5732124e6447\nStarting connect\nGot network CIDR from cache\nUse exist traffic manager\nForwarding port...\nConnected tunnel\nAdding route...\nConfigured DNS service\nInjecting inbound sidecar for deployment/authors\nPatching workload deployment/authors\nChecking rollout status for deployment/authors\nWaiting for deployment \"authors\" rollout to finish: 1 old replicas are pending termination...\ndeployment \"authors\" successfully rolled out\nRollout successfully for Deployment.apps/authors\ntar: removing leading '/' from member names\n/tmp/6460902982794789917:/var/run/secrets/kubernetes.io/serviceaccount\ntar: Removing leading `/' from member names\ntar: Removing leading `/' from hard link targets\n/tmp/5028895788722532426:/var/run/secrets/kubernetes.io/serviceaccount\nNetwork mode is container:d0b3dab8912a\nCreated container: nginx_default_kubevpn_6df63\nWait container nginx_default_kubevpn_6df63 to be running...\nContainer nginx_default_kubevpn_6df63 is running now\nWARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested\nCreated main container: authors_default_kubevpn_6df5f\n/opt/microservices # ps -ef\nPID   USER     TIME  COMMAND\n    1 root      0:00 {bash} /usr/bin/qemu-x86_64 /bin/bash /bin/bash\n   14 root      0:02 {kubevpn} /usr/bin/qemu-x86_64 /usr/local/bin/kubevpn kubevpn dev deployment/authors --headers\n   25 root      0:01 {kubevpn} /usr/bin/qemu-x86_64 /usr/local/bin/kubevpn /usr/local/bin/kubevpn daemon\n   37 root      0:04 {kubevpn} /usr/bin/qemu-x86_64 /usr/local/bin/kubevpn /usr/local/bin/kubevpn daemon --sudo\n   53 root      0:00 nginx: master process nginx -g daemon off;\n(4/4) Installing curl (8.0.1-r0)\nExecuting busybox-1.33.1-r3.trigger\nOK: 8 MiB in 19 packagesnx: worker process\n/opt/microservices #\n\n/opt/microservices # cat \u003e hello.go \u003c\u003cEOF\npackage main\n\nimport (\n    \"fmt\"\n    \"io\"\n    \"net/http\"\n)\n\nfunc main() {\n    http.HandleFunc(\"/\", func(writer http.ResponseWriter, request *http.Request) {\n        _, _ = io.WriteString(writer, \"Hello world!\")\n        fmt.Println(\"\u003e\u003e Container Received request: %s %s from %s\\n\", request.Method, request.RequestURI, request.RemoteAddr)\n    })\n    fmt.Println(\"Start listening http port 9080 ...\")\n    _ = http.ListenAndServe(\":9080\", nil)\n}\nEOF\n/opt/microservices # go build hello.go\n/opt/microservices # \n//opt/microservices # ls -alh\ntotal 12M    \ndrwxr-xr-x    1 root     root          26 Nov  4 10:29 .\ndrwxr-xr-x    1 root     root          26 Oct 18  2021 ..\n-rwxr-xr-x    1 root     root        6.3M Oct 18  2021 app\n-rwxr-xr-x    1 root     root        5.8M Nov  4 10:29 hello\n-rw-r--r--    1 root     root         387 Nov  4 10:28 hello.go\n/opt/microservices # \n/opt/microservices # apk add curl\nOK: 8 MiB in 19 packages\n/opt/microservices # ./hello \u0026\n/opt/microservices # Start listening http port 9080 ...\n[2]+  Done                       ./hello\n/opt/microservices # curl localhost:9080\n\u003e\u003e Container Received request: GET / from 127.0.0.1:41230\nHello world!/opt/microservices # \n\n/opt/microservices # curl authors:9080/health -H \"foo: bar\"\n\u003e\u003eReceived request: GET /health from 198.19.0.109:57930\n                                                        Hello world!/opt/microservices # \n/opt/microservices # curl localhost:9080/health\n{\"status\":\"Authors is healthy\"}/opt/microservices # exit\nCreated container: default_authors\nWait container default_authors to be running...\nContainer default_authors is running now\nDisconnecting from the cluster...\nLeaving workload deployments.apps/authors\nDisconnecting from the cluster...\nPerforming cleanup operations\nClearing DNS settings\nroot@d0b3dab8912a:/app# exit\nexit\n➜  ~\n```\n\nduring test, check what container is running\n\n```text\n➜  ~ docker ps\nCONTAINER ID   IMAGE                                  COMMAND                  CREATED         STATUS         PORTS     NAMES\n1cd576b51b66   naison/authors:latest                  \"sh\"                     4 minutes ago   Up 4 minutes             authors_default_kubevpn_6df5f\n56a6793df82d   nginx:latest                           \"/docker-entrypoint.…\"   4 minutes ago   Up 4 minutes             nginx_default_kubevpn_6df63\nd0b3dab8912a   ghcr.io/kubenetworks/kubevpn:v2.0.0    \"/bin/bash\"              5 minutes ago   Up 5 minutes             upbeat_noyce\n➜  ~\n```\n\n* For clean up after test\n\n```shell\nkubectl delete -f https://raw.githubusercontent.com/kubenetworks/kubevpn/master/samples/bookinfo.yaml\n```\n\n### Multiple Protocol\n\nsupport OSI model layers 3 and above, protocols like `ICMP`, `TCP`, and `UDP`...\n\n- TCP\n- UDP\n- ICMP\n- gRPC\n- Thrift\n- WebSocket\n- HTTP\n- ...\n\n### Cross-platform\n\n- macOS\n- Linux\n- Windows\n\n## Architecture\n\n[architecture](https://kubevpn.dev/docs/architecture/connect).\n\n## Contributions\n\nAlways welcome. Just opening an issue should be also grateful.\n\nIf you want to debug this project on local PC. Please follow the steps bellow:\n\n- Startup daemon and sudo daemon process with IDE debug mode. (Essentially two GRPC server)\n- Add breakpoint to file `pkg/daemon/action/connect.go:21`.\n- Open another terminal run `make kubevpn`.\n- Then run `./bin/kubevpn connect` and it will hit breakpoint.\n\n### Supported by\n\n[![JetBrains logo.](https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg)](https://jb.gg/OpenSourceSupport)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkubenetworks%2Fkubevpn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkubenetworks%2Fkubevpn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkubenetworks%2Fkubevpn/lists"}