Service Account 与 User Account 的区别及token获取

获取 Kubernetes 跨 Namespace 的 Service Account Token

在 Kubernetes 中,Service Account(服务账号)允许 Pod 或其他资源与 Kubernetes API 进行交互。获取跨 Namespace 的 Service Account 的 Token,可以通过配置 RBAC(基于角色的访问控制)来完成。下面是详细的步骤和解释,如何创建一个 Service Account,并绑定到具有集群权限的 ClusterRole,然后获取其 Token。

1. 创建一个 Service Account

首先,我们需要创建一个 Service Account,指定它将在默认的 Namespace 中。

# 创建 Service Account
kubectl create sa mmwei3-sa

可以使用以下命令查看创建的 Service Account:

kubectl get sa mmwei3-sa -n default
2. 查看集群中的 ClusterRoleBinding

在授予权限之前,首先检查集群中的 ClusterRoleBinding 是否已经存在 cluster-admin 角色。这个角色具有对集群内所有资源的完全访问权限。

# 查看当前的 cluster-admin 角色绑定
kubectl get clusterrolebinding | grep admin

输出应该类似于:

cluster-admin  ClusterRole/cluster-admin  51d
3. 为 Service Account 创建 ClusterRoleBinding

接下来,我们需要为 Service Account 绑定一个具有集群级别权限的 ClusterRoleBinding,使其具有跨 Namespace 的操作权限。

# 为 mmwei3-sa 创建 ClusterRoleBinding,绑定 cluster-admin 角色
kubectl create clusterrolebinding mmwei3-cluster-role-binding \
  --clusterrole=cluster-admin \
  --serviceaccount=default:mmwei3-sa

这会创建一个新的 ClusterRoleBinding,为 mmwei3-sa 授予 cluster-admin 的权限。

4. 查看 ClusterRoleBinding 信息

使用以下命令可以查看刚创建的 ClusterRoleBinding 的详细信息,确保其正确配置。

# 查看 mmwei3-cluster-role-binding 的详细信息
kubectl describe clusterrolebinding mmwei3-cluster-role-binding

输出示例如下:

Name:         mmwei3-cluster-role-binding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
  Kind            Name       Namespace
  ----            ----       ---------
  ServiceAccount  mmwei3-sa  default
5. 查看 Service Account 的详细信息

接下来,我们需要获取 mmwei3-sa Service Account 相关的 Secret 信息。每个 Service Account 通常会自动生成一个包含认证 Token 的 Secret。

# 查看 mmwei3-sa 的详细信息
kubectl describe sa mmwei3-sa -n default

在输出中,您可以看到 Mountable secretsTokens 字段,显示了与此 Service Account 相关的 Secret 名称。

Name:                mmwei3-sa
Namespace:           default
Mountable secrets:   mmwei3-sa-token-nm47k
Tokens:              mmwei3-sa-token-nm47k
6. 获取 Service Account 的 Token

要获取 Token,可以通过 kubectl 命令获取 Service Account 对应的 Secret 内容,然后解码 Token 字段。执行以下命令:

# 获取并解码 Token
TOKEN=$(kubectl get secrets mmwei3-sa-token-nm47k -o jsonpath={
     
     .data.token} | base64 --decode)

现在 TOKEN 变量中就包含了该 Service Account 的 Token。

7. 使用 Token 进行验证

使用 curl 命令可以验证获取到的 Token 是否可以正确用于跨 Namespace 的访问。以下命令会使用 Token 访问 Kubelet 的 cAdvisor metrics 接口:

curl https://<kubelet-host>:10250/metrics/cadvisor -k -H "Authorization: Bearer $TOKEN"

<kubelet-host> 替换为 Kubernetes Node 的实际 IP 地址。输出应该是一些关于容器资源使用情况的指标数据。


Service Account 与 User Account 的区别

  1. Service Account 是为 Pod 提供身份认证的账号,用于管理 Pod 和 Kubernetes API 的交互。
  2. User Account 是为用户设计的账号,是跨 Namespace 使用的;而 Service Account 则是局限于其所在的 Namespace。
  3. 每个 Namespace 默认会创建一个 default 的 Service Account。
  4. TokenController 会监控 Service Account 的创建,并为其创建对应的 Secret。

Service Account 的应用实例

以下是通过 RoleRoleBinding 为 Service Account 赋予访问权限的简单示例:

1. 创建 Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysa
  namespace: default

应用这个 YAML 文件:

kubectl apply -f mysa.yaml
2. 为 Service Account 绑定权限

创建一个 RoleRoleBinding 来限制 mysa 只能获取 Pod 的信息:

# role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: mysa-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: mysa-binding
  namespace: default
subjects:
- kind: ServiceAccount
  name: mysa
  namespace: default
roleRef:
  kind: Role
  name: mysa-role
  apiGroup: rbac.authorization.k8s.io

应用此配置:

kubectl apply -f role.yaml
3. 使用 Service Account 的权限运行 Pod
# mysa-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysa-pod
spec:
  serviceAccountName: mysa
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "sleep 3600"]

将 Pod 部署到集群中:

kubectl apply -f mysa-pod.yaml

进入该 Pod 并测试:

kubectl exec -it mysa-pod -- sh

尝试查看集群的 Pod 资源:

kubectl get pods

如果没有授予删除权限,尝试删除 Pod 时会失败:

kubectl delete pod <pod-name>
# Error: the server doesn't have a resource type "pod"

结论

通过以上步骤,可以创建一个具有跨 Namespace 权限的 Service Account,获取其 Token 并使用它进行 API 操作。通过 RoleBindingClusterRoleBinding 来管理 Service Account 的权限,可以为其提供精细化的访问控制,从而满足不同场景下的需求。

猜你喜欢

转载自blog.csdn.net/qq_28513801/article/details/141929348