liunaijie
V2EX  ›  问与答

k8s 使用 statefulset 如何在 pod 内获取序号并设置到环境变量里

  •  
  •   liunaijie · Oct 23, 2020 · 3924 views
    This topic created in 2068 days ago, the information mentioned may be changed or developed.

    如题,使用 statefulset,需要为每个 pod 中的配置文件配置不同的值,比如在 pod1 里面的值是 value1,pod2 里面的值是 value2 。 可以创建多个 configmap 来挂载,但是我想使用一个 configmap 然后使用动态替换的方式。

    所以想在 stateful-pod-0 中获取 0,然后将其设置为环境变量,在 stateful-pod-1 中获取 1 将其设置为环境变量。配置文件通过读取环境变量为其赋值。

            env:
              - name: REPLICA
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: SHARD
                value: $(REPLICA##*-) ## get the statefulset pod index, like stateful-0, get 0
    

    我也用其他方法尝试过,比如在启动到时候运行命令,但是这个时候 pod 就起不来了

            command: ["/bin/sh", "-c", "export SHARD=${HOSTNAME##*-}"]
    

    有没有大佬了解这种情况要怎么设置

    Supplement 1  ·  Oct 23, 2020
    我最终是在 initContainer 里面用一个脚本,读取 hostname 即 statefulset 产生的 pod 全称,然后又截取序号。将他们写入到配置文件中,
    container 同样挂载这个路径,再指定下这个生成的配置文件路径。
    6 replies    2020-10-23 17:54:11 +08:00
    acrisliu
        1
    acrisliu  
       Oct 23, 2020
    用 InitContainer 读取 HOSTNAME 再写入对应的配置文件?
    zhenjiachen
        2
    zhenjiachen  
       Oct 23, 2020
    同求,我也想知道,搜了一圈没有啥好的解决方案
    JeromeCui
        3
    JeromeCui  
       Oct 23, 2020
    有个环境变量:HOSTNAME=microservice-discovery-0,最后那个 0 就是序号
    你可以读这个变量的值或者是读文件 /etc/hostname
    slowman
        4
    slowman  
       Oct 23, 2020
    @JeromeCui 是这,我们也有这么用
    liunaijie
        5
    liunaijie  
    OP
       Oct 23, 2020
    @JeromeCui 是的,可以读到这个 hostname,但是要截取后面的序号,没法在 env 里面做转换
    zzzbkl
        6
    zzzbkl  
       Oct 23, 2020 via Android
    看看 k8s downward API 是不是你想要的?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   881 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 21:19 · PVG 05:19 · LAX 14:19 · JFK 17:19
    ♥ Do have faith in what you're doing.