#K8S认证与访问控制(RBAC) 用户证书创建
#k8s认证
#主要认证 方式 http token、https证书
k8s不提供用户管理,API Server把客户端证书的CN字段作为User,把names.O字段作为Group
- Pod认证 —>ServiceAccount —>service-account-toen—>API Server
- k8s组件认证 —> 证书 —> kubeconfig —> API Server
Pod容器的访问:Pod(dashborad 也是Pod形式运行)
k8s组件对API Server的访问:kubectl、Controller Manager、Scheduler、kubelet、kubeproxy
#kubeconfig
kubeconfig 文件包含集群参数(CA证书、API Server地址),客户端参数(证书和私钥),集群
context 信息(集群名称、用户名)
#查看当前kubeconfig配置 kubectl config view cat ~/.kube/config
#ServiceAccount(sa)
sa
为Pod的进程调用Kubernetes API时提供身份标识,附带着Secret用于访问API Server的凭据
每个namespace会自动创建一个default service account
sa创建时,系统Token controller自动创建service-account-toen
pod创建时没指定sa,系统会自动指派相同namespace下的默认sa
容器启动时会挂载sa的token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/
#查看当前ns默认sa配置 kubectl get sa default -o yaml #查看自动创建的secret kubectl get sa default -o yaml #创建sa名称myda (-n dev名称空间 --dry-run不执行) kubectl create sa mysa -n dev -o yaml --dry-run #只显示yaml不执行
RBAC 授权模式
RBAC (Role-Based Access Control基于角色的访问控制)将权限绑定到role,用户与role绑定,获取role权限
Subject (用户User) —> 角色绑定 —> 角色 —> 获取许可权限
- User -->
Rolebinding
-->Role
(Role仅用于对应ns ,Rolebinding
可绑定Role
和Clusterrole
) - User -->
Clusterrolebinding
-->Clusterrole
(ClusterRole用于集群级别的资源)
RBAC API资源对象: Pods ConfigMaps Deployments Nodes Secrets Namespaces
role对应操作权限: create get delete list update edit watch exec
#查看集群管理员admin资源 kubectl get clusterrole admin -o yaml #创建myrole ,查看资源 kubectl create role myrole --verb=get,list,watch --resource=pod,svc -o yaml --dry-run #创建myrole-binding,绑定role为myrole,绑定用户devuser kubectl create rolebinding myrole-binding --role=myrole --user=devuser -o yaml --dry-run
#创建Dashboard登录token实例 #创建sa名称dashboard-admin,绑定到集群角色cluster-admin kubectl create sa dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin \ --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin #查看Dashboard登录token kubectl describe secrets -n kube-system \ $(kubectl get secret -A | awk '/dashboard-admin/{print $2}') |awk '/token:/{print$2}'
#k8s证书签名创建用户实例
#k8s创建用户实例 ############################## #k8s创建devuser用户管理dev空间所有资源 ############################## #参数 #group name , namespace gname=dev #user name uname=${gname}user #clusters name cname=$(kubectl config get-contexts |awk '/*/{print $3}') #API Server apiserver="$(kubectl config view |awk '/server/{print $2}')" #k8s根证书签名路径 ca_dir=/etc/kubernetes/pki #可选,创建目录 mkdir -p ${uname} ; cd ${uname} ############################## #创建证书 #创建私钥key openssl genrsa -out ${gname}.key #创建证书签署请求csr(O=组织,CN=用户) #openssl rand -writerand ~/.rnd openssl req -new -key ${gname}.key -out ${gname}.csr -subj "/O=${gname}/CN=${uname}" #使用CA根证书签名 openssl x509 -req -in ${gname}.csr -CAcreateserial -out ${gname}.crt \ -CA ${ca_dir}/ca.crt -CAkey ${ca_dir}/ca.key -days 365 #验证 #openssl x509 -in ${gname}.crt -text -noout -subject ############################## #创建config文件 #集群参数 kubectl config set-cluster ${cname} \ --certificate-authority=${ca_dir}/ca.crt \ --embed-certs=true \ --server=${apiserver} \ --kubeconfig=config.${uname} #客户端认证 kubectl config set-credentials ${uname} \ --client-certificate=${gname}.crt \ --client-key=${gname}.key \ --embed-certs=true \ --kubeconfig=config.${uname} #上下文参数(用户关联集群) kubectl config set-context ${uname}@${cname} \ --cluster=${cname} \ --user=${uname} \ --namespace=${gname} \ --kubeconfig=config.${uname} # 设置默认上下文 kubectl config use-context ${uname}@${cname} --kubeconfig=config.${uname} #查看 kubectl config view --kubeconfig=config.${uname} ############################## #权限 #创建namespace kubectl create ns ${gname} #查看clusterrole/admin #kubectl get clusterrole admin -o yaml #设置权限角色,所属namespace的所有权(使用系统自带的clusterrole) kubectl create rolebinding ${uname}-admin-binding --clusterrole=admin --user=${uname} --namespace=${gname} ############################## #kubectl认证 bash #进入新的终端环境 gname=dev uname=${gname}user #临时使用config.${uname}授权文件 export KUBECONFIG=config.${uname} #查看当前配置 kubectl config view #查看sa kubectl get sa #运行Pod测试 kubectl run myweb --image=alivv/nginx:node --replicas=3 #查看Pod kubectl get pod -n dev exit #退出测试终端环境 #查看所有namespace的Pod kubectl get pod -A ##############################
#删除pod kubectl delete deploy/myweb -n dev #删除ns kubectl delete ns dev
Blog地址 https://www.cnblogs.com/elvi/p/11755851.html
本文git地址 https://gitee.com/almi/k8s/tree/master/notes