如何创建 Kubernetes Service Account 并绑定 Cluster Role

2023年 9月 7日 88.3k 0

wallhaven-l3y582.jpeg

关于Service Account,这里引用Kubernetes官网里的一句话:

服务账号(Service Account)为 Pod 中运行的进程提供身份标识, 并映射到 ServiceAccount 对象。当你向 API 服务器执行身份认证时, 你会将自己标识为某个用户(User) 。

简单来讲,Service Account就是当Pod内部进程需要与Api-Server通信时用于身份认证的账户。

在Pod里使用Service Account简单来说,步骤分4步:

  • 创建一个Service Account;
  • 创建一个Cluster Role;
  • 创建一个RoleBinding将Service Account和Cluster Role关联起来;
  • 在Pod配置文件里添加Service Account;
  • 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

    捕获.PNG

    如上图划红线处,这样就给Pod配置了Service Account。

    捕获.PNG

    当我们启动Pod后,进入当容器里面,跳转到上图的目录下,会看到红框框中的文件,这个文件就是对api-server发起请求时需要携带的请求认证Header:

    捕获.PNG

    然后我们按照下面的方法就可以向api-server发起请求了:

    捕获.PNG

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论