【问题标题】:Replication Controller replica ID in an environment variable?环境变量中的复制控制器副本 ID?
【发布时间】:2019-02-22 16:17:20
【问题描述】:

我正在尝试将 ReplicationController 的随机生成的 pod ID 扩展(即multiverse-{replicaID})注入到容器的环境变量中。我可以手动获取主机名并从那里提取它,但由于兼容性原因,我希望不必将特殊情况添加到容器内运行的脚本中。

如果一个 pod 被命名为 multiverse-nffj1INSTANCE_ID 应该等于 nffj1。我搜索了文档,但一无所获。

apiVersion: v1
kind: ReplicationController
metadata:
  name: multiverse
spec:
  replicas: 3
  template:
    spec:
      containers:
      - env:
        - name: INSTANCE_ID
          value: $(replicaID)

我尝试将command 添加到控制器的模板配置中以从主机名创建环境变量,但不知道如何使该环境变量可用于正在运行的脚本。

是否存在我缺少的变量,或者此功能不存在?如果没有,是否有人对如何在不编辑容器内的脚本的情况下使其工作有任何想法?

【问题讨论】:

  • 对于“不编辑脚本”部分,您是否愿意劫持command: 将其转换为command: ["/bin/bash", "-c", "...; exec /dockerfile-entrypoint.sh"],以便它仍然运行脚本未修改但运行您的脚本首先?
  • 理论上可行。老实说,似乎有点hacky。除非有真正的解决方案,否则我会暂时这样做。
  • 据我所知,没有可以从清单中执行的“可执行”操作;您可以访问一些元数据字段,但它们都不包含您正在寻找的东西(再次,AFAIK)

标签: kubernetes


【解决方案1】:

Anton Kostenko 提供了一个answer,关于将数据库凭据插入容器环境变量,但它也可以应用于您的情况。这都是关于 InitContainer 规范的内容。

您可以使用InitContainer 从容器的主机名中获取哈希,并将其放入您挂载到容器的共享卷上的文件中。

本例中InitContainer将Pod名称放入INSTANCE_ID环境变量中,但你可以根据需要修改:

使用内容创建 init.yaml 文件:

apiVersion: v1
kind: Pod
metadata:
  name: init-test
spec:
  containers:
  - name: init-test
    image: ubuntu
    args: [bash, -c, 'source /data/config && echo $INSTANCE_ID && while true ; do sleep 1000; done ']
    volumeMounts:
    - name: config-data
      mountPath: /data
  initContainers:
  - name: init-init 
    image: busybox
    command: ["sh","-c","echo -n INSTANCE_ID=$(hostname) > /data/config"]
    volumeMounts:
    - name: config-data
      mountPath: /data
  volumes:
  - name: config-data
    emptyDir: {}

使用以下命令创建 pod:

kubectl create -f init.yaml

检查 Pod 初始化是否完成并正在运行:

kubectl get pod init-test

检查日志以查看此示例配置的结果:

$ kubectl logs init-test
init-test

【讨论】:

    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 2023-03-11
    • 2017-06-17
    • 2016-02-17
    • 2015-12-18
    • 1970-01-01
    • 2016-09-25
    • 2013-02-05
    相关资源
    最近更新 更多