如何在K8S集群中从Pod的容器创建秘密? [英] How to create a secret in the k8s cluster from a pod's container?
问题描述
我正在使用带有2个子图表app
和test
的Helm图表在Kubernetes中部署我的应用程序。
app
图表的Pod正常运行。
但是test
Pod只有在能够正确通过app
容器的身份验证后才会运行。
这意味着,我必须使用对app
服务的cURL请求生成auth_token
,然后将该内标识添加为test
容器的环境变量AUTH_TOKEN
。
我尝试了不同的方法来实现这一点:
为
test
pod添加了初始化容器generate-token
,它将生成令牌并将其保存在共享卷中。和test
容器将可以访问该卷。但这里的问题是,test
容器没有通过读取共享卷来设置容器环境的代码。为上面提到的相同设置添加了一个侧车容器
sidecar-generate-token
,而不是初始容器。这里还有一个问题,test
容器没有通过读取共享卷来为容器设置env的代码。此外,测试吊舱进入了碰撞回退状态。如果通过进入容器来检查卷的内容,则在每次崩溃环回的Pod重启时,卷文件中都会生成多个令牌。第三个计划是init-tainer
generate-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屋!