【问题标题】:k8s - how to project service account token into podk8s - 如何将服务帐户令牌投影到 pod
【发布时间】:2019-08-21 13:31:26
【问题描述】:

我正在尝试将 serviceAccount 令牌投射到我的 pod 中,如本 k8s 文档 - https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection 中所述。

我使用以下命令创建服务帐户

kubectl create sa acct

然后我创建 pod

kind: Pod
apiVersion: v1
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /var/run/secrets/tokens
      name: vault-token
  serviceAccountName: acct
  volumes:
  - name: vault-token
    projected:
      sources:
      - serviceAccountToken:
          path: vault-token
          expirationSeconds: 7200

由于 - MountVolume.SetUp failed for volume "vault-token" : failed to fetch token: the server could not find the requested resource 而失败

Events:
  Type     Reason       Age                   From               Message
  ----     ------       ----                  ----               -------
  Normal   Scheduled    5m15s                 default-scheduler  Successfully assigned default/nginx to minikube
  Warning  FailedMount  65s (x10 over 5m15s)  kubelet, minikube  MountVolume.SetUp failed for volume "vault-token" : failed to fetch token: the server could not find the requested resource

我的 minikube 版本:v0.33.1

kubectl 版本:1.13

问题:

  • 我在这里做错了什么?

【问题讨论】:

  • 您是否使用文档中提到的必要标志启动了 api 服务器?

标签: kubernetes


【解决方案1】:

我在 kubeadm 上进行了尝试,并且成功了。 @Aman Juneja 是对的,您必须按照文档中的说明添加 API 标志。

您可以通过创建服务帐户然后将此标志添加到 kubeapi 来做到这一点:

sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml

- --service-account-issuer=api
- --service-account-signing-key-file=/etc/kubernetes/pki/apiserver.key
- --service-account-api-audiences=api

然后应用您的 pod.yaml,它就会工作。正如您将在描述 pod 中看到的那样:

Volumes:
  vault-token:
    Type:                    Projected (a volume that contains injected data from multiple sources)

[删除为无效解决方案]

不幸的是,我的 minikube 不想从这个标志开始,它卡在:waiting for pods: apiserver 很快我会再次尝试调试。

更新

事实证明,您只需将参数传递到 minikube 中,其中包含来自 minikubeVM 内部的目录,而不是像我在前面的示例中所做的那样(所以是 .minikube 目录),所以它看起来像这样:

minikube start \
 --extra-config=apiserver.service-account-signing-key-file=/var/lib/minikube/certs/apiserver.key \
  --extra-config=apiserver.service-account-issuer=api \
  --extra-config=apiserver.service-account-api-audiences=api 

之后创建 ServiceAccount 并应用 pod.yaml 即可。

【讨论】:

  • 上述 minikube 命令不适用于最新的 minikube 版本 1.8.2 ,需要使用:minikube start --extra-config=apiserver.service-account-signing-key-file=/var/lib/minikube/certs/sa.key --extra-config=apiserver.service-account-issuer=kubernetes/serviceaccount --extra-config=apiserver.service-account-api-audiences=api
【解决方案2】:

您应该使用部署,因为当您使用部署时,令牌会自动挂载到 pod 中。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2019-05-14
    • 2021-03-25
    • 2021-08-25
    • 2014-08-17
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多