k8s之身份认证与权限

Kubernetes 中提供了良好的多租户认证管理机制,如 RBAC、ServiceAccount 还有各种策略等。

通过该文件可以看到已经配置了 RBAC 访问控制

/usr/lib/systemd/system/kube-apiserver.service

1.1 认证

复制代码
所有 Kubernetes 集群有两类用户:由 Kubernetes 管理的Service Accounts (服务账户)和(Users Accounts) 普通账户。

普通账户是假定被外部或独立服务管理的,由管理员分配 keys,用户像使用 Keystone 或 google 账号一样,被存储在包含 usernames 和 passwords 的 list 的文件里。

需要注意:在 Kubernetes 中不能通过 API 调用将普通用户添加到集群中。
普通帐户是针对(人)用户的,服务账户针对 Pod 进程。
普通帐户是全局性。在集群所有namespaces中,名称具有唯一性。
通常,群集的普通帐户可以与企业数据库同步,新的普通帐户创建需要特殊权限。服务账户创建目的是更轻量化,允许集群用户为特定任务创建服务账户。
普通帐户和服务账户的审核注意事项不同。
对于复杂系统的配置包,可以包括对该系统的各种组件的服务账户的定义。

1.1.1 Service Account 自动化

1.1.1.1 Service Account Admission Controller

复制代码
通过 Admission Controller 插件来实现对 pod 修改,它是 apiserver 的一部分。创建或更新 pod 时会同步进行修改 pod。
当插件处于激活状态(在大多数发行版中都默认情况)创建或修改 pod 时,会按以下操作执行:


如果 pod 没有设置 ServiceAccount,则将 ServiceAccount 设置为 default。
确保 pod 引用的 ServiceAccount 存在,否则将会拒绝请求。
如果 pod 不包含任何 ImagePullSecrets,则将ServiceAccount 的 ImagePullSecrets 会添加到 pod 中。
为包含 API 访问的 Token 的 pod 添加了一个 volume。

把 volumeSource 添加到安装在 pod 的每个容器中,挂载在 /var/run/secrets/kubernetes.io/serviceaccount。

1.1.1.2 Token Controller

复制代码
TokenController 作为 controller-manager 的一部分运行。异步行为:

观察 serviceAccount 的创建,并创建一个相应的 Secret 来允许 API 访问。
观察 serviceAccount 的删除,并删除所有相应的ServiceAccountToken Secret
观察 secret 添加,并确保关联的 ServiceAccount 存在,并在需要时向 secret 中添加一个 Token。
观察 secret 删除,并在需要时对应 ServiceAccount 的关联

1.1.1.3 Service Account Controller

复制代码
Service Account Controller 在 namespaces 里管理ServiceAccount
并确保每个有效的 namespaces 中都存在一个名为 "default" 的 ServiceAccount。

2 授权(RBAC)

2.1 Role

复制代码
代表一个角色,会包含一组权限,没有拒绝规则,只是附加允许。它是 Namespace 级别的资源,只能作用与 Namespace 之内。

# 查看已有的角色信息
kubectl get role -n ingress-nginx -oyaml




yaml配置文件:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  name: nginx-ingress
  namespace: ingress-nginx
roles:
- apiGroups:
  - ""
  resources:
  - configmaps
  - pods
  - secrets
  - namespaces
  verbs:
  - get
- apiGroups:
  - ""
  resourceNames:
  - ingress-controller-label-nginx
  resources:
  - configmaps
  verbs:
  - get
  - update
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - create

2.2 ClusterRole

复制代码
功能与 Role 一样,区别是资源类型为集群类型,而 Role 只在 Namespace

# 查看某个集群角色的信息
kubectl get clusterrole view -oyaml

2.3 RoleBinding

复制代码
Role 或 ClusterRole 只是用于制定权限集合,具体作用与什么对象上,需要使用 RoleBinding 来进行绑定。

作用于 Namespace 内,可以将 Role 或 ClusterRole 绑定到 User、Group、Service Account 上。

# 查看 rolebinding 信息
kubectl get rolebinding --all-namespaces

# 查看指定 rolebinding 的配置信息
kubectl get rolebinding <role_binding_name> --all-namespaces -oyaml


yaml配置文件:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  ......
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name nginx-ingress-role
subjects:
- kind: ServiceAccount
  name: nginx-ingress-serviceaccount
  namespace: ingress-nginx

2.4 ClusterRoleBinding

复制代码
与 RoleBinding 相同,但是作用于集群之上,可以绑定到该集群下的任意 User、Group 或 Service Account
相关推荐
回眸不遇44 分钟前
将 Docker虚拟磁盘文件ext.vhdx迁移出C盘 ,更换到D盘
c语言·docker·容器
雨辰AI1 小时前
K8s人大金仓主从高可用搭建|容器化集群自动同步+故障切换(生产完整版)
云原生·容器·kubernetes
潘正翔2 小时前
k8s基础_kubeadm搭建k8s集群
linux·运维·docker·云原生·容器·kubernetes
Echo flower2 小时前
Docker 容器中 Puppeteer 僵尸进程排查与修复
运维·docker·容器·puppeteer
潘正翔3 小时前
k8s进阶_Harbor镜像仓库
git·云原生·容器·kubernetes·gitee·github
江湖有缘3 小时前
Docker实战 | 使用Docker部署Donetick任务与家务管理应用
运维·docker·容器
键盘鼓手苏苏5 小时前
AI 音频生成流水线:异步任务要有进度和取消
云原生·kubernetes·k8
雨辰AI5 小时前
K8s 达梦数据守护集群部署|容器化高可用生产落地指南
云原生·容器·kubernetes
张忠琳6 小时前
【NPU】Ascend Docker Runtime v26.0.1 之一 runtime/main.go — 超深度分析
云原生·容器·架构·kubernetes·npu·docker-runtime
画中有画6 小时前
云原生可观测性体系设计及其应用
云原生