kubectl create token 创建的 token 存储在哪里(从 v1.24 开始)?

gol*_*er3 6 linux token kubernetes

这个问题涉及 kubernetes v1.24 及更高版本

所以我可以为服务帐户创建令牌

kubectl create token myserviceaccount
Run Code Online (Sandbox Code Playgroud)

创建的令牌可以工作并达到目的,但令我感到困惑的是,当我的kubectl get samyserviceaccount 的 SECRETS 字段仍然为 0 时。该令牌没有出现在kubectl get secrets任何一个中。

我还看到我可以 pass--bound-object-kind--bound-object-nametokubectl create token但这似乎也没有做任何事情(可见)......

有没有办法查看创建的令牌?--bound.. 标志的目的是什么?

gol*_*er3 5

感谢我今天偶然发现的文档链接(我不知道在提出问题时我是如何错过它的,因为我花了相当长的时间浏览文档......)我找到了我正在寻找的信息为了。我想提供这个答案,因为我发现 v1d3rm3 的答案不完整且不完全准确。

kubernetes 文档证实了 v1d3rm3 的声明(顺便说一句,这是回答我的问题的关键):

创建的令牌是经过签名的 JSON Web 令牌 (JWT)。

由于令牌是 JWT 令牌,服务器可以验证它是否已签名,因此无需存储它。设置 JWT 过期时间不是因为令牌不与对象关联(实际上是这样,如下所示),而是因为服务器无法使令牌失效(它实际上需要跟踪失效令牌,因为令牌不存储在任何地方,任何具有良好签名的令牌都是有效的)。为了减少令牌被盗时的损失,有一个有效期。

签名的 JWT 令牌包含其中的所有必要信息。

解码后的令牌(使用kubectl create token test-satest-sa 是服务帐户名称创建)如下所示:

{
  "aud": [
    "https://kubernetes.default.svc.cluster.local"
  ],
  "exp": 1666712616,
  "iat": 1666709016,
  "iss": "https://kubernetes.default.svc.cluster.local",
  "kubernetes.io": {
    "namespace": "default",
    "serviceaccount": {
      "name": "test-sa",
      "uid": "dccf5808-b29b-49da-84bd-9b57f4efdc0b"
    }
  },
  "nbf": 1666709016,
  "sub": "system:serviceaccount:default:test-sa"
}
Run Code Online (Sandbox Code Playgroud)

与 v1d3rm3 答案相反,此令牌自动与服务帐户关联,正如 kubernets 文档链接所确认的那样,并且我们也可以从上面的令牌内容中看到。

假设我有一个想要将令牌绑定到的秘密(例如kubectl create token test-sa --bound-kind Secret --bound-name my-secret,其中 test-sa 是服务帐户名称,my-secret 是我要绑定令牌的秘密),解码后的令牌将如下所示:

{
  "aud": [
    "https://kubernetes.default.svc.cluster.local"
  ],
  "exp": 1666712848,
  "iat": 1666709248,
  "iss": "https://kubernetes.default.svc.cluster.local",
  "kubernetes.io": {
    "namespace": "default",
    "secret": {
      "name": "my-secret",
      "uid": "2a44872f-1c1c-4f18-8214-884db5f351f2"
    },
    "serviceaccount": {
      "name": "test-sa",
      "uid": "dccf5808-b29b-49da-84bd-9b57f4efdc0b"
    }
  },
  "nbf": 1666709248,
  "sub": "system:serviceaccount:default:test-sa"
}
Run Code Online (Sandbox Code Playgroud)

请注意,绑定发生在令牌内部,在kubernetes.io key 下,如果您描述 my-secret,您仍然不会看到令牌。因此 --bound-... 标志(来自秘密对象)没有明显执行任何操作,因为绑定发生在令牌本身内部...

我们还可以在 TokenRequest 对象中查看详细信息,而不是解码 JWT 令牌

kubectl create token test-sa -o yaml
Run Code Online (Sandbox Code Playgroud)