【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 / 流量管理

相关推荐
Python私教33 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
O&REO2 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
politeboy2 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
运维小文3 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻3 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
wuxingge12 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX13 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总13 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿13 小时前
k8s 集群安装
云原生·容器·kubernetes
Code_Artist13 小时前
Docker镜像加速解决方案:配置HTTP代理,让Docker学会科学上网!
docker·云原生·容器