1、概述
(1)访问k8s集群时候,需要经过三个步骤完成具体操作
- 认证
- 鉴权(授权)
- 准入控制
(2)进行访问时候,过程中都需要经过apiserver,
apiserver做统一协调,比如门卫。
访问过程中需要证书、token、或者用户名+密码
如果访问pod需要serviceAccount
第一步 认证 传输安全
传输安全:对外不暴露8080端口,只能内部访问,对外使用端口6443
认证
客户端身份认证常用方式:
- HTTPS证书认证,基于ca证书
- http token认证,通过token识别用户
- http基本认证,用户名+密码认证
第二步 鉴权 授权
- 基于RBAC进行鉴权操作
- 基于角色访问控制
第三步 准入控制
就是准入控制器的列表,如果列表有请求内容通过,没有拒绝
2、鉴权-RBAC
基于角色的访问控制
角色
- role:特定的命名空间访问权限
- ClusterRole:所有命名空间访问权限
角色绑定
- roleBinding:角色绑定到主体
- ClusterRoleBinding:集群角色绑定到主体
主体
- user:用户
- group:用户组
- serviceAccount:服务账号
3、RBAC实现鉴权
//1.创建命名空间
kubectl get namespace(ns)
kubectl create ns roledemo
//2.在新创建的命名空间创建pod
kubectl run nginx --image=nginx -n roledemo
kubectl get pods -n roledemo
//3.创建角色
//rbac-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: ctnrs
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
//对pods有get、watch、list权限
//创建
kubectl apply -f rbac-role.yaml
//查看创建成功的角色
kubectl get role -n roledemo
//4.创建角色绑定
//rbac-rolebinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: roledemo
subjects:
- kind: User
name: lucy # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role #this must be Role or ClusterRole
name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
apiGroup: rbac.authorization.k8s.io
//创建
kubectl apply -f rbac-rolebinding.yaml
//查看
kubectl get role,rolebinding -n roledemo
//5.使用证书识别身份
mkdir mary
cd mary
//将脚本文件放在mary目录下边
//将root目录下的 ca 开头的文件赋值到当前mary目录下
cp /root/TLS/k8s/ca* ./
//执行脚本文件 rabc-user.sh
bash rabc-user.sh
//查看
cat mary-kubeconfig
kubectl get pods -n roledemo
#二进制搭建的集群中进行测试