zoukankan      html  css  js  c++  java
  • Service Account和RBAC授权

    一、介绍

    Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务。Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。

    二、创建Service Account

    ###serviceaccount(服务账号)
    1、#创建serviceaccount 
    kubectl  create  serviceaccount  mysa
    
    2、#查看mysa
    [root@k8s-m ~]# kubectl  describe sa mysa 
    Name:                mysa
    Namespace:           default
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  <none>
    Mountable secrets:   mysa-token-2zjlp
    Tokens:              mysa-token-2zjlp
    Events:              <none>
    3、#查看mysa自动创建的secret
    [root@k8s-m ~]# kubectl  get secret
    NAME                  TYPE                                  DATA      AGE
    default-token-29dpx   kubernetes.io/service-account-token   3         119d
    mysa-token-2zjlp      kubernetes.io/service-account-token   3         1m
    
    4、#使用mysa的sa资源配置pod
    [root@k8s-m ~]# cat mysa-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
      labels: 
        app: my-pod
         
    spec:
      containers:
      - name: my-pod
        image: nginx
        ports:
        - name: http
          containerPort: 80
      serviceAccountName: mysa 
      5、#导入
    [root@k8s-m ~]# kubectl apply -f  mysa-pod.yaml
    
    
    6、#查看
    [root@k8s-m ~]# kubectl  describe pod nginx-pod
    
    7、#查看使用的token和secret(使用的是mysa的token)
    kubectl  get  pod nginx-pod  -o jsonpath={".spec.volumes"}
    

      

    创建k8s账号及RBAC授权

    一、介绍

    在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。

    二、创建k8s账号与RBAC授权使用

    ##创建账号
    #1、创建私钥
    (umask 077; openssl genrsa -out zhang.key 2048)
    #用此私钥创建一个csr(证书签名请求)文件
    openssl  req -new -key zhang.key -out zhang.csr -subj  "/CN=zhang"
    
    openssl x509 -req -in zhang.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out zhang.crt -days 365
    
    #2、查看证书内容
    openssl  x509 -in zhang.crt  -text -noout
    
    
    kubectl   config  set-credentials zhang  --client-certificate=./zhang.crt  --client-key=./zhang.key   --embed-certs=true 
    
    #3、设置上下文
    kubectl  config   set-context  zhang@kubernetes --cluster=kubernetes --user=zhang
    
    #4、切换用户
    kubectl  config use-context zhang@kubernetes
    
    
    ##测试(还未赋予权限)
    [root@k8s-m ssl]# kubectl  get pod
    No resources found.
    Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "default"
    
    
    ##授权
    #K8S授权请求是http的请求
    对象URL格式:
    /apis/[GROUP]/[VERSION]/namespace/[NAMESPACE_NAME]/[KIND]/[OBJECT_ID]
    
    
    k8s授权方式分为:serviceaccount和自己签证ca证书的账号,及签证ca的用户组(group)上(授权给这个组的权限)
    
    #简介
    role:
    1、允许的操作,如get,list等
    2、允许操作的对象,如pod,svc等
    
    rolebinding:将哪个用户绑定到哪个role或clusterrole上
    
    clusterrole:(集群角色)
    clusterrolebinding:(绑定到集群)
    3、如果使用rolebinding绑定到clusterrole上,表示绑定的用户只能用于当前namespace的权限
    
    
    #创建一个角色(role)
    kubectl  create role  myrole  --verb=get,list,watch --resource=pod,svc
    
    #绑定用户zhang(上面创建的用户),绑定role为myrole
    kubectl  create  rolebinding myrole-binding  --role=myrole  --user=zhang
    #切换用户
    [root@k8s-m ~]# kubectl  config use-context zhang@kubernetes
    Switched to context "zhang@kubernetes".
    
    #查看权限(只授权了default名称空间pod和svc的get,list,watch权限)
    [root@k8s-m ~]# kubectl  get pod
    NAME                     READY     STATUS              RESTARTS   AGE
    nginx-pod                0/1       ImagePullBackOff    0          1h
    [root@k8s-m ~]# kubectl  get pod -n kube-system #无权访问kube-system
    No resources found.
    Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "kube-system"
    
    [root@k8s-m ~]# kubectl  delete pod nginx-pod #无删除权限
    Error from server (Forbidden): pods "nginx-pod" is forbidden: User "zhang" cannot delete pods in the namespace "default"
    
    
    
    
    #创建clusterrole#可以访问全部的namespace
    kubectl  create clusterrole mycluster-role --verb=get,list,watch  --resource=pod,svc  
    #删除zhang账号之前绑定的rolebinding
    kubectl  delete rolebinding myrole-binding  
    #使用clusterrolebinding绑定clusterrole
    kubectl  create clusterrolebinding my-cluster-rolebinding   --clusterrole=mycluster-role  --user=zhang
    
    #切换账号
    kubectl  config use-context zhang@kubernetes
    #查看权限 查看kube-system空间的pod
    [root@k8s-m ~]# kubectl  get pod -n kube-system
    NAME                            READY     STATUS    RESTARTS   AGE
    coredns-78fcdf6894-67h9h        1/1       Running   1          11h
    coredns-78fcdf6894-lzxmz        1/1       Running   1          11h
    etcd-k8s-m                      1/1       Running   2          11h
    ......
    

      

    配置一个新账号和配置文件并授权

    ##创建证书
    (umask 077; openssl genrsa -out k8s.key 2048)
    #用此私钥创建一个csr(证书签名请求)文件(/0是组名)
    openssl  req -new -key k8s.key -out k8s.csr -subj  "/CN=k8s/O=zhang"
    
    openssl x509 -req -in k8s.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out k8s.crt -days 365
    
    #查看证书内容
    openssl  x509 -in k8s.crt  -text -noout
    
    ##创建secret
    #创建一个generic的secre namespace设置为default
    kubectl  create  secret generic k8s  -n default  --from-file=k8s.crt=./k8s.crt   --from-file=k8s.key=./k8s.key
    #查看
    [root@k8s-m ~]# kubectl  get secret |grep k8s
    k8s                   Opaque                                2         35s
    
    
    
    ###配置生成
    kubectl config set-cluster  kubernetes    --certificate-authority=/etc/kubernetes/pki/ca.crt  --server="https://10.0.0.141:6443"  --embed-certs=true   --kubeconfig=./k8s.config
    
    ## 配置客户端认证
    kubectl config set-credentials k8s --client-certificate=./k8s.crt   --client-key=./k8s.key --embed-certs=true  --kubeconfig=./k8s.config 
    
    ### 配置关联
    kubectl  config   set-context  k8s@user --cluster=kubernetes --user=k8s --kubeconfig=./k8s.config
    
    
    
    ##创建role
     kubectl  create role  k8s-role  --verb=get,list,watch --resource=pod,svc
    #创建rolebinding
    kubectl  create  rolebinding k8s-rolebinding  --role=k8s-role  --user=k8s
    
    #替换配置文件
    [root@k8s-m ~]# mv /root/.kube/config    /mnt/
    [root@k8s-m ~]# cp k8s.config  /root/.kube/config 
    #修改config的current-context内容
    current-context: ""
    改成# 
    current-context: name: k8s@user
    
    ##查看
    [root@k8s-m ~]# kubectl  get pod 
    NAME                     READY     STATUS              RESTARTS   AGE
    my-statefulset-0         0/1       ContainerCreating   0          8d
    nginx-6f858d4d45-6qm6g   0/1       ImagePullBackOff    0          9d
    [root@k8s-m ~]# kubectl  get pod  -n kube-system
    No resources found.
    Error from server (Forbidden): pods is forbidden: User "k8s" cannot list pods in the namespace "kube-system"
    

      

  • 相关阅读:
    slim中返回结果加密的
    windows下的redis和redismyadmin
    centos6.2升级到centos6.8(6.5应该也一样)
    剑指offer-二叉树的深度
    leetcode-【hard】4. Median of Two Sorted Arrays
    leetcode-【中等题】5. Longest Palindromic Substring
    leetcode-【中等题】3. Longest Substring Without Repeating Characters
    leetcode-【中等题】2. Add Two Numbers
    leetcode-【中等题】228. Summary Ranges
    leetcode-【hard】273. Integer to English Words
  • 原文地址:https://www.cnblogs.com/zhangb8042/p/10199493.html
Copyright © 2011-2022 走看看