kubernetes 一个用于获取secret名称和secret令牌的线性命令

toiithl6  于 2023-05-16  发布在  Kubernetes
关注(0)|答案(4)|浏览(210)

用什么一行命令来替换下面的两个命令来获取Kubernetes secret的token?示例用例将从kubernetes-dashboard-admin的secret获取token以登录并查看kubernetes-dashboard。
命令示例:

$ kubectl describe serviceaccount default
Name:                default
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   default-token-zvxf4
Tokens:              default-token-zvxf4
Events:              <none>

$ kubectl describe secret default-token-zvxf4
Name:         default-token-zvxf4
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: 809835e7-2564-439f-82f3-14762688ca80

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  7 bytes
token:      TOKENHERE
vwkv1x7d

vwkv1x7d1#

我发现的答案在下面。通过使用jsonpath检索并使用xargs将秘密名称/输出传递给第二个命令。将需要在最后使用base64解码加密令牌。

$ kubectl get serviceaccount default -o=jsonpath='{.secrets[0].name}' | xargs kubectl get secret -ojsonpath='{.data.token}' | base64 --decode
TOKENHERE%
  • 拖尾百分比不是令牌的一部分 *

这应该能够在MacOS上工作,而无需安装像jq这样的额外应用程序,它应该能够做到这一点。希望这对其他人有帮助。

8gsdolmq

8gsdolmq2#

您通常不需要运行这两个命令。Kubernetes会自动将凭证挂载到使用该服务帐户声明的pod中的/var/run/secrets/kubernetes.io/serviceaccount/token,并且各种Kubernetes SDK知道在那里查找凭证。Kubernetes文档中从Pod访问API更详细地描述了此设置。
Configure Service Accounts for Pods描述了可以进行的Pod级设置,尽管这些设置有合理的默认值。

apiVersion: v1
kind: Pod # or a pod spec embedded in a Deployment &c.
spec:
  serviceAccountName: my-service-account # defaults to "default"
  automountServiceAccountToken: true     # defaults to true

我不会尝试以服务帐户的身份从集群外部发出请求。用户权限更适合此用例。作为用户,如果需要,您可以使用服务帐户权限启动作业。

d6kp6zgx

d6kp6zgx3#

使用kubectl describe代替kubectl get并添加命名空间定义的示例:

kubectl -n kube-system describe secret $(kubectl -n kube-system describe sa default | grep 'Mountable secrets' | awk '{ print $3 }') | grep 'token:' | awk '{ print $2 }'
7fhtutme

7fhtutme4#

假设只有一个secret存在,我们可以使用jq JSON parser/processor来获取这个secret的数据,然后使用base64 -d来解码它(你可以在1行中完成,但是当单独提取secret name时,它会更自我注解):

$ SECRET_NAME=$(kubectl get secret -o name | head -1)

$ kubectl get -o name $SECRET_NAME | xargs kubectl get -o=json | jq -r ".data[]" | base64 -d

相关问题