Kubernetes 预计服务帐户令牌到期时间问题

ncs*_*bra 6 amazon-web-services openid-connect kubernetes amazon-eks

我正在使用启用了服务账户发现的 AWS EKS 1.21。
创建了 OIDC 提供程序,.well-known/openid-configuration端点返回正确的配置:

{
  "issuer": "https://oidc.eks.eu-west-1.amazonaws.com/id/***",
  "jwks_uri": "https://ip-***.eu-west-1.compute.internal:443/openid/v1/jwks",
  "response_types_supported": [
    "id_token"
  ],
  "subject_types_supported": [
    "public"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ]
}
Run Code Online (Sandbox Code Playgroud)

为我的一个部署创建了一个 ServiceAccount,pod 将此作为预计卷:

  volumes:
  - name: kube-api-access-b4xt9
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
Run Code Online (Sandbox Code Playgroud)

为 ServiceAccount 创建的机密包含以下令牌:

{
  "iss": "kubernetes/serviceaccount",
  "kubernetes.io/serviceaccount/namespace": "sbx",
  "kubernetes.io/serviceaccount/secret.name": "dliver-site-config-service-token-kz874",
  "kubernetes.io/serviceaccount/service-account.name": "dliver-site-config-service",
  "kubernetes.io/serviceaccount/service-account.uid": "c26ad760-9067-4d90-a327-b3d6e32bce42",
  "sub": "system:serviceaccount:sbx:dliver-site-config-service"
}
Run Code Online (Sandbox Code Playgroud)

安装到 Pod 中的投影令牌包含以下内容:

{
  "aud": [
    "https://kubernetes.default.svc"
  ],
  "exp": 1664448004,
  "iat": 1632912004,
  "iss": "https://oidc.eks.eu-west-1.amazonaws.com/id/***",
  "kubernetes.io": {
    "namespace": "sbx",
    "pod": {
      "name": "dliver-site-config-service-77494b8fdd-45pxw",
      "uid": "0dd440a6-1213-4faa-a69e-398b83d2dd6b"
    },
    "serviceaccount": {
      "name": "dliver-site-config-service",
      "uid": "c26ad760-9067-4d90-a327-b3d6e32bce42"
    },
    "warnafter": 1632915611
  },
  "nbf": 1632912004,
  "sub": "system:serviceaccount:sbx:dliver-site-config-service"
}
Run Code Online (Sandbox Code Playgroud)

Kubernetes 每小时更新一次预计的令牌,因此一切看起来都很好。
除了预计的令牌“exp”字段:
"iat": 1632912004哪个是Wednesday, September 29, 2021 10:40:04 AM
"exp": 1664448004哪个是Thursday, September 29, 2022 10:40:04 AM

所以问题是,预计令牌到期时间是 1 年,而不是 1 小时左右,这使得 Kubernetes 更新令牌的努力基本上没有用。
我搜索了几个小时,但根本无法弄清楚这是从哪里来的。
过期标志被传递到 kube-api server: --service-account-max-token-expiration="24h0m0s",所以我的假设是应该以某种方式在 OIDC 提供程序上配置它,但无法找到任何相关文档。

expirationSeconds知道如何使预计的代币到期日期与Pod 中的预计数量大致相同吗?

更新

仅当投影令牌expirationSeconds设置为默认值时,任何其他值都会在安装的令牌中3607给出正确的值,这确实很奇怪。exp

ncs*_*bra 9

终于在别处得到了答案。

集群操作员可以向 kube apiserver 指定 --service-account-extend-token-expiration=true 标志,以允许令牌在迁移期间暂时具有更长的过期时间。旧代币的任何使用都将记录在指标和审核日志中。

“3607”幻数是绑定服务帐户令牌安全推出计划的一部分,如本 kep 中所述源代码中硬编码的实际数字。
从 1.20 开始,该--service-account-extend-token-expiration标志默认设置为 true 。

提到的指标/日志信息也可以在 kep 中找到,并在此处实现。
要在 EKS 中查看这些日志,需要在集群上启用审核日志记录,然后检查 Cloudwatch 中的相关日志条目。

我在 Cloudwatch Log Insight 中使用此查询来查找哪些 pod 不定期重新加载令牌:

filter @logStream like 'kube-apiserver-audit'
 | filter ispresent(`annotations.authentication.k8s.io/stale-token`)
 | parse `annotations.authentication.k8s.io/stale-token` "subject: *," as subject
 | stats count(*) as staleCount by subject, `user.username`
 | sort staleCount desc
Run Code Online (Sandbox Code Playgroud)