Kubernetes权限与用户

本文环境:

  • k3s version v1.29.6+k3s2 (b4b156d9)
    go version go1.21.11

权限

Role

配置:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace:    # 所属命名空间
  name:         # 角色名
rules:          # 权限
- apiGroups: [] # 授权给哪些组
  resources: [] # 授权哪些资源
  verbs:     [] # 给予哪些权限

ClusterRole

配置:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name:         # 角色名
rules:          # 权限
- apiGroups: [] # 授权给哪些组
  resources: [] # 授权哪些资源
  verbs:     [] # 给予哪些权限

常用apiGroups

core/v1
对象权限名作用域子项目
配置文件configmaps命名空间-
事件events命名空间-
命名空间namespaces集群-
节点nodes集群-
PVCpersistentvolumeclaims命名空间-
PVpersistentvolumes集群-
Podpods命名空间
  • logs
  • status
  • exec
  • 保密字典secrets命名空间-
    服务账号serviceaccounts命名空间-
    服务services命名空间-
    apps/v1
    对象权限名作用域子项目
    守护进程daemonsets命名空间-
    无状态服务deployments命名空间-
    有状态服务statefulsets命名空间-
    autoscaling/v2
    对象权限名作用域子项目
    自动伸缩horizontalpodautoscalers命名空间-
    batch/v1
    对象权限名作用域子项目
    定时任务cronjobs命名空间-
    任务jobs命名空间-
    events.k8s.io/v1
    对象权限名作用域子项目
    事件events命名空间-
    helm.cattle.io/v1
    对象权限名作用域子项目
    Helm项目helmcharts命名空间-
    networking.k8s.io/v1
    对象权限名作用域子项目
    Ingress实现对象ingressclasses集群-
    Ingressingresses命名空间-
    rbac.authorization.k8s.io/v1

    不是哥们?你真的要给配权限的权限吗?

    对象权限名作用域子项目
    集群授权clusterrolebindings集群-
    集群权限clusterroles集群-
    授权rolebindings命名空间-
    权限roles命名空间-

    资源请求

    内容来源: 资源请求 - 鉴权 | Kubernetes

    HTTP 动词请求动词
    POSTcreate
  • GET
  • HEAD
  • get(针对单个资源)
  • list(针对集合,包括完整的对象内容)
  • watch(用于查看单个资源或资源集合)
  • PUTupdate
    PATCHpatch
    DELETE
  • delete(针对单个资源)
  • deletecollection(针对集合)
  • 用户

    User

    创建用户

    如何为用户签发证书 - 证书和证书签名请求 | Kubernetes

    1. 创建私钥
      openssl genrsa -out user.key 2048
      openssl req -new -key user.key -out user.csr -subj "/CN=${用户名}/O=${用户组}"
      
    2. 创建签名请求

      Kubernetes 签名者 - 证书和证书签名请求 | Kubernetes

      kubectl apply -f - << EOF
      apiVersion: certificates.k8s.io/v1
      kind: CertificateSigningRequest
      metadata:
      name: new-user-${用户名}
      spec:
      request: `base64 -w0 user.csr`
      signerName: kubernetes.io/kube-apiserver-client
      usages:
      - client auth
      EOF
      
    3. 批准签名请求
      只能管理员操作
      kubectl certificate approve new-user-${用户名}
      
    4. 获取证书
      kubectl get csr new-user-${用户名} -o jsonpath='{.status.certificate}'| base64 -d > user.crt
      
    5. 获取集群ca证书
      kubectl -n default get cm 'kube-root-ca.crt' -o jsonpath='{.data.ca\.crt}' > ca.crt
      
    6. 组合 KubeConfig
      apiVersion: v1
      kind: Config
      clusters:
      - name: ${你定义的集群名}
        cluster:
          certificate-authority-data: ${ca.crt 的 base64编码}
          server:                     ${集群API Server地址}
      users:
      - name: ${CN的用户名}
        user:
          client-certificate-data: ${user.crt 的 base64编码}
          client-key-data:         ${user.key 的 base64编码}
      contexts:
      - name:          ${你定义的配置名} # 推荐 用户@集群
        context:
          cluster:     ${你定义的集群名}
          namespace:   ${默认命名空间} # 可选
          user:        ${用户名}
      current-context: ${你定义的配置名}
      

    ServiceAccount

    创建账号

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name:      # 服务账号名
      namespace: # 服务账号所在的命名空间
    automountServiceAccountToken: true / false # 可选,表明是否也许自动挂载到 /var/run/secrets/kubernetes.io/serviceaccount/
    

    使用账号

    集群内使用
    apiVersion: v1
    kind: Pod
    ...
    spec:
      ...
      containers:
        - ...
        serviceAccountName: ${服务账号名}
        automountServiceAccountToken: true
    
    集群外使用(不推荐)
    • 获取 Token 和证书
      kubectl -n ${服务账号所在的命名空间} get serviceaccount ${服务账号名} -o jsonpath='{.secrets[*].name}' | \
      xargs kubectl -n ${服务账号所在的命名空间} get secret -o jsonpath='    certificate-authority-data: {.data.ca\.crt}
          token: {.data.token}
      '
      
    apiVersion: v1
    kind: Config
    clusters:
    - name: ${你定义的集群名}
      cluster:
        certificate-authority-data: ${ca.crt 的 base64编码}
        server:                     ${集群API Server地址}
    users:
    - name: ${CN的用户名}
      user:
        token: ${Base64解码后的Token}
    contexts:
    - name:          ${你定义的配置名} # 推荐 用户@集群
      context:
        cluster:     ${你定义的集群名}
        namespace:   ${默认命名空间} # 可选
        user:        ${用户名}
    current-context: ${你定义的配置名}
    

    授权

    各种示例: subjects 示例 - 使用 RBAC 鉴权 | Kubernetes

    RoleBinding

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name:                               # 授权名称
      namespace:                          # 所属命名空间
    subjects:                             # 授权对象
    - kind: User                          # 授权给用户
      name:                               # 用户名
      apiGroup: rbac.authorization.k8s.io
    - kind: Group                         # 授权给用户组(也就是证书的 O)
      name:                               # 组名
      apiGroup: rbac.authorization.k8s.io
    - kind: ServiceAccount                # 授权给服务账号
      name:                               # 服务账号名
      namespace:                          # 服务账号所在的命名空间
    roleRef:
      kind: Role / ClusterRole            # 授予角色类型
      name:                               # 角色名(必须和 RoleBinding 在同一个命名空间)
      apiGroup: rbac.authorization.k8s.io
    

    ClusterRoleBinding

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name:                               # 授权名称
    subjects:                             # 授权对象
    - kind: User                          # 授权给用户
      name:                               # 用户名
      apiGroup: rbac.authorization.k8s.io
    - kind: Group                         # 授权给用户组(也就是证书的 O)
      name:                               # 组名
      apiGroup: rbac.authorization.k8s.io
    - kind: ServiceAccount                # 授权给服务账号
      name:                               # 服务账号名
      namespace:                          # 服务账号所在的命名空间
    roleRef:
      kind:  ClusterRole                  # 授予角色类型
      name:                               # 角色名(必须和 RoleBinding 在同一个命名空间)
      apiGroup: rbac.authorization.k8s.io
    
    Last change: 2024-07-20, commit: 606e5c1