跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes服务账户
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kubernetes服务账户 = == 介绍 == '''Kubernetes服务账户(Service Account)'''是Kubernetes中用于管理Pod身份验证和授权的核心机制。与普通用户账户不同,服务账户专门供集群内的进程(如Pod中运行的应用程序)使用,用于与Kubernetes API服务器交互。服务账户通过关联的令牌(Token)和RBAC规则实现细粒度的权限控制。 主要特点: * 每个命名空间自动创建默认服务账户(<code>default</code>) * 服务账户通过Secret存储认证令牌 * 可与Role/RoleBinding结合实现权限分配 * 支持多服务账户配置(一个Pod可关联多个服务账户) == 核心概念 == === 服务账户与用户账户的区别 === {| class="wikitable" |- ! 对比项 !! 服务账户 !! 用户账户 |- | 使用者 || Pod内部进程 || 人类用户或外部服务 |- | 创建方式 || 自动或通过kubectl创建 || 通过外部身份提供商管理 |- | 命名空间 || 属于特定命名空间 || 全局范围 |- | 典型用途 || Pod访问API服务器 || 管理员操作集群 |} === 服务账户令牌 === 服务账户通过JWT(JSON Web Token)进行认证,令牌存储在Secret中并自动挂载到Pod的<code>/var/run/secrets/kubernetes.io/serviceaccount</code>目录。令牌包含以下信息: <math> header.payload.signature </math> 其中payload包含: <syntaxhighlight lang="json"> { "iss": "kubernetes/serviceaccount", "sub": "system:serviceaccount:namespace:serviceaccountname" } </syntaxhighlight> == 实际操作 == === 创建服务账户 === 基本创建命令: <syntaxhighlight lang="bash"> kubectl create serviceaccount my-sa </syntaxhighlight> 查看创建的Secret: <syntaxhighlight lang="bash"> kubectl get serviceaccount my-sa -o yaml </syntaxhighlight> 输出示例: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: ServiceAccount metadata: name: my-sa namespace: default secrets: - name: my-sa-token-xyz12 </syntaxhighlight> === 在Pod中使用服务账户 === 在Pod定义中指定服务账户: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Pod metadata: name: my-pod spec: serviceAccountName: my-sa containers: - name: main image: nginx </syntaxhighlight> === 检查挂载的令牌 === 进入Pod查看挂载的令牌: <syntaxhighlight lang="bash"> kubectl exec -it my-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token </syntaxhighlight> == 安全实践 == === 最小权限原则 === 通过RBAC限制服务账户权限示例: <syntaxhighlight lang="yaml"> apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects: - kind: ServiceAccount name: my-sa namespace: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io </syntaxhighlight> === 禁用自动挂载 === 对于不需要API访问的Pod,可禁用令牌自动挂载: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Pod metadata: name: my-pod spec: automountServiceAccountToken: false containers: - name: main image: nginx </syntaxhighlight> == 实际案例 == === CI/CD流水线中的使用 === 在Jenkins Pod中使用专用服务账户实现部署权限控制: <mermaid> graph LR A[Jenkins Pod] -->|使用| B[deployer-sa] B -->|绑定| C[Deploy Role] C --> D[创建Deployment] C --> E[更新ConfigMap] </mermaid> YAML配置示例: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: ServiceAccount metadata: name: deployer-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: deploy-role rules: - apiGroups: ["apps"] resources: ["deployments"] verbs: ["create", "update", "patch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: deployer-binding subjects: - kind: ServiceAccount name: deployer-sa roleRef: kind: Role name: deploy-role apiGroup: rbac.authorization.k8s.io </syntaxhighlight> == 常见问题 == === 服务账户令牌轮换 === Kubernetes 1.21+支持自动令牌轮换: * 令牌默认有效期1年 * 可配置<code>--service-account-max-token-expiration</code>参数 * kube-controller-manager自动维护有效令牌 === 跨命名空间访问 === 需要创建ClusterRole和ClusterRoleBinding: <syntaxhighlight lang="yaml"> apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cross-ns-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cross-ns-binding subjects: - kind: ServiceAccount name: my-sa namespace: default roleRef: kind: ClusterRole name: cross-ns-reader apiGroup: rbac.authorization.k8s.io </syntaxhighlight> == 最佳实践 == 1. 避免使用default服务账户进行操作 2. 为不同工作负载创建专用服务账户 3. 定期审计服务账户权限 4. 在安全敏感环境禁用自动挂载 5. 使用RBAC实现最小权限分配 == 总结 == Kubernetes服务账户是集群内部身份认证的关键组件,通过合理配置可以实现: * Pod与API服务器的安全通信 * 细粒度的权限控制 * 工作负载隔离 * 自动化流程的安全保障 理解并正确使用服务账户是Kubernetes安全实践的重要基础。 [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes安全]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)