关于Service Account,这里引用Kubernetes官网里的一句话:
服务账号(Service Account)为 Pod 中运行的进程提供身份标识, 并映射到 ServiceAccount 对象。当你向 API 服务器执行身份认证时, 你会将自己标识为某个用户(User) 。
简单来讲,Service Account就是当Pod内部进程需要与Api-Server通信时用于身份认证的账户。
在Pod里使用Service Account简单来说,步骤分4步:
1. 在一个命名空间里创建一个Service Account
先创建一个命名空间。
kubectl create namespace cluster-role-demo
在新创建的命名空间里创建一个Service Account。
kubectl create serviceaccount app-service-account -n cluster-role-demo
或者通过yaml文件的方式创建。
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: cluster-role-demo
2. 创建一个Cluster Role
如果Service Account需要获得整个集群所有命名空间下的资源权限,则需要创建Cluser Role,否则就创建Role即可。
下面是一份创建cluster Role的yaml文件:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: app-cluster-role
namespace: cluster-role-demo
rules:
- apiGroups:
- ""
- apps
- autoscaling
- batch
- extensions
- policy
- rbac.authorization.k8s.io
resources:
- pods
- componentstatuses
- configmaps
- daemonsets
- deployments
- events
- endpoints
- horizontalpodautoscalers
- ingress
- jobs
- limitranges
- namespaces
- nodes
- pods
- persistentvolumes
- persistentvolumeclaims
- resourcequotas
- replicasets
- replicationcontrollers
- serviceaccounts
- services
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
上面yaml文件里apiGroups项配置的是这个Service Account可以访问哪些资源分组,resources项则是更细粒度的配置可以访问哪些资源。
可以使用下面的命令查看有哪些资源:
kubectl api-resources
3. 创建ClusterRole Binding
前面我们分别创建了Service Account和Cluster Role,现在要将它们关联起来,这就需要再创建一个新资源ClusterRoleBinding。
使用下面的yaml文件:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata: name: app-cluster-role-binding
subjects:
- namespace: cluster-role-demo
kind: ServiceAccount
name: app-service-account
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: app-cluster-role
4. 检查Service Account是否对某个资源有操作权限
kubectl auth can-i get pods --as=system:serviceaccount:cluster-role-demo:app-service-account
执行后如果返回“yes”,则说明有权限。
5. 在Pod里使用Service Account
如上图划红线处,这样就给Pod配置了Service Account。
当我们启动Pod后,进入当容器里面,跳转到上图的目录下,会看到红框框中的文件,这个文件就是对api-server发起请求时需要携带的请求认证Header:
然后我们按照下面的方法就可以向api-server发起请求了: