V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huangmingyou
V2EX  ›  Kubernetes

老问题,现在流行什么方法管理多个环境下的 k8s 项目

  •  
  •   huangmingyou · 2021-10-29 14:39:28 +08:00 · 3734 次点击
    这是一个创建于 1122 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我只比较过 helm 和 kustomize ; 简单的使用了一下 kustomize, 发现好多想要的功能都没有。这两个项目都是聚焦管理单个项目。
    对于普通企业来说,更需要的是管理多个项目,并且每个项目之间的差异很小。还有一点就是多环境下的项目,有些全局的配置不一样,比如 hostsalias.我发现用 kustomize 要修改类似 hostsalias 的值就比较麻烦。也不是说不能实现,就是很麻烦。别扭。需要用到 patchesJson6902 这样的方式。
    helm 2.0 时代看过,那时候要安装一个组件到 k8s, 就放弃了。3.0 似乎不用安装了。

    目前我自己是用 yaml 管理这些需要修改的值,然后通过 sed 方式替换到 deploy.yaml 和 service.yaml.

    我就想问下,有什么好的解决方案吗?
    25 条回复    2021-11-02 21:54:24 +08:00
    Rubbick
        1
    Rubbick  
       2021-10-29 17:07:00 +08:00
    我是环境变量注入+配置中心
    simon7878
        2
    simon7878  
       2021-10-29 17:14:27 +08:00
    helm3+values 定制方式可以的吧,实际就是把变化的部分拎出来单独管理,实现自动化。
    liuxu
        3
    liuxu  
       2021-10-29 17:15:10 +08:00
    我是一个 helm 包下面多个 values.yaml ,helm 可以指定 value 文件 --values xx.yaml
    vast0906
        4
    vast0906  
       2021-10-29 17:24:47 +08:00   ❤️ 1
    我们是 jenkins + ansible + k8s 发布的。。ansible 的 template
    YzSama
        5
    YzSama  
       2021-10-29 17:35:41 +08:00
    helm 做一个包,通过环境变量注入。
    jeffreystoke
        6
    jeffreystoke  
       2021-10-29 18:41:38 +08:00
    同样的痛点, 我一直觉得 kustomize 的路走错了, helm 更适合需要大量动态调整的复杂部署 (可能是我看问题的高度不够?)

    为了解决这个问题, 外加需要管理多个仓库里的 yaml 配置并且实现重用以便统一结果, 我自己开发了一个工具 dukkha, 但是目前还没有实际用到生产环境中 (项目地址: https://github.com/arhat-dev/dukkha )

    对应到你的需求可以用 dukkha 这么管理:

    首先给不同环境创建 host-alias.yml 文件

    production 环境: inventory/production/host-alias.yml

    ```yaml
    - hostnames:
    - production-foo
    ip: ...
    ```

    dev 环境: inventory/dev/host-alias.yml

    ```yaml
    - hostnames:
    - dev-foo
    ip: ...
    ```

    ```yaml
    apiVersion: v1
    kind: Pod
    spec:
    hostAliases@env|file: inventory/${ENVIRONMENT}/host-alias.yml
    ```

    把目录结构建好, 然后在不同环境里面设置好 ENVIRONMENT 变量 (production/dev) 即可使用 `dukkha render` 进行渲染

    有进一步了解需求的话, 可以看项目里的文档, 应该是够用的

    另外如果想深入讨论相关内容的, 欢迎邮件到 aW5xdWlyaWVzQGFyaGF0LnNvbHV0aW9ucw== , 内容需要注明 v2 用户名以及一个可交叉验证身份的第三方平台链接 (如 github 用户链接)
    locoz
        7
    locoz  
       2021-10-29 20:07:19 +08:00 via Android
    试试 flux ?虽然我只有一个环境,但是按官方文档的说法是方便管理多环境用的。
    huangmingyou
        8
    huangmingyou  
    OP
       2021-10-29 21:13:59 +08:00
    @jeffreystoke 看上去不错,我研究研究
    huangmingyou
        9
    huangmingyou  
    OP
       2021-10-29 21:14:32 +08:00
    @locoz 不错的项目,先看看
    huangmingyou
        10
    huangmingyou  
    OP
       2021-10-29 21:21:27 +08:00
    @locoz 看了一下,这个工具对我的需求来说太重了,这看上去是一个野心很大的工具,啥都想管,而且有点类似 ansible 的思路,让配置和运行状态保持同步。
    huangmingyou
        11
    huangmingyou  
    OP
       2021-10-29 21:38:19 +08:00
    @jeffreystoke 用下面的命令测试一下,KENV=pro dukkha render my.yml ;
    符合预期,具体到 k8s 的场景,我还的研究下怎么组织文件,可能需要组合 4 ,5 个文件。 看上去比较方便,似乎还能支持执行脚本?
    jeffreystoke
        12
    jeffreystoke  
       2021-10-29 22:15:15 +08:00 via Android
    @huangmingyou 是的,还支持从远程 http 服务拉取配置,以及 git ssh 仓库抽取配置( renderer 文档部分)
    RedrumSherlock
        13
    RedrumSherlock  
       2021-10-29 23:38:34 +08:00 via Android
    我们是主用 helm 的,单个 helm chart 通用的放 values.yaml ,随环境变化的放各自 profile 的 values.yaml ,多个 chart 公用的通过环境变量用 helm 的 set 来做,目前体验还行
    zqcolor
        14
    zqcolor  
       2021-10-30 00:01:44 +08:00
    argocd + helm
    plko345
        15
    plko345  
       2021-10-30 00:51:58 +08:00 via Android
    helm 完全能解决你的问题
    huangmingyou
        16
    huangmingyou  
    OP
       2021-10-30 08:36:05 +08:00
    对于企业内部部署,能管理生成 yaml 基本够用了,用 helm 感觉有点重,每次一看 helm 文档,就看到大堆的文件需要定义就头大。
    37Y37
        17
    37Y37  
       2021-10-30 09:15:13 +08:00
    我们全部给做成系统了,任务系统,通过不同变量(环境 /项目)动态创建,https://blog.ops-coffee.cn/s/U88HPUYiVDar-7yBx3IoIA
    zhaoyeye
        18
    zhaoyeye  
       2021-10-31 02:52:33 +08:00 via Android
    @vast0906 老哥给个链接指导下,我们也准备这么做,但是没有一点思路。
    vast0906
        19
    vast0906  
       2021-11-01 09:08:04 +08:00
    @zhaoyeye deployment 之类的写到 template 里面,不同应用拥有自己的 vars.json ,在执行 playbook 的时候 -e 选择相对应的 vars.json
    huangmingyou
        20
    huangmingyou  
    OP
       2021-11-01 09:23:04 +08:00
    @vast0906 var 文件可以用多个吗,例如把项目的 var 和环境的 var 带入到 templte . 能发一下文件目录的组织结构例子吗?
    cheng6563
        21
    cheng6563  
       2021-11-01 09:39:14 +08:00
    直接写 k8s 的 yml 。然后 jenkins 部署时用 yq 脚本修改更新。
    vast0906
        22
    vast0906  
       2021-11-01 14:04:52 +08:00
    @huangmingyou
    ```
    groups/xxx
    ├── hosts
    │   ├── prod
    │   └── test
    └── vars
    ├── prod.json
    └── test.json
    ```

    ├── base
    │   ├── tasks
    │   │   └── main.yml
    │   └── templates
    │   └── deployment.yml.j2

    ingress svc pvc 之类的 按照 deployment.yml.j2 这种来写
    huangmingyou
        23
    huangmingyou  
    OP
       2021-11-01 15:34:23 +08:00
    @vast0906 谢谢!
    xabcstack
        24
    xabcstack  
       2021-11-02 18:55:48 +08:00
    推荐一下 https://github.com/ywgx/ki 这个管理多个 k8s 的利器
    zhaoyeye
        25
    zhaoyeye  
       2021-11-02 21:54:24 +08:00 via Android
    @vast0906 好的 多谢建议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1146 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:14 · PVG 02:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.