通过前面两章的配置 我们部署了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