liunaijie
V2EX  ›  问与答

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

  •  
  •   liunaijie · Oct 23, 2020 · 4384 views
    This topic created in 2208 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
    acrisliu
    Oct 23, 2020
    1
    用 InitContainer 读取 HOSTNAME 再写入对应的配置文件?
    zhenjiachen
    zhenjiachen
    Oct 23, 2020
    2
    同求,我也想知道,搜了一圈没有啥好的解决方案
    JeromeCui
    JeromeCui
    Oct 23, 2020
    3
    有个环境变量:HOSTNAME=microservice-discovery-0,最后那个 0 就是序号
    你可以读这个变量的值或者是读文件 /etc/hostname
    slowman
    slowman
    Oct 23, 2020
    4
    @JeromeCui 是这,我们也有这么用
    liunaijie
    liunaijie
    OP
    Oct 23, 2020
    5
    @JeromeCui 是的,可以读到这个 hostname,但是要截取后面的序号,没法在 env 里面做转换
    zzzbkl
    zzzbkl
    Oct 23, 2020 via Android
    6
    看看 k8s downward API 是不是你想要的?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1911 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 15:41 · PVG 23:41 · LAX 07:41 · JFK 10:41
    ♥ Do have faith in what you're doing.