Telepresence: Rapid Deployment and Communicate with Remote Kubernetes Cluster in Local
Telepresence 透過 sshuttle 使用 SSH connection 產生 VPN-like tunnel,建立一個雙向的 network proxy。(more details),甚至可以在 service 前面加一層 ingress, cert-manager 進而產生一個 Local HTTPS 的開發環境。
此外,CNCF 基金會 目前已經將 Telepresence 加入計畫,可以對這個工具多一點的信心。
解決問題
- 如果 cluster 的 micro service 很多,不可能在本地端用 minikube 測試。
- 不需要等待 CI/CD 將程式碼推到 Cluster 才能看到結果
- 不需要額外設定 VPN(OpenVPN, Wireguard),存取 Cluster 其他 Service
- 可以在程式內直接使用 Kubernetes Cluster 的 Service. ex. requests.get(‘client.elasticsearch:9200’)
Step by Step
Code: https://github.com/RammusXu/toolkit/tree/master/demo/k8s/telepresence
Install
brew cask install osxfusebrew install datawire/blackbird/telepresence
先準備一個 telepresence 的 proxy pod(deployment+service)
以及一個簡單的 Flask
Run
kubectl apply -f telepresence.yamlsudo telepresence --deployment telepresence-rammus --expose 5000:80 --namespace dev --run sh -c "FLASK_DEBUG=1 flask run"`--deployment [deployment-name]` 將會置換掉 deployment`--expose 5000:80` 將 localhost:5000 expose 到 kubernetes-pod:80`--namespace [your-namespace]` 可以選擇要替換哪個 namespace 的 deployment。預設是 `default``--run` 啟用 server 的方式。ex. `npm start`, `flask run`, `rails server`。這邊帶入 FLASK_DEBUG=1 自動監控 app.py 程式碼變更時重啟 server,如果是別的語言,請自行替換,或是加入環境變數。
Advanced
如果需要限制 developer 的 RBAC,這裡有 minimal RABC role:https://www.telepresence.io/reference/connecting#running-telepresence-manually
如果想要用 docker 可以參考:https://www.telepresence.io/tutorials/docker
telepresence — swap-deployment hello-world — docker-run — rm -it -v $(pwd):/usr/src/app hello-dev
如果不希望 developer 的 pod 可以存取所有其他的 service/pod,可以參考:
- https://kubernetes.io/docs/concepts/services-networking/network-policies/
- https://github.com/ahmetb/kubernetes-network-policy-recipes
其他選擇
Reference
- https://www.reddit.com/r/kubernetes/comments/aapysv/whats_the_dev_workflow_with_k8s_on_the_local/
- https://www.bizety.com/2019/02/13/kubernetes-dev-tools-codeready-skaffold-draft-squash-telepresence-and-ksync/
本篇文章同步發表於 rammusxu.github.io