【问题标题】:How to create a secret in the k8s cluster from a pod's container?如何从 pod 的容器中创建 k8s 集群中的秘密?
【发布时间】:2021-07-10 16:02:51
【问题描述】:

我正在使用带有 2 个子图表 app 和 test 的 helm chart 在 kubernetes 中部署我的应用程序。

我有app 图表的窗格正常运行。 但是test pod 只有在能够正确验证到app 容器时才会运行。

这意味着,我必须使用 curl 请求生成一个 auth_token app 服务,然后将该令牌添加为环境变量 AUTH_TOKEN 用于 test 容器。

我尝试了不同的方法来实现这一点:

  • 为test pod 添加了一个初始化容器generate-token,它将生成令牌并将其保存在共享卷中。 test 容器将有权访问该卷。但这里的问题是,test 容器没有通过从共享卷读取来设置容器环境的代码。

  • 为上述相同设置添加了一个边车容器sidecar-generate-token,而不是一个初始化容器。这里还有一个问题是,test 容器没有代码来通过从共享卷中读取来设置容器的环境。而且,测试 pod 进入了 crashloopbackoff 状态。如果通过进入容器查看volume的内容,volume文件中有多个token,这些token是在每次crashloopbackoff的pod重启时生​​成的。

  • 第三个计划是 init-container generate-token 应该在生成 auth_token 后在集群中创建一个 kubernetes 机密。然后主容器test 可以根据该密钥设置环境变量。为此,init 容器 generate-token 应该首先在其中设置 kubectl。

如果我正在执行第三个计划,我该如何设置和使用来自 init-container 的 kubectl 在集群中生成秘密?

是否有其他替代计划来实现这一目标?

编辑:


这是第一个选项的 yaml 部分:

  initContainers:
    - name: generate-service-token
      image: app.mycr.io/alpine-network-troubleshooting:dev-latest
      command:
      - /bin/sh
      - -c
      - |
        BEARER_TOKEN=$(curl -k -X POST -H "Content-Type:application/json" --data '{"user":"dynizer","password":"xxxx"}' "https://app:50051/api/v2/login" | jq -r '.jwt')
        SERVICE_TOKEN=$(curl -k -X GET -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "https://app:50051/api/v2/servicetoken/issue" | jq -r '.token')
        echo $SERVICE_TOKEN
        mkdir -p /vol
        touch /vol/token.txt
        echo $SERVICE_TOKEN >> /vol/token.txt
      volumeMounts:
        - mountPath: /vol
          name: token-vol    
  containers:              
    - name: nginx-container
      image: nginx
      volumeMounts:
      - name: token-vol
        mountPath: /vol                                             
  volumes:
    - name: token-vol
      emptyDir: {}   

【问题讨论】:

  • 第一点似乎应该可行。 crashloopbackoff 很可能是由错误配置的 pod 引起的。你能提供yaml文件吗?
  • @Matt 抱歉,现在使用边车容器时会发生 crashloopbackoff,我编辑了问题。我会在那里提供yaml。但是容器没有通过从共享卷读取来设置 env 的代码的问题仍然存在。

标签: kubernetes environment-variables containers kubectl kubernetes-secrets


【解决方案1】:

试图回答你的问题:

但容器没有通过从共享卷读取设置 env 的代码的问题仍然存在。

让我们尝试从其他容器中读取这个环境。这是我想出的。

首先您需要知道您的容器正在运行什么命令。如果 nginx 是 /docker-entrypoint.sh nginx -g "daemon off;" (source code)

然后您使用command 字段从文件中读取令牌值并使用env 设置它并运行实际应用程序。

例子:

  initContainers:
    - name: generate-service-token
      image: app.mycr.io/alpine-network-troubleshooting:dev-latest
      command:
      - /bin/sh
      - -c
      - |
        BEARER_TOKEN=$(curl -k -X POST -H "Content-Type:application/json" --data '{"user":"dynizer","password":"xxxx"}' "https://app:50051/api/v2/login" | jq -r '.jwt')
        SERVICE_TOKEN=$(curl -k -X GET -H 'Accept: application/json' -H "Authorization: Bearer ${BEARER_TOKEN}" "https://app:50051/api/v2/servicetoken/issue" | jq -r '.token')
        echo $SERVICE_TOKEN
        mkdir -p /vol
        touch /vol/token.txt
        echo $SERVICE_TOKEN >> /vol/token.txt
      volumeMounts:
        - mountPath: /vol
          name: token-vol    
  containers:              
    - name: nginx-container
      image: nginx
      command:
      - sh
      - -c
      - exec env SERVICE_TOKEN=$(cat /vol/token.txt) /docker-entrypoint.sh nginx -g "daemon off;"
      volumeMounts:
      - name: token-vol
        mountPath: /vol                                             
  volumes:
    - name: token-vol
      emptyDir: {}   

更一般的例子:

  command:
  - sh
  - -c
  - exec env SERVICE_TOKEN=$(cat /vol/token.txt) <<any command>>

我不确定这是否是最好的例子,但我希望它至少能让您了解如何解决这个问题。

【讨论】:

  • 感谢您的努力。我试过这个。但是当我尝试在 pod 中执行并尝试echo $SERVICE_TOKEN 时,不会打印该值。这意味着,未设置 env 。正确的?我的实际图像不是 nginx,但它的行为也像是找不到环境。
  • 您没有提到任何关于执行到 pod 中的内容。我虽然你想要做的就是使用 SERVICE_TOKEN env 启动主进程。 kubectl exec 看不到变量。
  • kubectl exec 创建额外的 shell 进程,其中不包括为主容器 shell 进程设置的变量。如果您将echo $VARIABLE_NAME 添加到主容器shell 命令,然后检查该容器的kubectl logs,您应该会在那里看到变量值。要在exec 进程中设置此变量,您应该在运行exec shell 时包含相同的env SERVICE_TOKEN=$(cat /vol/token.txt) 命令。
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2019-09-25
  • 1970-01-01
  • 2020-08-18
  • 2021-02-19
  • 2019-12-26
相关资源
最近更新 更多