Kubernetes服务账户管理深度解析

Kubernetes服务账户管理深度解析

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

概述

在Kubernetes集群中,服务账户(ServiceAccount)为运行在Pod中的进程提供身份标识。这些进程可以使用关联的服务账户身份向集群API服务器进行认证。本文将深入探讨服务账户的核心概念、工作机制以及高级管理技巧。

服务账户基础概念

服务账户与用户账户的区别

Kubernetes明确区分了服务账户和用户账户:

  1. 使用主体不同

    • 用户账户:供人类用户使用
    • 服务账户:供应用程序进程使用,这些进程运行在Pod的容器中
  2. 作用范围不同

    • 用户账户:全局唯一,在整个集群范围内名称必须唯一
    • 服务账户:命名空间作用域,不同命名空间可以有同名服务账户
  3. 创建机制不同

    • 用户账户:通常与企业目录系统集成,创建流程复杂
    • 服务账户:创建轻量,可按需创建,遵循最小权限原则
  4. 审计需求不同:两者审计要求不同,分离设计更易实现

  5. 可移植性:服务账户名称空间隔离的特性使其配置更易移植

绑定服务账户令牌

Kubernetes支持将服务账户令牌绑定到API对象上,这种机制可以将令牌的有效性与API对象的生命周期关联。

支持的绑定对象类型

  1. Pod:用于投影卷挂载
  2. Secret:通过删除Secret来撤销令牌
  3. Node:节点删除时自动撤销令牌(v1.33+正式支持)

绑定令牌工作原理

当令牌绑定到对象时,对象的metadata.namemetadata.uid会作为私有声明存储在JWT中。API服务器在认证时会验证这些声明:

  • 如果引用对象或服务账户处于删除状态(超过.metadata.deletionTimestamp60秒)
  • 如果引用对象不存在或UID不匹配 认证将失败

Pod绑定令牌的额外元数据

当服务账户令牌绑定到Pod对象时,JWT中还会包含:

  • Pod的spec.nodeName
  • 节点UID(如果可用)

注意:API服务器在使用令牌认证时不会验证这些节点信息。

令牌验证与检查

可以使用TokenReview API验证和提取令牌中的私有声明:

  1. 创建绑定到Pod的令牌:

    kubectl create token my-sa --bound-object-kind="Pod" --bound-object-name="test-pod"
    
  2. 使用TokenReview提交验证:

    apiVersion: authentication.k8s.io/v1
    kind: TokenReview
    spec:
      token: <your-token>
    
  3. 执行验证:

    kubectl create -o yaml -f tokenreview.yaml
    

输出将包含详细的认证信息,包括绑定的Pod和节点信息。

绑定服务账户令牌卷机制

Kubernetes控制平面(特别是服务账户准入控制器)默认会为Pod添加一个投影卷,其中包含访问Kubernetes API的令牌。

投影卷组成

典型的投影卷包含三个来源:

  1. serviceAccountToken

    • kubelet从API服务器获取的有时限令牌
    • 令牌默认1小时有效期,kubelet会自动刷新
    • 令牌绑定到特定Pod,API服务器作为受众
  2. configMap

    • 包含CA证书包,用于验证API服务器身份
  3. downwardAPI

    • 提供Pod所在命名空间信息

服务账户令牌管理演进

新旧机制对比

  1. 旧机制(v1.22之前)

    • 自动创建Secret存储令牌
    • 令牌无过期时间
    • 通过Secret挂载到Pod
  2. 新机制(v1.22+)

    • 使用TokenRequest API直接获取令牌
    • 令牌有时限,默认1小时
    • 使用投影卷挂载
    • Pod删除时令牌自动失效

自动生成的遗留令牌清理

从v1.29开始:

  1. 未使用的自动生成遗留令牌在默认1年后标记为无效
  2. 继续未使用(默认再1年)后将被清除
  3. 使用无效令牌会:
    • 添加审计注解
    • 增加指标计数
    • 更新最后使用标签
    • 返回错误

控制平面组件

服务账户控制器

  • 管理命名空间中的服务账户
  • 确保每个活跃命名空间存在"default"服务账户

令牌控制器

作为kube-controller-manager的一部分运行:

  1. 监视服务账户删除并删除关联的Secret
  2. 监视Secret添加并确保关联服务账户存在
  3. 监视Secret删除并更新服务账户引用

服务账户准入控制器

在Pod创建时同步修改Pod:

  1. 未指定serviceAccountName时设为"default"
  2. 确保引用的服务账户存在
  3. 自动挂载API访问令牌卷(除非明确禁用)

最佳实践

  1. 优先使用TokenRequest获取短期令牌
  2. 仅必要时手动创建长期令牌Secret
  3. 定期检查并清理未使用的遗留令牌
  4. 为不同工作负载创建专用服务账户
  5. 遵循最小权限原则分配权限

通过深入理解服务账户工作机制,可以更安全高效地管理Kubernetes集群中的身份认证。

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崔锴业Wolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值