zoukankan      html  css  js  c++  java
  • 8.k8s.认证与访问控制

    #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可绑定RoleClusterrole)
    • 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/alivv/k8s/tree/master/notes

  • 相关阅读:
    线段树总结
    c语言实现按层次(广度优先)非递归遍历二叉链树
    三、初学.NET—Gridview的分页
    五、初学.NET—Gridview自动编号和鼠标停留行加背景
    四、初学.NET—Gridview外部按钮选中、删除一行
    二、初学.NET—Gridview的排序
    一、初学.NET—数据库连接字符串
    .net web study
    C# 接口
    c#索引器
  • 原文地址:https://www.cnblogs.com/elvi/p/11755851.html
Copyright © 2011-2022 走看看