介绍
1.service account 也是一种账号, 但它不是给kubernetes集群的用户(系统管理员, 运维人员)用的, 而是给运行在pod里的进程用的, 它为pod里的进程提供了必须的身份证明
2.kubernetes在创建一个namespace, 会为每个namespace下都一个名为default的默认serviceaccount对象, 在这个service account里面有个token, 可以当做volume被挂载到pod里的secret, 当pod启动时, 这个secret会自动挂载到pod的指定目录下, 用来协助完成pod中的进程访问api server时的身份鉴权
3.查看系统默认的的serviceaccount
包含三个数据项, 分别是token,ca.cert, namespace
kubectl describe serviceaccounts # Mountable secrets表示它需要被挂载到pod上
kubectl describe secret default-token-fcv28
注意: 如果pod定义时没有指定spec.serviceAccountName属性 , 系统自动为其赋值default, 既使用同一个namespace下的默认ServiceAccount
serviceaccount 与 user区别
1. user给人用的, service account是给pod里进程使用的
2. user账号是全局性, service account则属于某个具体namespace
为什么每个namespace下都有一个名为default的serviceaccount
这是因为service account controller一直监听service account和namespace事件,
给某个pod使用自定义service account
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: myserviceaccount
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
serviceAccountName: myserviceaccount
指定ServiceAccount授权管理
1.为my-namespace的指定serviceaccount授予clusterole中的view权限
kubectl create rolebinding my-sa-view --clusterrole=view --serviceaccount=my-namespace:my-sa --namespace=my-namespace
2. 为my-namespace命名空间的中的默认serviceaccount授权clusterrole的view权限
kubectl create rolebinding default-view --clusterrole=view --serviceaccount=my-namespace:default --namespace=my-namespace
3. 为my-namespace命名空间中的所有serviceaccount授权clusterrole的view权限
kubectl create rolebinding serviceaccounts-view --clusterrole=view --group=system:serviceaccounts:my-namespace --namespace=my-namespace
${namespace}:${serviceaccount} #指定namespace下的serviceaccount
${namespace}:default #指定namespace下的默认default serviceaccount
system:serviceaccounts:${namespace} #指定namespace下的所有serviceaccount
system:serviceaccounts #所有命名空间下的serviceaccount