【问题标题】:How to pass args to pods based on Ordinal Index in StatefulSets?如何根据 StatefulSets 中的序数索引将 args 传递给 pod?
【发布时间】:2017-06-03 13:42:18
【问题描述】:

是否可以根据它们在 StatefulSets 中的序数索引将不同的参数传递给 pod?在 StatefulSets 文档中找不到答案。谢谢!

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    推荐方式,见https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/#statefulset

    # Generate server-id from pod ordinal index.
    
    [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
    ordinal=${BASH_REMATCH[1]}
    
    # ${ordinal} now holds the replica number
    
    server-id=$((100 + $ordinal))
    
    # Copy appropriate conf.d files from config-map to emptyDir.
    if [[ $ordinal -eq 0 ]]; then
      # do something
    else
      # do something else
    fi
    

    【讨论】:

    • 给读者的备注:这是在 official 文档中的 :)(因此恕我直言,这是官方建议的)
    【解决方案2】:

    我不知道有什么方法可以做到这一点,但我知道一种可行的方法。首先,StatefulSet 中的每个 pod 都有一个唯一的可预测名称。它可以通过the downward API 或仅通过调用hostname 来发现该名称。因此,我将 shell 脚本作为容器的入口点,该脚本获取它的 pod/主机名。从那里它使用适用于特定主机的命令行参数调用“真正的”可执行文件。

    例如,我的一个脚本希望通过向下 api 将 pod 名称映射到环境中为 POD_NAME。然后它会执行以下操作:

    #!/bin/bash
    
    pet_number=${POD_NAME##*-}
    
    if [ pet_number == 0 ]
    then
       # stuff here
    fi
    
    # etc.
    

    【讨论】:

      【解决方案3】:

      我发现少了一种hacky 使用生命周期挂钩将序数索引传递到容器的方法

        containers:
        - name: cp-kafka
          imagePullPolicy: Always
          image: confluentinc/cp-kafka:4.0.0
          resources:
            requests:
              memory: "2Gi"
              cpu: 0.5
          ports:
          - containerPort: 9093
            name: server
            protocol: TCP
          lifecycle:
            postStart:
              exec:
                command: ["/bin/sh", "-c", "export KAFKA_BROKER_ID=${HOSTNAME##*-}"]
          env:
            - name: KAFKA_ZOOKEEPER_CONNECT
              value: zk-cs.default.svc.cluster.local:2181
            - name: KAFKA_ADVERTISED_LISTENERS
              value: PLAINTEXT://localhost:9093
      

      【讨论】:

      • 这仍然有点hacky:根据documentation,不能保证postStart钩子会在入口点之前启动。 “Kubernetes 在 Container 创建后立即发送 postStart 事件。但是,不能保证在调用 Container 的入口点之前调用 postStart 处理程序。”
      【解决方案4】:

      如果您想跟踪此进度,此功能的相关票证在这里:https://github.com/kubernetes/kubernetes/issues/30427

      该提议涉及将序号作为标签放在 pod 上,然后使用向下的 api 将其拉出到环境变量或其他东西中。

      【讨论】:

        【解决方案5】:

        您可以通过使用HOSTNAME 来避免使用 Downward API:

        command:
        - bash
        - c
        - |
          ordinal=${HOSTNAME##*-}  
          if [[ "$ordinal" = "0" ]]; then
            ...
          else
            ...
          fi 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-01
          • 2019-06-25
          • 1970-01-01
          • 1970-01-01
          • 2020-08-27
          • 2011-04-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多