- 云原生
- 容器编排
- 边缘计算
【免费下载链接】k0s
k0s - The Zero Friction Kubernetes
k0s 本身不提供用户管理能力,推荐通过 OpenID Connect(OIDC)对接外部身份提供方(IdP),为kubectl用户引入单点登录(SSO)。本篇指南以 Google Cloud 为例,完整演示「k0s 侧通过extraArgs开启 OIDC 认证 → IdP 侧创建应用与凭据 → 生成用户 kubeconfig」的全流程,并覆盖k8s-oidc-helper、kubelogin两种客户端方案以及接入后的 RBAC 授权与 kubeconfig 安全分发。读完本文,你将能在自己的 k0s 集群上复现一套可用的 OIDC 认证链路。
为什么 k0s 集群需要 OIDC
开发者通常用kubectl访问 Kubernetes 集群。默认情况下kubectl使用客户端证书向 API Server 认证,这意味着当多位开发者需要访问同一集群时,证书需要在团队内共享——证书一旦泄露,后果往往很严重(用户管理文档 也明确指出:Kubernetes 及 k0s 没有内置用户管理功能,用户身份完全依赖外部来源,而客户端证书有效期长达一年且无法吊销)。
OIDC 方案把认证职责交给外部 IdP:API Server 只负责校验 IdP 签发的令牌(ID Token),用户无需持有共享证书,凭据泄露面大幅收窄。在 k0s 中,通过配置文件的spec.api.extraArgs即可把 OIDC 相关参数传递给 kube-apiserver 进程,无需改动任何组件代码。
阅读顺序建议:本指南(oidc-provider-configuration.md)负责「身份提供方」一侧的配置,而集群侧的整体接入请配合 oidc-cluster-configuration.md 一起阅读。
k0s 侧配置:为 kube-apiserver 开启 OIDC 认证
OIDC 认证通过 k0s 配置中的extraArgs开启。以下是 kube-api 支持的 OIDC 参数总览(完整继承自 oidc-cluster-configuration.md):
| 参数 | 说明 | 示例 | 是否必填 |
|---|---|---|---|
--oidc-issuer-url | 提供方 URL,API Server 据此发现公开签名密钥。仅接受https://协议,通常是不带路径的提供方发现地址,即.well-known/openid-configuration的上一级 | 若发现地址为https://accounts.google.com/.well-known/openid-configuration,则此处填https://accounts.google.com | 是 |
--oidc-client-id | 所有令牌必须为其签发的 client id | kubernetes | 是 |
--oidc-username-claim | 用作用户名的 JWT claim。默认sub(终端用户的唯一标识)。管理员可按提供方情况改用email、name等;但除email外的 claim 会加上 issuer URL 前缀,以避免与其他插件命名冲突 | sub | 否 |
--oidc-username-prefix | 用户名前缀,避免与已有名称(如system:用户)冲突。例如oidc:会生成oidc:jane.doe这样的用户名。若未设置且--oidc-username-claim不是email,默认前缀为(Issuer URL)#;值-可完全禁用前缀 | oidc: | 否 |
--oidc-groups-claim | 用作组的 JWT claim,若存在必须是字符串数组 | groups | 否 |
--oidc-groups-prefix | 组名前缀,避免与已有名称(如system:组)冲突。例如oidc:会生成oidc:engineering、oidc:infra | oidc: | 否 |
--oidc-required-claim | key=value形式描述 ID Token 中必须存在的 claim,会校验其值与匹配;可重复设置多个 | claim=value | 否 |
--oidc-ca-file | 签署 IdP Web 证书的 CA 证书路径,默认使用主机根 CA | /etc/kubernetes/ssl/kc-ca.pem | 否 |
最小可行配置只需要三项:oidc-issuer-url、oidc-client-id、oidc-username-claim。对应的 k0s 配置示例:
apiVersion: k0s.k0sproject.io/v1beta1 kind: ClusterConfig spec: api: extraArgs: oidc-issuer-url: <issuer-url> oidc-client-id: <client-id> oidc-username-claim: email # 用 email 令牌 claim 作为用户名以此配置为起点,完成 k0s 集群安装请继续参考configuration guide(例如通过k0s config create生成配置并启动控制面)。
源码视角:extraArgs如何生效
从源码结构看,该机制的核心在配置类型与组件实现两层:
- 配置类型:pkg/apis/k0s/v1beta1/api.go 中
APISpec定义了ExtraArgs map[string]string(键值对,推荐使用)与RawArgs []string(追加参数,不做校验);RawArgs会追加在ExtraArgs之后,注释明确建议优先使用ExtraArgs。 - 组件实现:pkg/component/controller/apiserver.go 在组装 kube-apiserver 启动参数时遍历
NodeConfig.Spec.API.ExtraArgs,若与内置默认参数同名会打印overriding apiserver flag with user provided value警告并覆盖,随后才生成最终 args。也就是说,oidc-*系列参数正是在这一合并步骤中被注入 API Server 进程的。
docs/configuration.md对extraArgs的说明补充了一个重要边界:extraArgs触发的任何行为不在 k0s 支持范围内,使用前应充分理解参数本身的作用。
身份提供方侧:接入前置条件
k0s 侧就绪后,还需要从 IdP 拿到三样东西(对应上文三个必填参数):
- issuer-url:提供方的 issuer 地址;
- client-id:为集群注册的应用客户端 ID;
- username-claim:决定用令牌中的哪个字段作为 Kubernetes 用户名。
不同厂商的申请流程差异较大,k0s 文档不逐一覆盖所有提供方——请参考你的提供方官方文档,或直接使用本指南的 Google Cloud 示例作为模板。独立部署(stand-alone)的 OIDC 提供方需要特别注意:如果其 Web 证书不是由公共根 CA 签发,就必须为 kube-api 显式指定oidc-ca-file参数,指向签署该证书的 CA。
Google Cloud 为例:完整接入流程
本文以 Google Cloud 作为示例提供方(其他厂商请对照各自文档调整),其 issuer URL 为https://accounts.google.com。
创建应用
- 打开 Google Cloud 控制台的 API Dashboard 页面;
- 在组织中新建一个项目;
- 进入 "Credentials"(凭据)页面;
- 创建 "OAuth consent screen"(OAuth 同意屏幕)。
创建用户凭据
- 进入 Google Cloud 控制台的 "Credentials" 页面;
- 新建凭据,类型选择 "OAuth client ID";
- 应用类型选择 "Desktop"(桌面应用);
- 保存生成的client ID和client secret。
用 k8s-oidc-helper 生成 kubeconfig 用户记录
k0s 文档推荐的客户端方案之一是k8s-oidc-helper工具,它负责在 kubeconfig 中写入正确的用户记录。运行以下命令并按提示操作:
k8s-oidc-helper --client-id=<CLIENT_ID> \ --client-secret=<CLIENT_SECRET> \ --write=true命令会引导完成 OAuth 授权并刷新令牌,最终把 OIDC 用户凭据写入 kubeconfig。
使用 kubelogin 插件对接其他提供方
对于非 Google 的其他 OIDC 提供方,可以使用kubectl的kubelogin插件。其通用思路是:先运行kubectl oidc-login setup完成一次授权并输出用户配置,再把该用户以exec插件模式注册到 kubeconfig,之后kubectl会在令牌过期时自动调用插件刷新令牌。
Google Cloud 示例
kubectl oidc-login setup \ --oidc-issuer-url=https://accounts.google.com \ --oidc-client-id=<CLIENT_ID> \ --oidc-client-secret=<CLIENT_SECRET> kubectl config set-credentials oidc \ --exec-api-version=client.authentication.k8s.io/v1beta1 \ --exec-command=kubectl \ --exec-arg=oidc-login \ --exec-arg=get-token \ --exec-arg=--oidc-issuer-url=https://accounts.google.com \ --exec-arg=--oidc-client-id=<CLIENT_ID> \ --exec-arg=--oidc-client-secret=<CLIENT_SECRET>配置完成后,可将当前 context 切换到oidc用户:
kubectl config set-context --current --user=oidc关于
kubelogin的完整 setup 细节(浏览器/设备码授权、令牌刷新缓存位置等),请以 kubelogin 插件的官方 setup 文档为准。
授权:OIDC 认证之后如何控制权限
认证解决「你是谁」,授权解决「你能做什么」。k0s 集群中实现 OIDC 授权有两种可选路径:
方式一:基于提供方的角色映射
使用oidc-groups-claim参数指定令牌中的哪个 claim 作为用户所属组(即 RBAC 角色列表)。其核心工作在于把 IdP 侧的组数据与 kube-api 的 RBAC 系统同步起来——例如把 IdP 中的engineering组映射到某个 ClusterRoleBinding。这种方式依赖提供方侧的组管理能力,配置细节见上文参数表及提供方文档。
方式二:手动角色管理
为每个新用户分别创建 Role 与 RoleBinding,Role 可以被所有用户共享。以下 Role 授予default命名空间内的全部权限(示例为全量授权,生产环境务必按实际需求收敛):
--- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: dev-role rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"]RoleBinding 示例(把 IdP 侧用户 ID 绑定到该角色):
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-role-binding subjects: - kind: User name: <provider side user id> roleRef: kind: Role name: dev-role apiGroup: rbac.authorization.k8s.iokubeconfig 安全分发的注意事项
将 OIDC 用户 kubeconfig 交付给终端用户前,有两点必须注意:
- 不要把
/var/lib/k0s/pki/admin.conf的完整内容直接发给用户——该文件持有管理员级凭据,直接分发等同于泄漏集群管理权限; - 正确做法是把
/var/lib/k0s/pki/admin.conf当作集群参数的模板(cluster/server、CA 证书等),只提取其中与集群连接相关的部分,套用前面生成的 OIDC 用户记录,组合出一份权限受限的用户专属 kubeconfig。
授权侧的 kubeconfig 组装方式由各提供方/工具的具体方案决定,可参考 user-management.md 中关于集群用户与 RBAC 绑定的说明(k0s kubeconfig create是证书方案的对应命令,OIDC 场景下则使用本指南的 helper/kubelogin 流程)。
小结
在 k0s 上启用 OIDC 的完整链路可归纳为四步:① 在spec.api.extraArgs中配置oidc-issuer-url、oidc-client-id、oidc-username-claim(必要时加oidc-groups-claim、oidc-ca-file);② 在 IdP 侧创建应用与凭据;③ 用k8s-oidc-helper或kubelogin生成用户 kubeconfig;④ 通过 RBAC(角色映射或手动绑定)完成授权,并安全分发受限的 kubeconfig。涉及的技术规范可进一步查阅 OAuth2 规范、Kubernetes RBAC 授权系统与 Kubernetes 认证系统文档,并结合本仓库的 oidc-cluster-configuration.md 与 configuration.md 落地到实际集群。
- 云原生
- 容器编排
- 边缘计算
【免费下载链接】k0s
k0s - The Zero Friction Kubernetes
相关推荐
Koel 单点登录(SSO)接入指南:Google 与通用 OpenID Connect 身份提供方
Koel 单点登录(SSO)接入指南:Google 与通用 OpenID Connect 身份提供方 Koel(开源音乐流媒体方案)在常规的邮箱+密码登录之外,
音视频后端前端FreshRSS 集成 OpenID Connect(OIDC)完整指南:环境变量配置、Docker 部署与身份提供商对接
FreshRSS 集成 OpenID Connect(OIDC)完整指南:环境变量配置、Docker 部署与身份提供商对接 本指南以 FreshRSS 官方管理
后端前端CLIASP.NET Core OpenID Connect 示例实战:在 OpenIdConnectSample 中配置 Azure AD 与 Google 身份提供方
ASP.NET Core OpenID Connect 示例实战:在 OpenIdConnectSample 中配置 Azure AD 与 Google 身份提
后端Web框架
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考