• RBAC


    一.只能访问某个 namespace 的普通用户

    1.我们想要创建一个 User Account,只能访问 kube-system 这个命名空间,对应的用户信息如下所示:

    username: cccc
    group: yyyy
    

    2.创建用户凭证,Kubernetes 没有 User Account 的 API 对象,不过要创建一个用户帐号的话也是挺简单的,利用管理员分配给你的一个私钥就可以创建了,这个我们可以参考官方文档中的方法,这里我们来使用 OpenSSL 证书来创建一个 User,当然我们也可以使用更简单的 cfssl工具来创建,给用户 cccc 创建一个私钥,命名成 cccc.key:

    [root@master01 rbac]# openssl genrsa -out cccc.key 2048
    Generating RSA private key, 2048 bit long modulus
    ............+++
    .................+++
    e is 65537 (0x10001)
    

    3.使用我们刚刚创建的私钥创建一个证书签名请求文件:cccc.csr,要注意需要确保在-subj参数中指定用户名和组(CN表示用户名,O表示组):

    [root@master01 rbac]# openssl req -new -key cccc.key -out cccc.csr -subj "/CN=cccc/O=yyyy"
    

    4.然后找到我们的 Kubernetes 集群的 CA 证书,我们使用的是 kubeadm 安装的集群,CA 相关证书位于 /etc/kubernetes/pki/ 目录下面,如果你是二进制方式搭建的,你应该在最开始搭建集群的时候就已经指定好了 CA 的目录,我们会利用该目录下面的 ca.crt 和 ca.key两个文件来批准上面的证书请求。生成最终的证书文件,我们这里设置证书的有效期为 500 天:

    [root@master01 rbac]# openssl x509 -req -in cccc.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out cccc.crt -days 500
    

    5.现在我们可以使用刚刚创建的证书文件和私钥文件在集群中创建新的凭证和上下文(Context)

    [root@master01 rbac]# kubectl config set-context cccc-context --cluster=kubernetes --namespace=kube-system --user=cccc
    User "cccc" set.
    

    6.我们可以看到一个用户 cccc 创建了,然后为这个用户设置新的 Context,我们这里指定特定的一个 namespace:

    [root@master01 rbac]# kubectl config set-context cccc-context --cluster=kubernetes --namespace=kube-system --user=cccc
    Context "cccc-context" created.
    

    7.我们的用户 cccc 就已经创建成功了,现在我们使用当前的这个配置文件来操作 kubectl 命令的时候,发现如下报错:

    [root@master01 rbac]# kubectl get pods --context=cccc-context
    Error from server (Forbidden): pods is forbidden: User "cccc" cannot list resource "pods" in API group "" in the namespace "kube-system"
    

    8.创建角色

    [root@master01 rbac]# cat role.yaml 
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: cccc-role
      namespace: kube-system
    rules:
    - apiGroups: ["", "apps"]
      resources: ["deployments", "replicasets", "pods"]
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # 也可以使用['*']
    [root@master01 rbac]# kubectl get role -n kube-system 
    NAME                                             CREATED AT
    cccc-role                                        2021-07-04T15:36:34Z
    

    9.绑定角色

    [root@master01 rbac]# cat rolebinding.yaml 
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: cccc-rolebinding
      namespace: kube-system
    subjects:
    - kind: User
      name: cccc
      apiGroup: ""
    roleRef:
      kind: Role
      name: cccc-role
      apiGroup: rbac.authorization.k8s.io  # 留空字符串也可以,则使用当前的apiGroup
    [root@master01 rbac]# kubectl get rolebindings -n kube-system 
    NAME                                                ROLE                                                  AGE
    cccc-rolebinding                                    Role/cccc-role                                        21s
    

    10.测试

    [root@master01 rbac]# kubectl get pods --context=cccc-context
    NAME                               READY   STATUS    RESTARTS   AGE
    coredns-6d56c8448f-4fl6j           1/1     Running   3          44d
    coredns-6d56c8448f-p7fls           1/1     Running   3          44d
    etcd-master01                      1/1     Running   41         71d
    kube-apiserver-master01            1/1     Running   50         82d
    kube-controller-manager-master01   1/1     Running   96         47d
    kube-flannel-ds-2zlzc              1/1     Running   20         82d
    kube-flannel-ds-b99kt              1/1     Running   21         82d
    kube-flannel-ds-csbbs              1/1     Running   20         82d
    kube-proxy-79x54                   1/1     Running   19         82d
    kube-proxy-b9hg2                   1/1     Running   20         82d
    kube-proxy-g6b4m                   1/1     Running   19         82d
    kube-scheduler-master01            1/1     Running   89         73d
    

    11.测评

    [root@master01 rbac]# kubectl --context=cccc-context get pods --namespace=default
    Error from server (Forbidden): pods is forbidden: User "cccc" cannot list resource "pods" in API group "" in the namespace "default"
    # 我们可以看到我们使用 kubectl 的使用并没有指定 namespace,这是因为我们我们上面创建这个 Context 的时候就绑定在了 kube-system 这个命名空间下面
    [root@master01 rbac]# kubectl --context=cccc-context get svc
    Error from server (Forbidden): services is forbidden: User "cccc" cannot list resource "services" in API group "" in the namespace "kube-system"
    # 我们可以看到没有权限获取,因为我们并没有为当前操作用户指定其他对象资源的访问权限,是符合我们的预期的。这样我们就创建了一个只有单个命名空间访问权限的普通 User
    
  • 相关阅读:
    Simple Microservices Architecture on AWS
    信封加密 Envelope
    AWS::Serverless::Application
    API Gateway Stage variables
    重新开始继续准备AWS Dev认证考试:AWS Lambda 环境变量
    MXnet 转 OpenVino,在树莓派上做的图片推理
    OpenVino的MXnet模型转换
    Grafana 6.3.3发布 系统指标监控与分析平台
    【小工具】鼠标右键 图片转文字
    【Shiro】Shiro登录验证失败问题
  • 原文地址:https://www.cnblogs.com/Applogize/p/14970449.html
Copyright © 2020-2023  润新知