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

自从服务上云引入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即可。

整体流程图如下:

酸爽的实机演示

磨磨刀

狩猎开始了

  • 代码仓库中新增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 / 流量管理

相关推荐
lichenyang4531 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4531 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4531 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事4 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生6 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭6 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美7 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵8 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程