00:00:00
Service Account
Service Account 令牌的自动刷新轮换机制
以下是观察和验证 kubelet 自动刷新 Service Account 令牌的操作步骤:
步骤 1:查看 Pod 中挂载的 Service Account 令牌信息
bash
# 选择一个正在运行的 Pod(替换为实际的 Pod 名称和命名空间)
POD_NAME="my-app-pod"
NAMESPACE="default"
# 在 Pod 中查看挂载的令牌文件
kubectl exec -it $POD_NAME -n $NAMESPACE -- ls -la /var/run/secrets/kubernetes.io/serviceaccount/预期输出应包含:ca.crt(CA 证书)、namespace(命名空间文件)和 token(访问令牌)
步骤 2:检查令牌的过期时间
bash
# 在 Pod 内解码令牌并查看过期时间
kubectl exec -it $POD_NAME -n $NAMESPACE -- bash -c 'cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d . -f 2 | base64 -d 2>/dev/null | jq .exp'
# 将时间戳转换为人类可读格式
TOKEN_EXP=$(kubectl exec -it $POD_NAME -n $NAMESPACE -- bash -c 'cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d . -f 2 | base64 -d 2>/dev/null | jq -r .exp')
echo "令牌过期时间: $(date -d @$TOKEN_EXP)"注意:如果 Pod 中没有安装 jq,可以在本地机器上执行类似操作:
bash
kubectl exec -it $POD_NAME -n $NAMESPACE -- bash -c 'cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d . -f 2 | base64 -d 2>/dev/null' | jq .exp
TOKEN_EXP=$(kubectl exec -it $POD_NAME -n $NAMESPACE -- bash -c 'cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d . -f 2 | base64 -d 2>/dev/null' | jq .exp)
echo "令牌过期时间: $(date -d @$TOKEN_EXP)"步骤 3:观察 kubelet 的令牌轮换过程
bash
# 记录当前令牌的修改时间
kubectl exec -it $POD_NAME -n $NAMESPACE -- stat -c %y /var/run/secrets/kubernetes.io/serviceaccount/token
# 等待一段时间(如 40-50 分钟后)再次检查令牌的修改时间
# 如果时间发生变化,说明令牌已被轮换
kubectl exec -it $POD_NAME -n $NAMESPACE -- stat -c %y /var/run/secrets/kubernetes.io/serviceaccount/token
# 同时检查新令牌的过期时间
kubectl exec -it $POD_NAME -n $NAMESPACE -- bash -c 'cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d . -f 2 | base64 -d 2>/dev/null | jq .exp | xargs -I{} date -d @{}'步骤 4:确认应用程序使用最新令牌
对于使用官方 Kubernetes 客户端库的应用程序,通常会自动检测令牌文件的变化并使用新令牌。您可以通过查看应用程序日志或监控 API 请求来确认:
bash
# 查看应用程序日志,确认没有认证失败的错误
kubectl logs $POD_NAME -n $NAMESPACE
# 或使用 kubectl top 命令确认 Pod 仍在正常运行
kubectl top pod $POD_NAME -n $NAMESPACE通过以上步骤,您可以验证 kubelet 确实会自动刷新轮换 Service Account 的内置令牌,确保应用程序能够持续访问 Kubernetes API,而无需手动干预。