目录
在 Kubernetes 中,ServiceAccount 是一种用于在 Pod 中提供身份验证和授权的机制。ServiceAccount 允许应用程序在集群内以特定身份运行,并且可以访问 Kubernetes API。
ServiceAccount 的主要组成部分和功能
1. 创建和管理 ServiceAccount
创建 ServiceAccount:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
namespace: default
列出当前命名空间中的所有 ServiceAccount
kubectl get serviceaccounts --all-namespaces
列出当前命名空间中的所有 ServiceAccount
kubectl get serviceaccounts
获取特定命名空间中 ServiceAccount
的详细信息
kubectl get serviceaccount <serviceaccount-name> -n <namespace> -o yaml
删除 ServiceAccount:
kubectl delete serviceaccount my-serviceaccount
2. 在 Pod 中使用 ServiceAccount
在 Pod 的定义中,你可以指定使用某个 ServiceAccount。这样,Pod 中的容器将使用该 ServiceAccount 的身份来访问 Kubernetes API。
示例 YAML:
apiVersion: v1 # Kubernetes API 版本
kind: ServiceAccount # 资源类型为 ServiceAccount
metadata:
name: my-serviceaccount # 服务账户的名称
namespace: default # 服务账户所在的命名空间
---
apiVersion: rbac.authorization.k8s.io/v1 # RBAC API 版本
kind: Role # 资源类型为 Role
metadata:
name: my-role # 角色的名称
namespace: default # 角色所在的命名空间
rules:
- apiGroups: [""] # API 组为空表示核心 API 组
resources: ["pods"] # 该角色权限作用于 pods 资源
verbs: ["get", "list", "watch"] # 允许的操作:获取、列出和观察 pods
---
apiVersion: rbac.authorization.k8s.io/v1 # RBAC API 版本
kind: RoleBinding # 资源类型为 RoleBinding
metadata:
name: my-rolebinding # 角色绑定的名称
namespace: default # 角色绑定所在的命名空间
subjects:
- kind: ServiceAccount # 绑定的主体类型是 ServiceAccount
name: my-serviceaccount # 绑定的服务账户名称
namespace: default # 服务账户所在的命名空间
roleRef:
kind: Role # 角色引用的类型是 Role
name: my-role # 绑定的角色名称
apiGroup: rbac.authorization.k8s.io # 角色的 API 组
---
apiVersion: v1 # Kubernetes API 版本
kind: Pod # 资源类型为 Pod
metadata:
name: my-pod # Pod 的名称
spec:
serviceAccountName: my-serviceaccount # Pod 使用的服务账户名称
containers:
- name: busybox # 容器的名称
image: busybox # 容器使用的镜像
command: ['sh', '-c', 'echo "ServiceAccount Token: $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"; sleep 3600'] # 容器启动时执行的命令:打印服务账户的 Token,然后休眠 3600 秒
验证 ServiceAccount:
kubectl get serviceaccount my-serviceaccount -n default -o yaml
作用: 确认 my-serviceaccount
服务账户在 default
命名空间中已创建并且配置正确。检查其元数据和任何相关注释。
验证 Role:
kubectl get role my-role -n default -o yaml
作用: 确认 my-role
角色在 default
命名空间中存在,检查其规则是否允许对 pods
资源进行 get
、list
和 watch
操作。
验证 RoleBinding:
kubectl get rolebinding my-rolebinding -n default -o yaml
作用: 确认 my-rolebinding
角色绑定在 default
命名空间中存在,并且将 my-serviceaccount
服务账户与 my-role
角色正确关联。
验证 Pod:
kubectl get pod my-pod -n default -o yaml
作用: 确认 my-pod
Pod 在 default
命名空间中已创建,并且其规范配置了正确的服务账户和容器设置。
检查 Pod 日志:
kubectl logs my-pod -n default
作用: 确认 Pod 正在运行并且服务账户令牌正确输出到日志中。这可以帮助验证服务账户是否正确挂载并可用。
检查 Pod 状态:
kubectl describe pod my-pod -n default
作用: 提供 Pod 的详细状态信息,包括事件和状态,帮助诊断 Pod 是否正常运行以及是否有任何错误或问题。
ServiceAccount 是 Kubernetes 中的一种资源,用于为 Pod 提供身份验证机制。每个 Pod 都可以使用一个服务账户来执行与 API 服务器的交互。
在上述代码中,my-serviceaccount 是一个在 default 命名空间中创建的服务账户。这个服务账户可以分配给 Pod,用于访问集群中的资源。
Role 是一个用于定义访问权限的 Kubernetes 资源。它指定了某个命名空间中允许的 API 操作。
my-role 定义了在 default 命名空间中对 pods 资源的权限,允许执行 get(获取)、list(列出)和 watch(观察)操作。
这里的 apiGroups: [""] 表示访问的是核心 API 组中的资源(如 pods)。
RoleBinding 将一个 Role 绑定到特定的用户或服务账户,使得这些用户或服务账户能够获得角色中定义的权限。
my-rolebinding 将 my-role 角色的权限赋予 my-serviceaccount 服务账户,使得该服务账户可以在 default 命名空间中对 pods 资源进行操作。
Pod 是 Kubernetes 中的基本调度单位,它可以包含一个或多个容器。
在这个例子中,my-pod 使用了 my-serviceaccount 作为其服务账户。这意味着 Pod 内的容器将使用这个服务账户的身份来与 Kubernetes API 服务器交互。
容器 busybox 执行的命令将服务账户令牌输出到日志中。这个令牌用于 Pod 内的应用与 Kubernetes API 进行身份验证和授权。
ServiceAccount:确实是用于创建和管理账户的,它为 Pod 提供一个身份,用于访问 Kubernetes API。服务账户是在特定命名空间下定义的,并且可以被多个 Pod 使用。
Role:是定义特定命名空间内对资源的权限。它指定了可以对哪些资源执行哪些操作(如
get
,list
,watch
等)。RoleBinding:是将一个 Role 绑定到一个或多个用户(包括服务账户)上的机制。它确定了哪些账户(或服务账户)能使用某个 Role 中定义的权限。
Pod:是 Kubernetes 中的最小调度单元,实际的应用运行在容器中。Pod 使用 ServiceAccount 来执行与 Kubernetes API 交互的操作。
总结:
- ServiceAccount 是 Pod 使用的身份。
- Role 定义了在命名空间内允许的权限。
- RoleBinding 将这些权限分配给 ServiceAccount。
- Pod 是使用 ServiceAccount 的最小单位,用于运行实际的应用。