Kubernetes权限管理之ServiceAccount
Published in:2021-03-22 | Category: DevOps Cloud Native
Words: 1.1k | Reading time: 4min | Reading:

Kubernetes中,ServiceAccount 是一种用于为Pod中的进程提供身份标识的对象。它的主要作用是允许这些进程与Kubernetes API进行交互,从而实现各种自动化任务

ServiceAccount

ServiceAccount的主要作用包括:

  • 身份验证:当Pod中的进程需要与Kubernetes API服务器通信时,ServiceAccount提供了身份验证机制。每个ServiceAccount都有一个关联的Secret(包含一个Token),这个Token可以用来验证Pod的身份。

  • 授权:ServiceAccount可以与RoleClusterRole绑定,通过RoleBinding或ClusterRoleBinding来定义权限。这样,Pod中的进程就可以根据其ServiceAccount的权限来执行特定的操作。

  • 自动化任务:通过ServiceAccount,Pod可以自动执行各种任务,例如获取集群状态、管理资源、部署应用等, 也可将其用于CI/CD流程。

在本文中,我们将介绍如何创建和使用Kubernetes中的ServiceAccount

以下是一个创建ServiceAccount的yaml文件定义的示例:

1
2
3
4
5
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
namespace: default

创建这个ServiceAccount后,你可以将其分配给Pod,以便Pod中的进程可以使用这个ServiceAccount来与Kubernetes API进行交互。

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: default
spec:
serviceAccountName: my-serviceaccount
containers:
- name: my-container
image: nginx

在上面这个例子中,example-pod 使用 example-serviceaccount 来进行身份验证和授权,进而可以与Kubernetes API服务器进行交互。通过这种方式,Kubernetes的ServiceAccount为Pod中的进程提供了一种安全且灵活的方式来与集群进行交互。

Cluster Role

Kubernetes中,ClusterRole(集群角色)是一种资源,用于定义集群范围内的权限。它允许管理员定义哪些操作可以在整个集群中执行,例如管理节点、获取所有命名空间的资源等。

ClusterRole可以通过Kubernetes的YAML定义文件来创建的。也可以通过命令来创建,以下是一个示例ClusterRole的定义:

1
2
3
4
5
6
7
8
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["Pods", "Deployments", "Services"]
verbs: ["get", "list", "watch", "create", "update", "delete"]

这个示例ClusterRole定义了一个名为 my-clusterrole 的角色,允许对集群中的”Pods”, “Deployments”和”Services”资源执行get、list、watch、create、update和delete操作。

ClusterRole可以与ServiceAccount绑定,以便授予ServiceAccount特定的权限。ClusterRoleBinding定义了ClusterRoleServiceAccount之间的绑定关系。

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-clusterrolebinding
subjects:
- kind: ServiceAccount
name: my-serviceaccount
namespace: default
roleRef:
kind: ClusterRole
name: my-clusterrole
apiGroup: rbac.authorization.k8s.io

这个示例ClusterRoleBinding将名为 my-serviceaccount 的ServiceAccount与名为 my-clusterrole 的ClusterRole绑定。通过这种方式,我们可以为ServiceAccount分配特定的ClusterRole,以便授予其特定的权限。这样,ServiceAccount就可以在整个集群中执行各种自动化任务,而无需为每个Pod都创建特定的权限。

kubectl命令行创建示例

以下是使用命令行创建ServiceAccountClusterRoleClusterRoleBinding的示例:

  1. 首先,我们先创建一个名为my-namespace的namespace(命名空间):

    1
    kubectl create namespace my-namespace
  2. 接着我们在这个命名空间中创建一个名为my-serviceaccount的ServiceAccount:

    1
    kubectl -n my-namespace create serviceaccount my-serviceaccount
  3. 然后再创建一个名为my-clusterrole的ClusterRole:

    1
    kubectl create clusterrole my-clusterrole --verb=get,list,watch,create,update,delete --resource=pods,deployments,services
  4. 最后创建一个名为my-clusterrolebinding的ClusterRoleBinding,将命名空间my-namespace中的my-serviceaccount与my-clusterrole绑定:

    1
    kubectl -n my-namespace create clusterrolebinding my-clusterrolebinding --clusterrole=my-clusterrole --serviceaccount=my-namespace:my-serviceaccount

以下是执行命令的截图:

kubectl命令行查看示例

  1. 我们可以查看namespace的详细信息:

    1
    kubectl get namespace my-namespace

    输出应该如下所示:

    1
    2
    NAME           STATUS   AGE
    my-namespace Active 1m
  2. 我们可以查看一下这个ServiceAccount的详细信息:

    1
    kubectl -n my-namespace get serviceaccount my-serviceaccount

    输出应该如下所示:

    1
    2
    NAME                SECRETS   AGE
    my-serviceaccount 0 1m
  3. 我们可以查看一下这个ClusterRole的详细信息:

    1
    kubectl get clusterrole my-clusterrole

    输出应该如下所示:

    1
    2
    NAME            AGE
    my-clusterrole 1m
  4. 我们可以查看一下这个ClusterRoleBinding的详细信息:

    1
    kubectl -n my-namespace get clusterrolebinding my-clusterrolebinding

    输出应该如下所示:

    1
    2
    NAME                   ROLE                          AGE
    my-clusterrolebinding ClusterRole/my-clusterrole 1m

下面就是整个过程的截图:

这样,我们就创建了一个名为my-serviceaccount的ServiceAccount,它与名为my-clusterrole的ClusterRole绑定,并授予了它在my-namespace命名空间中执行各种自动化任务的权限。

Prev:
Kubernetes之RBAC授权模型
Next:
Kubernetes Deployment 的伸缩性