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

  

原文地址:https://www.cnblogs.com/houcong24/p/14219595.html