KubeVPN云原生開發(fā)環(huán)境
KubeVPN 是一個云原生開發(fā)工具,可以在本地連接云端 kubernetes 網(wǎng)絡(luò)的工具,可以在本地直接訪問遠端集群的服務(wù)。也可以在遠端集群訪問到本地服務(wù),便于調(diào)試及開發(fā)。同時還可以使用開發(fā)模式,直接在本地使用 Docker 將遠程容器運行在本地。
功能
鏈接到集群網(wǎng)絡(luò)
? ~ kubevpn connect get cidr from cluster info... get cidr from cluster info ok get cidr from cni... get cidr from svc... get cidr from svc ok 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 Container Reason Message control-plane ContainerCreating vpn ContainerCreating webhook ContainerCreating pod [kubevpn-traffic-manager] status is Running Container Reason Message control-plane ContainerRunning vpn ContainerRunning webhook ContainerRunning 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 :) ---------------------------------------------------------------------------
有這個提示出來后, 當(dāng)前 terminal 不要關(guān)閉,新打開一個 terminal, 執(zhí)行新的操作
? ~ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES details-7db5668668-mq9qr 1/1 Running 0 7m 172.27.0.199 172.30.0.14 <none> <none> kubevpn-traffic-manager-99f8c8d77-x9xjt 1/1 Running 0 74s 172.27.0.207 172.30.0.14 <none> <none> productpage-8f9d86644-z8snh 1/1 Running 0 6m59s 172.27.0.206 172.30.0.14 <none> <none> ratings-859b96848d-68d7n 1/1 Running 0 6m59s 172.27.0.201 172.30.0.14 <none> <none> reviews-dcf754f9d-46l4j 1/1 Running 0 6m59s 172.27.0.202 172.30.0.14 <none> <none>
? ~ ping 172.27.0.206
PING 172.27.0.206 (172.27.0.206): 56 data bytes
64 bytes from 172.27.0.206: icmp_seq=0 ttl=63 time=49.563 ms
64 bytes from 172.27.0.206: icmp_seq=1 ttl=63 time=43.014 ms
64 bytes from 172.27.0.206: icmp_seq=2 ttl=63 time=43.841 ms
64 bytes from 172.27.0.206: icmp_seq=3 ttl=63 time=44.004 ms
64 bytes from 172.27.0.206: icmp_seq=4 ttl=63 time=43.484 ms
^C
--- 172.27.0.206 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 43.014/44.781/49.563/2.415 ms
? ~ kubectl get services -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR details ClusterIP 172.27.255.92 <none> 9080/TCP 9m7s app=details productpage ClusterIP 172.27.255.48 <none> 9080/TCP 9m6s app=productpage ratings ClusterIP 172.27.255.154 <none> 9080/TCP 9m7s app=ratings reviews ClusterIP 172.27.255.155 <none> 9080/TCP 9m6s app=reviews
? ~ curl 172.27.255.48:9080 <!DOCTYPE html> <html> <head> <title>Simple Bookstore App</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1">
域名解析功能
? ~ curl productpage.default.svc.cluster.local:9080 <!DOCTYPE html> <html> <head> <title>Simple Bookstore App</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1">
短域名解析功能
? ~ curl productpage:9080 <!DOCTYPE html> <html> <head> <title>Simple Bookstore App</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> ...
反向代理
? ~ kubevpn proxy deployment/productpage got cidr from cache traffic manager not exist, try to create it... pod [kubevpn-traffic-manager] status is Running Container Reason Message control-plane ContainerRunning vpn ContainerRunning webhook ContainerRunning update ref count successfully Waiting for deployment "productpage" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "productpage" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "productpage" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "productpage" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "productpage" rollout to finish: 1 old replicas are pending termination... deployment "productpage" successfully rolled out 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 :) ---------------------------------------------------------------------------
package main import ( "io" "net/http" ) func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { _, _ = io.WriteString(writer, "Hello world!") }) _ = http.ListenAndServe(":9080", nil) }
? ~ curl productpage:9080 Hello world!% ? ~ curl productpage.default.svc.cluster.local:9080 Hello world!%
反向代理支持 service mesh
支持 HTTP, GRPC 和 WebSocket 等, 攜帶了指定 header "a: 1" 的流量,將會路由到本地
? ~ kubevpn proxy deployment/productpage --headers a=1 got cidr from cache traffic manager not exist, try to create it... pod [kubevpn-traffic-manager] status is Running Container Reason Message control-plane ContainerRunning vpn ContainerRunning webhook ContainerRunning update ref count successfully Waiting for deployment "productpage" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "productpage" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "productpage" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "productpage" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "productpage" rollout to finish: 1 old replicas are pending termination... deployment "productpage" successfully rolled out 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 :) ---------------------------------------------------------------------------
? ~ curl productpage:9080 <!DOCTYPE html> <html> <head> <title>Simple Bookstore App</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> ...
? ~ curl productpage:9080 -H "a: 1" Hello world!%
本地進入開發(fā)模式
將 Kubernetes pod 運行在本地的 Docker 容器中,同時配合 service mesh, 攔截帶有制定 header 的流量到本地,或者所有的流量到本地。這個開發(fā)模式依賴于本地 Docker .
? ~ kubevpn -n kube-system --headers a=1 -p 9080:9080 -p 80:80 dev deployment/authors got cidr from cache update ref count successfully traffic manager already exist, reuse it Waiting for deployment "authors" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "authors" rollout to finish: 1 old replicas are pending termination... deployment "authors" successfully rolled out port forward ready tunnel connected dns service ok tar: removing leading '/' from member names /var/folders/4_/wt19r8113kq_mfws8sb_w1z00000gn/T/3264799524258261475:/var/run/secrets/kubernetes.io/serviceaccount tar: Removing leading '/' from member names tar: Removing leading '/' from hard link targets /var/folders/4_/wt19r8113kq_mfws8sb_w1z00000gn/T/4472770436329940969:/var/run/secrets/kubernetes.io/serviceaccount tar: Removing leading '/' from member names tar: Removing leading '/' from hard link targets /var/folders/4_/wt19r8113kq_mfws8sb_w1z00000gn/T/359584695576599326:/var/run/secrets/kubernetes.io/serviceaccount Created container: authors_kube-system_kubevpn_a7d82 Wait container authors_kube-system_kubevpn_a7d82 to be running... Container authors_kube-system_kubevpn_a7d82 is running on port 9080/tcp:32771 now Created container: nginx_kube-system_kubevpn_a7d82 Wait container nginx_kube-system_kubevpn_a7d82 to be running... Container nginx_kube-system_kubevpn_a7d82 is running now /opt/microservices # ls app /opt/microservices # ps -ef PID USER TIME COMMAND 1 root 0:00 ./app 10 root 0:00 nginx: master process nginx -g daemon off; 32 root 0:00 /bin/sh 44 101 0:00 nginx: worker process 45 101 0:00 nginx: worker process 46 101 0:00 nginx: worker process 47 101 0:00 nginx: worker process 49 root 0:00 ps -ef /opt/microservices # apk add curl fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz (1/4) Installing brotli-libs (1.0.9-r5) (2/4) Installing nghttp2-libs (1.43.0-r0) (3/4) Installing libcurl (7.79.1-r5) (4/4) Installing curl (7.79.1-r5) Executing busybox-1.33.1-r3.trigger OK: 8 MiB in 19 packages /opt/microservices # curl localhost:9080 404 page not found /opt/microservices # curl localhost:9080/health {"status":"Authors is healthy"}/opt/microservices # exit prepare to exit, cleaning up update ref count successfully clean up successful
此時本地會啟動兩個 container, 對應(yīng) pod 容器中的兩個 container, 并且共享端口, 可以直接使用 localhost:port 的形式直接訪問另一個 container, 并且, 所有的環(huán)境變量、掛載卷、網(wǎng)絡(luò)條件都和 pod 一樣, 真正做到與 kubernetes 運行環(huán)境一致。
? ~ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de9e2f8ab57d nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 5 seconds nginx_kube-system_kubevpn_e21d8 28aa30e8929e naison/authors:latest "./app" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:9080->9080/tcp authors_kube-system_kubevpn_e21d8 ? ~
如果你想指定在本地啟動容器的鏡像, 可以使用參數(shù) --docker-image, 當(dāng)本地不存在該鏡像時, 會從對應(yīng)的鏡像倉庫拉取。如果你想指定啟動參數(shù),可以使用 --entrypoint 參數(shù),替換為你想要執(zhí)行的命令,比如 --entrypoint /bin/bash, 更多使用參數(shù),請參見 kubevpn dev --help.
DinD ( Docker in Docker ) 在 Docker 中使用 kubevpn
如果你想在本地使用 Docker in Docker (DinD) 的方式啟動開發(fā)模式, 由于程序會讀寫 /tmp 目錄,您需要手動添加參數(shù) -v /tmp:/tmp, 還有一點需要注意, 如果使用 DinD 模式,為了共享容器網(wǎng)絡(luò)和 pid, 還需要指定參數(shù) --network
例如:
docker run -it --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /tmp:/tmp -v /Users/naison/.kube/config:/root/.kube/config naison/kubevpn:v1.1.21
? ~ docker run -it --privileged -c authors -v /var/run/docker.sock:/var/run/docker.sock -v /tmp:/tmp -v /Users/naison/.kube/config:/root/.kube/config naison/kubevpn:v1.1.21 root@4d0c3c4eae2b:/# hostname 4d0c3c4eae2b root@4d0c3c4eae2b:/# kubevpn -n kube-system --image naison/kubevpn:v1.1.21 --headers user=naison --network container:4d0c3c4eae2b --entrypoint /bin/bash dev deployment/authors ---------------------------------------------------------------------------------- Warn: Use sudo to execute command kubevpn can not use user env KUBECONFIG. Because of sudo user env and user env are different. Current env KUBECONFIG value: ---------------------------------------------------------------------------------- got cidr from cache 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 Container Reason Message control-plane ContainerCreating vpn ContainerCreating webhook ContainerCreating pod [kubevpn-traffic-manager] status is Running Container Reason Message control-plane ContainerRunning vpn ContainerRunning webhook ContainerRunning update ref count successfully Waiting for deployment "authors" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "authors" rollout to finish: 1 old replicas are pending termination... deployment "authors" successfully rolled out port forward ready tunnel connected dns service ok tar: removing leading '/' from member names /tmp/3122262358661539581:/var/run/secrets/kubernetes.io/serviceaccount tar: Removing leading '/' from member names tar: Removing leading '/' from hard link targets /tmp/7677066538742627822:/var/run/secrets/kubernetes.io/serviceaccount latest: Pulling from naison/authors Digest: sha256:2e7b2d6a4c6143cde888fcdb70ba091d533e11de70e13e151adff7510a5d52d4 Status: Downloaded newer image for naison/authors:latest Created container: authors_kube-system_kubevpn_c68e4 Wait container authors_kube-system_kubevpn_c68e4 to be running... Container authors_kube-system_kubevpn_c68e4 is running now Created container: nginx_kube-system_kubevpn_c68e7 Wait container nginx_kube-system_kubevpn_c68e7 to be running... Container nginx_kube-system_kubevpn_c68e7 is running now /opt/microservices # ps -ef PID USER TIME COMMAND 1 root 0:00 {bash} /usr/bin/qemu-x86_64 /bin/bash /bin/bash 60 root 0:07 {kubevpn} /usr/bin/qemu-x86_64 kubevpn kubevpn dev deployment/authors -n kube-system --image naison/kubevpn:v1.1.21 --headers user=naison --parent 73 root 0:00 {tail} /usr/bin/qemu-x86_64 /usr/bin/tail tail -f /dev/null 80 root 0:00 {nginx} /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; 92 root 0:00 {sh} /usr/bin/qemu-x86_64 /bin/sh /bin/sh 156 101 0:00 {nginx} /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; 158 101 0:00 {nginx} /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; 160 101 0:00 {nginx} /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; 162 101 0:00 {nginx} /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; 164 root 0:00 ps -ef /opt/microservices # ls app /opt/microservices # apk add curl fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz (1/4) Installing brotli-libs (1.0.9-r5) (2/4) Installing nghttp2-libs (1.43.0-r0) (3/4) Installing libcurl (7.79.1-r5) (4/4) Installing curl (7.79.1-r5) Executing busybox-1.33.1-r3.trigger OK: 8 MiB in 19 packages /opt/microservices # curl localhost:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> /opt/microservices # ls app /opt/microservices # exit prepare to exit, cleaning up update ref count successfully ref-count is zero, prepare to clean up resource clean up successful root@4d0c3c4eae2b:/# exit exit
支持多種協(xié)議
- TCP
- UDP
- ICMP
- GRPC
- WebSocket
- HTTP
- ...
支持三大平臺
- macOS
- Linux
- Windows
Windows 下需要安裝 PowerShell
