自从服务上云引入K8S后,我们开发模式也发生了改变。我们最能想到的一种开发流程就是:
- 首先用ide编写业务代码
- 其次,编译打包成镜像,并上传至habor
- 接着,通过kubectl edit deployment替换镜像或者通过helm --install的方式更新版本
- 最后,通过postman调用grpc或者通过打流仪之类的进行业务验证
以上的开发流程中会产生以下几个问题:
- 流程繁琐,完全不敏捷
- 如果大家都同时改同一个微服务,或者有其他依赖,很容易乱掉
- 内部微服务不对外暴露,只能使用NodePort方式或apisix网关转发一下
telepresence,是K8S官方文档中推荐的一种开发方式,具体提供以下几个功能:
- 本地的服务就可以完整的访问到远程集群中的其他服务。
- 本地的服务直接访问到 Kubernetes 里的各种资源,包括环境变量、Secrets、Config map 等。
- 集群中的服务能直接访问到本地暴露出来的接口。
它的工作原理是在本地和 Kubernetes
集群中搭建一个透明的双向代理,这使得我们可以在本地用熟悉的 IDE
和调试工具来运行一个微服务,访问kubernetes内部服务时,telepresence能够将对应流量引入到K8S中,完成调用(可以使用FQDN,clusterIP进行调用),好像它就运行在这个集群中一样,其次还可以拦截微服务流量,将kubernetes流量引入本地,具体原理图如下:
在这基础上,可以减少编译调试,更换镜像的操作,但是仍然没解决多人同时开发一个微服务的情况。
Istio**+Okteto一发入魂**
Istio负责对外部进入的流量进行标记,通过istio路由到同一服务的不同版本。
Okteto负责快速调试,轻松在windows上远程调试go代码,代码更改会立即应用于Kubernetes,无需提交、构建或推送(主要依靠的是syncthing),其次我们将pod内部端口映射到windows指定端口,调试直接可使用localhost即可。
整体流程图如下:
酸爽的实机演示
磨磨刀
- goland:GoLand安装+破解 - 潆勖 - 博客园 (cnblogs.com)
- okteto:https://downloads.okteto.com/cli/okteto.exe,添加到PATH环境变量中
- syncthing:Syncthing | Downloads,拷贝到C:\Users\User\.okteto
- kubetcl-windows:在 Windows 上安装 kubectl,添加到PATH环境变量中
- 拷贝k8s集群配置文件:windos上新建目录C:\Users\User\.kube\,然后登录K8S的master集群,拷贝/root/.kube/config至新建目录中,安装如下:
狩猎开始了
-
代码仓库中新增okteto.yaml,格式如下:
name: whisperkoo-dev
自己的golang1.9编译镜像
image: whisperkoo/go-dev:0.0.1
initContainer:
image: okteto/bin:1.2.22workdir: /service/
win->port的端口映射,一个用来远程调试端口,一个用来访问的grpc端口
forward:
- 9000:9000
- 9001:9001
interface: 0.0.0.0
environment:
environment: development若没有在k8s上创建好{name}指定的pod,则需要设置为true(不存在pod会默认创建pod),默认值为false
autocreate: true
command: [ "bash" ] -
goland下执行,okteto up,如下图所示,自动创建了pod,并同步了代码文件:
- 编译+运行,go mod tidy + go build + go run main.go --host 0.0.0.0
- 通过postman调用grpc服务,这里面cookies携带appmode,来进行流量控制:
-
Kubernetes 集群上安装Istio环境,并配置虚拟服务(Virtual Service)和目标规则(Destination Rule),如下图所示:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
appmode:
exact: dev #控制哪些特征的流量
route:
- destination:
host: reviews
subset: dev #路由到这个host下的路由策略
- route:
- destination:
host: reviews
subset: v3apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule #路由策略集
metadata:
name: my-destination-rule
spec:
host: my-svc
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: dev
labels:
appmode: dev #流量引入到这里,whisperkoo-dev yaml中appmode为dev的版本 -
不用了就okteto down,优雅退出
Reference
自从用上 Telepresence 后,本地调试 Kubernetes 中的微服务不再是梦!-腾讯云开发者社区-腾讯云 (tencent.com)
K8S调试利器:telepresence2使用文档 - 掘金 (juejin.cn)
ubuntu下使用Telepresence本地开发调试k8s微服务_k8s telepresence_君君要上天的博客-CSDN博客
okteto学习笔记_Tamayo0914的博客-CSDN博客
windows/MacOS/Linux下搭建Okteto+vscode远程开发环境_okteto安装_FTLIKON的博客-CSDN博客
如何在 Kubernetes 上开发和调试 Go 应用程序 - 知乎 (zhihu.com)
Docker Compose on Kubernetes with Okteto | Okteto Documentation
Istio流量管理实现机制深度解析 - 割肉机 - 博客园 (cnblogs.com)