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
终于在别处得到了答案。
集群操作员可以向 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)
| 归档时间: |
|
| 查看次数: |
5839 次 |
| 最近记录: |