【K8S】一种基于Istio+Okteto下的快乐开发模式

时间:2024-03-08 09:42:45

自从服务上云引入K8S后,我们开发模式也发生了改变。我们最能想到的一种开发流程就是:

  1. 首先用ide编写业务代码
  2. 其次,编译打包成镜像,并上传至habor
  3. 接着,通过kubectl edit deployment替换镜像或者通过helm --install的方式更新版本
  4. 最后,通过postman调用grpc或者通过打流仪之类的进行业务验证

以上的开发流程中会产生以下几个问题:

  • 流程繁琐,完全不敏捷
  • 如果大家都同时改同一个微服务,或者有其他依赖,很容易乱掉
  • 内部微服务不对外暴露,只能使用NodePort方式或apisix网关转发一下

telepresence,是K8S官方文档中推荐的一种开发方式,具体提供以下几个功能:

  1. 本地的服务就可以完整的访问到远程集群中的其他服务。
  2. 本地的服务直接访问到 Kubernetes 里的各种资源,包括环境变量、Secrets、Config map 等。
  3. 集群中的服务能直接访问到本地暴露出来的接口。

它的工作原理是在本地和 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.22

workdir: /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: v3

apiVersion: 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)

Okteto Manifest | Okteto Documentation

Istio / 流量管理