繁体   English   中英

如何在 K8 pod 中正确设置不记名 API 令牌作为环境变量

[英]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 1command 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 规范中指定commandargs ,但我会摆脱这些。

当您以这种形式提供ENTRYPOINTCMD命令时, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM