[英]How to properly set bearer API token as an environment variable in K8 pod
我有一个大问题,我会尽量简短地解释。 我正在端点上运行 cronjob,并希望将该过程容器化。 端点需要设置一些环境变量,并且显然需要一个TOKEN
身份验证,这基本上是登录,然后我才能 curl POST 或 GET 从 API 获得我想要的东西。 棘手的部分是 TOKEN 永远不会相同,这意味着我需要运行 curl 命令才能在 pod 运行时获取它。 为了确保这些环境变量在运行时存在,我在 cronjob args 字段中注入了一个命令以使其保持运行。 当我 ssh 到 pod 时,我所有的 env var 都在那里;)但是TOKEN
:(。当我从 pod 内部运行./run.sh
时没有任何反应,这就是 TOKEN 未列在printenv
中的原因。但是当我看到从cmd
内部手动运行command 1
然后command 2
工作正常。我很困惑,请帮助我可以使用多行块标量从我的 cronjob.yaml 中的run.sh
解析command 1
和command 2
,但还没有弄清楚 yaml 格式是怎样的痛苦。下面是我的代码以获取更多详细信息:
docker-entrypoint.sh --> 移除
#! /bin/sh
export AWS_REGION=$AWS_REGION
export API_VS_HD=$API_VS_HD
export CONTROLLER_IP=$CONTROLLER_IP
export PASSWORD=$PASSWORD
export UUID=$UUID
Dockerfile
FROM harbor/ops5/private/:device-purge/python38:3.8
# Use root user for packages installation
USER root
# Install packages
RUN yum update -y && yum upgrade -y
# Install curl
RUN yum install curl -y \
&& curl --version
# Install zip/unzip/gunzip
RUN yum install zip unzip -y \
&& yum install gzip -y
# Install wget
RUN yum install wget -y
# Install jq
RUN wget -O jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
RUN chmod +x ./jq
RUN cp jq /usr/bin
# Install aws cli
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install
# Set working directory
WORKDIR /home/app
# Add user
RUN groupadd --system user && adduser --system user --no-create-home --gid user
RUN chown -R user:user /home/app && chmod -R 777 /home/app
# Copy app
COPY ./run.sh /home/app
RUN chmod +x /home/app/run.sh
# Switch to non-root user
USER user
# Run service
CMD ["sh", "-c", "./run.sh"]
运行.sh
# Command 1
export TOKEN=`curl -H "Content-Type: application/json" -H "${API_VS_HD}" --request POST --data "{\"providerName\":\"local\",\"username\":\"admin\",\"password\":\"$PASSWORD\",\"deviceId\":\"$UUID\"}" https://$CONTROLLER_IP:444/admin/login --insecure | jq -r '.token'`
# Sleep
sleep 3
# Command 2
curl -k -H "Content-Type: application/json" \
-H "$API_VS_HD" \
-H "Authorization: Bearer $TOKEN" \
-X GET \
https://$CONTROLLER_IP:444/admin/license/users
cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: device-cron-job
namespace: device-purge
spec:
schedule: "*/2 * * * *" # test
jobTemplate:
spec:
template:
spec:
imagePullSecrets:
- name: cron
containers:
- name: device-cron-pod
image: harbor/ops5/private/:device-purge
env:
- name: AWS_REGION
value: "us-east-1"
- name: API_VS_HD
value: "Accept:application/vnd.appgate.peer-v13+json"
- name: CONTROLLER_IP
value: "52.61.245.214"
- name: UUID
value: "d2b78ec2-####-###-###-#########"
- name: PASSWORD
valueFrom:
secretKeyRef:
name: password
key: password
imagePullPolicy: Always
restartPolicy: OnFailure
backoffLimit: 3
run.sh
永远不会被调用。 docker-entrypoint.sh
需要通过在底部添加exec $@
来执行run.sh
但是无论如何,您实际上并不需要入口点,这些环境变量已经由 docker 导出到您的环境中。 我也不确定您为什么在 yaml 规范中指定command
和args
,但我会摆脱这些。
当您以这种形式提供ENTRYPOINT
和CMD
命令时, CMD
参数将传递给入口点文件,然后该文件负责执行必要的过程。 您可以在此处查看文档。
似乎您的自定义入口点正在阻止run.sh
运行,并且脚本本身没有指定解释器。
你可以试试:
#Switch back to default entrypoint
ENTRYPOINT ["/bin/sh"]
#Actually run run.sh
# NOTE THE INITIAL dot (.) after "-c"
CMD ["-c",". docker-entrypoint.sh && ./run.sh"]
并删除 k8s CronJob command
和相关args
(您也可以在 CronJob yaml 中实现相同的操作,但我更喜欢让容器准备好完成工作,而不是在 k8s 级别指定 CMD。
您还可以通过/bin/sh
指示如何在第一行运行它并在那里导入环境变量来使run.sh
更容易运行(我想这就是为什么当您键入./run.sh
时它不运行的原因):
#!/bin/sh
# Note the initial dot '.'
. docker-entrypoint.sh
# Command 1
[...]
# Command 2
[...]
另一个建议是在 k8s CronJob yaml 级别定义docker-entrypoint.sh
中定义的环境变量。 这被认为是在 k8s pod 中定义环境变量的最佳实践。 当变量的值敏感时,您可以使用 k8s 机密。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.