【发布时间】:2021-07-10 16:02:51
【问题描述】:
我正在使用带有 2 个子图表 app 和 test 的 helm chart 在 kubernetes 中部署我的应用程序。
我有app 图表的窗格正常运行。
但是test pod 只有在能够正确验证到app 容器时才会运行。
这意味着,我必须使用 curl 请求生成一个 auth_token app 服务,然后将该令牌添加为环境变量 AUTH_TOKEN 用于 test 容器。
我尝试了不同的方法来实现这一点:
-
为
testpod 添加了一个初始化容器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