如何在K8S集群中从Pod的容器创建秘密? [英] How to create a secret in the k8s cluster from a pod's container?

查看:12
本文介绍了如何在K8S集群中从Pod的容器创建秘密?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用带有2个子图表apptest的Helm图表在Kubernetes中部署我的应用程序。

我已使app图表的Pod正常运行。 但是testPod只有在能够正确通过app容器的身份验证后才会运行。

这意味着,我必须使用对app服务的cURL请求生成auth_token,然后将该内标识添加为test容器的环境变量AUTH_TOKEN

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

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

  • 为上面提到的相同设置添加了一个侧车容器sidecar-generate-token,而不是初始容器。这里还有一个问题,test容器没有通过读取共享卷来为容器设置env的代码。此外,测试吊舱进入了碰撞回退状态。如果通过进入容器来检查卷的内容,则在每次崩溃环回的Pod重启时,卷文件中都会生成多个令牌。

  • 第三个计划是init-tainergenerate-token应该在生成auth_Token之后在集群中创建一个Kubernetes秘密。然后,主容器test可以从该机密设置环境变量。为此,init容器generate-token应该首先在其中设置kubectl。

如果我继续第三个计划,我如何从init-tainer设置和使用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: {}   

推荐答案

正在尝试回答您的问题:

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

让我们尝试从其他容器中读取此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>>

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

这篇关于如何在K8S集群中从Pod的容器创建秘密?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆