如何在K8s CronJob中先获取Auth Token并传递客户端信息后调用API?
在K8s CronJob中先获取Token再调用目标服务的实现方案
完全可以实现先调用Token服务获取凭证,再发起目标服务请求的逻辑,同时也能灵活传入客户端信息,下面是具体的实现方法:
一、实现先获取Token再调用目标服务
核心是把两次请求的逻辑整合到同一个Shell命令中,利用Shell变量暂存Token,再用于后续请求。你原来的配置中把两个curl命令分开写会导致容器只执行第一个命令,需要合并成一个多行Shell脚本:
apiVersion: batch/v1 kind: CronJob metadata: name: api-call-job spec: schedule: "* * * * *" jobTemplate: spec: suspend: false backoffLimit: 2 template: spec: containers: - name: api-client image: nightfury1204/alpine-curl imagePullPolicy: IfNotPresent command: - /bin/sh - -c - | # 从Token服务获取凭证,这里假设返回JSON格式{"token": "xxx"} TOKEN=$(curl -s http://TokenService | awk -F'"' '/token/{print $4}') # 携带Token调用目标服务 curl http://TaskService -H "Authorization:Bearer $TOKEN" restartPolicy: OnFailure
说明:
- 用
- |开启多行Shell脚本,方便编写多步逻辑; - 如果Token服务返回纯文本格式的Token,直接用
TOKEN=$(curl -s http://TokenService)即可; - 如果需要更复杂的JSON解析,可换用包含
jq的镜像(比如alpine/curl-jq),或在脚本开头添加apk add --no-cache jq安装工具,再用jq '.token'提取Token。
二、传入客户端信息的几种方式
根据客户端信息的敏感程度,可选择以下方式传入:
1. 环境变量注入(推荐)
- 非敏感信息(如
client_id)可直接在配置中定义,敏感信息(如client_secret)用Secret存储后引用:
第一步:创建存储敏感信息的Secret
kubectl create secret generic token-client-secret --from-literal=client_secret=your_actual_secret
第二步:修改CronJob配置,添加环境变量
apiVersion: batch/v1 kind: CronJob metadata: name: api-call-job spec: schedule: "* * * * *" jobTemplate: spec: suspend: false backoffLimit: 2 template: spec: containers: - name: api-client image: nightfury1204/alpine-curl imagePullPolicy: IfNotPresent env: - name: CLIENT_ID value: "your_client_id" # 非敏感信息直接配置 - name: CLIENT_SECRET valueFrom: secretKeyRef: name: token-client-secret key: client_secret command: - /bin/sh - -c - | # 携带客户端信息请求Token TOKEN=$(curl -s -X POST http://TokenService -d "client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET") curl http://TaskService -H "Authorization:Bearer $TOKEN" restartPolicy: OnFailure
2. 挂载ConfigMap/Secret文件
如果客户端信息较多,可将其存入ConfigMap(非敏感)或Secret(敏感),挂载为容器内的文件,再在脚本中读取:
第一步:创建ConfigMap和Secret
# 存储非敏感的客户端配置 kubectl create configmap token-client-config --from-literal=client_id=your_client_id # 存储敏感密钥(已创建过可跳过) kubectl create secret generic token-client-secret --from-literal=client_secret=your_actual_secret
第二步:修改CronJob配置,挂载文件
apiVersion: batch/v1 kind: CronJob metadata: name: api-call-job spec: schedule: "* * * * *" jobTemplate: spec: suspend: false backoffLimit: 2 template: spec: containers: - name: api-client image: nightfury1204/alpine-curl imagePullPolicy: IfNotPresent volumeMounts: - name: client-config mountPath: /etc/client-config - name: client-secret mountPath: /etc/client-secret command: - /bin/sh - -c - | # 从挂载的文件中读取客户端信息 CLIENT_ID=$(cat /etc/client-config/client_id) CLIENT_SECRET=$(cat /etc/client-secret/client_secret) TOKEN=$(curl -s -X POST http://TokenService -d "client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET") curl http://TaskService -H "Authorization:Bearer $TOKEN" volumes: - name: client-config configMap: name: token-client-config - name: client-secret secret: secretName: token-client-secret restartPolicy: OnFailure
3. 手动触发Job时临时传入参数
如果需要每次手动触发Job时使用不同的客户端信息,可在创建Job时覆盖环境变量:
kubectl create job --from=cronjob/api-call-job manual-api-job --env="CLIENT_ID=temp_client" --env="CLIENT_SECRET=temp_secret"
内容的提问来源于stack exchange,提问作者Biswarup Nath
相关产品推荐
相关产品推荐

