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

K8S 如何做到通知 deployment 下的所有 pod?

  •  1
     
  •   sniperking1234 · 240 天前 · 1979 次点击
    这是一个创建于 240 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的程序里面需要有一个更新配置的动作,如果在多副本的情况下,怎么能通知到所有 Pod 中的程序都执行更新配置呢?如果用 http 的方式的话,肯定只能请求到其中 1 个 pod 上,不清楚 K8S 本身是否有机制或者技巧来通知所有 deployment 下的 pod

    第 1 条附言  ·  240 天前
    这里的配置可以理解为一系列的规则,存放到数据库里面,会比较大(超过 100m )。从数据库中读取到内存里面使用的时候是。所以当数据库中的配置更新的时候,我希望所有的 pod 能知道数据库更新了,然后读取数据库更新内存。所以 configmap 、secret 之类的方法就不适用了。
    24 条回复    2023-09-02 14:44:07 +08:00
    GeekGao
        1
    GeekGao  
       240 天前
    x-y problem.
    Achilless
        2
    Achilless  
       240 天前
    这种场景不是应该有配置中心吗
    Achilless
        3
    Achilless  
       240 天前
    或者自带的 configmap
    mritd
        4
    mritd  
       240 天前
    1 、首先确定你的配置加载方式
    2 、如果采用外部动态配置一般通过 配置中心 进行动态加载
    3 、如果采用物理文件打包到镜像里, 推荐直接发版本进行滚动更新
    4 、不要尝试在没有完整可追溯链路的情况下去更新敏感资源, 出问题你没法排查, 背锅妥妥的
    Marinaaaa
        5
    Marinaaaa  
       240 天前
    一般来说是使用配置中心之类的。

    应用启动的时候会自动注册到配置中心,所有的配置也都是在配置中心管理,一旦配置修改,会通知所有在线的应用更新。

    不太确定你的更新配置这个动作是在哪里?
    ----

    然后就是 k8s 获取 deploy 下的所有 pod 这个肯定是有的, 可以搜下 client-go ,里面有 Pods().LIST() , 用 LabelSelector 搜索 app=deploy-name 应该就可以的。
    xiaooloong
        6
    xiaooloong  
       240 天前
    「肯定只能请求到其中 1 个 pod 上」
    xiaooloong
        7
    xiaooloong  
       240 天前
    「肯定只能请求到其中 1 个 pod 上」这肯定是请求的 Service 。用 Endpoint 吧,所有的 IP 都有。
    lidashuang
        8
    lidashuang  
       240 天前
    pod 环境变量里读取配置

    用 configmap 或者 secret

    pod 重启就行
    ss098
        9
    ss098  
       240 天前
    使用 helm 的话可以考虑使用 configmap hashing 作为 deployment 的 annotations

    https://stackoverflow.com/questions/54579641/does-helm-upgrade-on-a-configmap-automatically-inject-new-data-into-running-pod
    cheng6563
        10
    cheng6563  
       240 天前
    写个 k8s 控制器呗,随便问问 AI 就知道了。
    sniperking1234
        11
    sniperking1234  
    OP
       240 天前
    @GeekGao
    @Achilless
    @mritd
    @Marinaaaa
    @lidashuang
    @ss098
    这里面的配置不是大家理解应用的配置,可以理解为一系列的规则,存放到数据库里面,可能会比较大(比如 100m )。在使用的时候是从数据库中读取到内存里面。当数据库更新的时候,我希望所有的 pod 能知道数据库更新了,然后读取数据库更新内存。所以 configmap 、secret 之类的方法就不适用了。
    wzcloud
        12
    wzcloud  
       240 天前
    spring-cloud-kubernetes, 可以做到热加在 configmap.
    rrfeng
        13
    rrfeng  
       240 天前 via Android   ❤️ 1
    为啥 configmap 就不适用了??太大?你可以只放个版本号啊…
    sniperking1234
        14
    sniperking1234  
    OP
       240 天前
    @wzcloud 刚刚 append 了一下问题,configmap 不适用😂
    sniperking1234
        15
    sniperking1234  
    OP
       240 天前
    @rrfeng 容我想想,这样好像可以
    fcfangcc
        16
    fcfangcc  
       240 天前
    存 ETCD ,然后所有应用 WATCH 这个 key
    Masoud2023
        17
    Masoud2023  
       240 天前
    zookeeper ? etcd ? nacos ?
    blessingsi
        18
    blessingsi  
       240 天前
    zk/etcd 的 watch 机制
    GOOD21
        19
    GOOD21  
       240 天前
    pub/sub
    zaunist
        20
    zaunist  
       239 天前
    k8s 是靠 watch 资源变更实现的,不过你这个大于 100M 的配置文件,多少有点过于离谱了,这得多少配置项了。。。
    dayeye2006199
        21
    dayeye2006199  
       239 天前 via Android
    直接滚动更新整个 deployment ,大家自己去读配置不行吗?
    mritd
        22
    mritd  
       239 天前
    @sniperking1234 这种可以推荐用个队列 mq 啥的, 或者 etcd 弄个 watch 之类的
    lidashuang
        23
    lidashuang  
       239 天前
    @sniperking1234 挂个 nfs,自己 程序处理
    julyclyde
        24
    julyclyde  
       238 天前
    我觉得不应该对“活体 pod”进行变更操作
    如果其中之一故障了,被自动补齐,新启动的这个 pod 就会被通知机制漏掉了

    我觉得还是应该更新 deployment 的 image ,或者各 pod 自行 pull 新的配置
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2806 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:09 · PVG 20:09 · LAX 05:09 · JFK 08:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.