将OIDC令牌放入kubeconfig时无效

71次阅读
没有评论

问题描述

在容器内部使用OIDC令牌连接到Kubernetes API时没有问题,但是当尝试将令牌放入kubeconfig中时,使用kubectl get pod命令失败并显示”Unable to connect to the server: No valid id-token, and cannot refresh without refresh-token”错误。用户想知道为什么之前使用kubectl get pod --token命令可以正常工作,但是放入kubeconfig后令牌无效。用户还想知道如何创建一个包含令牌的kubeconfig,以便kubectl get pod命令可以接受并正常工作。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的信息,可能是由于kubeconfig中缺少必要的配置导致令牌无效。以下是一种可能的解决方案:
1. 确保idp-issuer-url参数设置正确。根据用户提供的信息,$token是由GitLab生成的,而不是Kubernetes集群的OIDC认证服务生成的。因此,应该将idp-issuer-url参数设置为kubernetes/serviceaccount,而不是Kubernetes集群的实际OIDC认证服务URL。
2. 检查令牌的JWT负载。根据用户提供的信息,令牌的JWT负载中包含一个aud声明,而不是client-id。然而,kubectl和OIDC认证提供程序似乎要求client-id不为空(否则会显示”error: Must provide client-id”)。因此,可能是因为kubectl在使用令牌之前会检查$token的签发者(issuer)和客户端ID(audience)(JWT负载中的issaud声明)。由于客户端ID检查失败,kubectl尝试刷新令牌,但刷新失败。
3. 如果上述诊断正确,那么可能无法通过kubeconfig实现此目标,因为kubectl要求客户端ID,而GitLab在$token中没有提供客户端ID。可能的原因是GitLab生成的是通用的JWT令牌,而kubectl(更具体地说,它的OIDC认证提供程序)期望的是OIDC ID令牌(除非使用--token参数调用,该参数绕过kubeconfig和OIDC认证提供程序)。

方案2

请注意以下操作注意版本差异及修改前做好备份。
另一种可能的解决方案是手动创建kubeconfig文件,并将令牌放入其中。以下是一种可能的方法:
1. 创建一个kubeconfig文件,例如config
2. 使用文本编辑器打开config文件,并添加以下内容:

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: https://<KUBERNETES_API_SERVER>
    certificate-authority-data: <CA_CERTIFICATE>
  name: cluster
users:
- name: user
  user:
    auth-provider:
      name: oidc
      config:
        idp-issuer-url: <IDP_ISSUER_URL>
        client-id: <CLIENT_ID>
        id-token: <TOKEN>
contexts:
- context:
    cluster: cluster
    user: user
  name: context
current-context: context

请注意替换以下值:
<KUBERNETES_API_SERVER>:Kubernetes API服务器的URL。
<CA_CERTIFICATE>:Kubernetes集群的CA证书。
<IDP_ISSUER_URL>:OIDC发行者URL,根据用户提供的信息,应该是kubernetes/serviceaccount
<CLIENT_ID>:客户端ID,根据用户提供的信息,可能需要一个非空的值。
<TOKEN>:令牌,根据用户提供的信息,应该是$token
3. 保存并关闭config文件。
4. 设置KUBECONFIG环境变量以指向新创建的kubeconfig文件:

export KUBECONFIG=/path/to/config

请将/path/to/config替换为实际的kubeconfig文件路径。
5. 运行kubectl get pod命令以测试是否可以正常连接到Kubernetes API。
请注意,这只是一种可能的解决方案,具体取决于用户的环境和配置。如果问题仍然存在,请尝试与Kubernetes社区或相关工具的支持团队联系以获取进一步的帮助和指导。

正文完