K8s-认证机制:ServiceAccounts

K8s的认证方式

  • 客户端证书
  • 传入HTTP头中的token
  • 基础的HTTP认证
  • 其他

用户和组

用户

就是通过单个的SA的认证

组别

用户和SA可以属于一个或者多个组。

内置的用户组:

  • system unauthenticated 组用于所有认证插件都不会认证客户端身份的 请求

  • system authent cated 组会自动分配给一个成功通过认证的用户

  • system:serviceaccounts 组包含所有在系统中的 Serv iceAccount

  • system serviceaccounts <口 amespace >组包含了所有在特定命名空 间中的 Serv ceAccount

什么是SA

一个SA的用户名格式如下:

system: serviceaccount:<namespace >:

Pod中sa的位置: /var/run/secrets/kube netes io/serv ceaccount/token

每一个Namespace都有一个默认的ServiceAccount

RBAC

K8s的RBAC主要通过RoleClusterRole,RoleBindingClusterRoleBinding来实现

Role

YAMl

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
# Role所在的命令空间
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" 标明 core API 组
resources: ["pods"] # 资源,必须使用复数形式
verbs: ["get", "watch", "list"]

SHELL

kubectl create role service-reader --verb=get --verb=list

Rolebinding

YAML

apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "jane" 读取 "default" 名字空间中的 Pod
# 你需要在该名字空间中有一个名为 “pod-reader” 的 Role
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
# 把Role绑定到foo下的名为default的SA上
# 你可以指定不止一个“subject(主体)”
- kind: ServiceAccount
name: default
namespace: foo
roleRef:
# "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
kind: Role # 此字段必须是 Role 或 ClusterRole
name: pod-reader # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
apiGroup: rbac.authorization.k8s.io

SHELL

kubectl create rolebinding test --role=service-reader 
--serviceaccount=foo:default -n foo

ClusterRole

集群级别的资源访问

YAML

#ClusterRoles 是给全命名空间的
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
name: secret-reader
rules:
- apiGroups: [""]
# 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets"
resources: ["secrets"]
verbs: ["get", "watch", "list"]

ClusterRoleBinding

YAML

Role和binding 的组合排列

访问的资源 使用的角色类型 使用的绑定类型
集群级别资源(Nodes、PV) ClusterRole ClusterRoleBinding
非资源型URL(/api,/healthz) ClusterRole ClusterRoleBinding
在任何命名空间的资源(跨NameSpace资源) ClusterRole ClusterRoleBinding
在具体的命名空间中的资源(在多个命名空间中重用这个相同的ClusterRole) ClusterRole RoleBinding
在具体的命名空间的资源(Role中定以好) Role RoleBinding