zoukankan      html  css  js  c++  java
  • Kubernetes Part3 ---- 远程访问之RBAC

    通过前面两章的配置 我们部署了K8S群集以及部署了K8S的官方Dashboard使得能够通过界面进行简单的操作和查看,这一章我们来实现远程访问控制(毕竟不是所有的操作都得从master上进行操作)K8S实现客户端远程访问的方式主要通过RBAC实现。

    RBAC是什么

    RBAC(Role-Based Access Control,基于角色的访问控制),允许通过Kubernetes API动态配置策略。

    K8S 资源有两个角度:

    群集角度:访问群集资源

    应用角度:访问Namespace以及POD

    所有的授权都是基于这两个操作类型对象进行的

    RBAC实现方式

    RBAC 有三个很重要的概念

    角色 (操作对象以及权限的集合)比如:虚拟机是对象 PowerOff是操作 PowerOff虚拟机即权限 那么PowerOff虚拟机 和PowerOn虚拟机多个权限加在一起就是角色。 K8S里面有两种类型的角色 Role和ClusterRole

    •Role:授权特定命名空间的访问权限

    •ClusterRole:授权所有命名空间的访问权限

     

    主体(subject 执行权限的实体)执行角色的实体 这里通常是指用户 用户的来源可以是AD的用户也可以是本地账户,比如我们再域控里面创建了一个账户karry. 显然K8S的用户来源更丰富一些 简单总结来说有这三种类型

    •User:用户 (本地或AD或LDAP)

    •Group:用户组 (本地或AD或LDAP)

    •ServiceAccount:服务账号(第三方集成时创建 比如我们会为Calico plugin创建服务账户 Dashboard Plugin也创建服务账户)

     

    角色绑定 (将角色与主体绑定)

    •RoleBinding:将角色绑定到主体(即subject)

    •ClusterRoleBinding:将集群角色绑定到主体

    举例说明一下: 我们想要实现账号karry对K8S 里面的default namespace具有读取权限我们需要做以下 用伪代码解释一下

    1. 创建角色 role (对象为default namespace,操作为 read)

    kind: role

      name: role01

      object: default-namespace

      action: read

    2. 创建账户 karry (本地创建 或从第三方读取 总之能够被K8S群集访问到)

    kind: user

      name: karry

    3. 角色和账户绑定 

    kind: rolebinding

      role: role01

      subject: karry

     一张图总结

    RBAC DEMO

    示例:为karry用户授权default命名空间Pod读取权限

     

    1.用K8S CA签发客户端证书

    cat > ca-config.json <<EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "87600h"
          }
        }
      }
    }
    EOF
    
    cat > karry-csr.json <<EOF
    {
      "CN": "karry",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    
    cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes karry-csr.json | cfssljson -bare karry
    

     注: 配置cfssl

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    chmod +x cfssl*
    mv cfssl_linux-amd64 /usr/bin/cfssl
    mv cfssljson_linux-amd64 /usr/bin/cfssljson
    mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
    

      

    2.生成kubeconfig授权文件

    kubectl config set-cluster kubernetes 
      --certificate-authority=/etc/kubernetes/pki/ca.crt 
      --embed-certs=true 
      --server=https://172.16.0.13:6443 
      --kubeconfig=karry.kubeconfig
     
    # 设置客户端认证
    kubectl config set-credentials karry 
      --client-key=karry-key.pem 
      --client-certificate=karry.pem 
      --embed-certs=true 
      --kubeconfig=karry.kubeconfig
    
    # 设置默认上下文
    kubectl config set-context kubernetes 
      --cluster=kubernetes 
      --user=karry 
      --kubeconfig=karry.kubeconfig
    
    # 设置当前使用配置
    kubectl config use-context kubernetes --kubeconfig=karry.kubeconfig
    

      

    3.创建RBAC权限策略

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: default
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list"]
    
    ---
    
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: read-pods
      namespace: default
    subjects:
    - kind: User
      name: karry
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io


     4.验证

       kubectl get pods--kubeconfig=./karry.kubeconfig

    [root@k8s-master03 tmp]# kubectl get pods --kubeconfig=./karry.kubeconfig
    NAME                                 READY   STATUS    RESTARTS   AGE
    green-shop-apache-5c6f79ff49-n67b6   1/1     Running   0          18d
    nginx-6799fc88d8-wkftx               1/1     Running   0          26d
    

      kubectl get namespaces --kubeconfig=./karry.kubeconfig

    Error from server (Forbidden): namespaces is forbidden: User "karry" cannot list resource "namespaces" in API group "" at the cluster scope
    

      

  • 相关阅读:
    在 Anaconda下解决国内安装tensorflow等下载慢和中断,出错,异常问题的一点思路
    关于指针和结构体的一点教训
    ARM cortexM4中断优先级的一点理解。
    ubuntu16下的/etc/resolv.conf重置的解决方案
    linux安装dpkg安装缺少依赖项的解决
    莲藕的简单凉菜制作总结
    单片机一种简便的printf调试方案。
    usart下位机输出使用printf的格式化技巧
    关于xp操作系统下使用VC6++编写的上位机软件在win10中运行的问题
    百度面试两板斧:手写算法问基础
  • 原文地址:https://www.cnblogs.com/houcong24/p/14219595.html
Copyright © 2011-2022 走看看