zoukankan      html  css  js  c++  java
  • k8s的账户管理 —— userAccount & serviceAccount (转发)

    普通程序员看k8s的账户管理

     

    一、知识准备

    ● 账户管理分为:userAccount与serviceAccount
    ● userAccount:通常是给人设计使用的,并且userAccount不在k8s集群内管理
    ● serviceAccount:通常是为集群内pod,外部service访问而设计的,更轻量级,更专注与实现某个任务
    ● k8s账户管理,主要提供身份验证的功能,必须是k8s授权的账户,才能被允许进入集群。这里需要注意的是身份验证之后只是被允许进入集群,但是不一定有访问资源的权限,此时需要用到RBAC来实现
    ● k8s账户认证主要有证书+私钥、token和账户名密码等方式进行认证


    二、环境准备

    组件版本
    OS Ubuntu 18.04.1 LTS
    docker 18.06.0-ce
    k8s v1.10.1

    三、userAccount

    我们首先生成一个userAccount,生成userAccount的方法:

    创建mrvolleyball账户私钥

    root@k8s-master:/etc/kubernetes/ssl# openssl genrsa -out mrvolleyball.key 2048
    Generating RSA private key, 2048 bit long modulus
    .........+++
    ........................+++
    e is 65537 (0x010001)
    

    基于私钥签署证书,由k8s的ca来签署(该ca是创建k8s集群的时候生成的)

    root@k8s-master:/etc/kubernetes/ssl# openssl req -new -key mrvolleyball.key -out mrvolleyball.csr -subj "/CN=mrvolleyball"
    root@k8s-master:/etc/kubernetes/ssl# openssl x509 -req -in mrvolleyball.csr -CA k8s-root-ca.pem -CAkey k8s-root-ca-key.pem -CAcreateserial -out mrvolleyball.crt
    Signature ok
    subject=CN = mrvolleyball
    Getting CA Private Key
    

    注:k8s-root-ca.pem与k8s-root-ca-key.pem分别是证书与私钥

    签署完成,k8s是怎么识别你的账户名呢:

    root@k8s-master:/etc/kubernetes/ssl# openssl x509 -in mrvolleyball.crt -text
    Certificate:
        Data:
            Version: 1 (0x0)
            Serial Number:
                e5:5e:0d:d2:bc:2e:8a:c6
        Signature Algorithm: sha256WithRSAEncryption
            Issuer: C = CN, ST = ChengDu, L = ChengDu, O = k8s, OU = System, CN = kubernetes
            Validity
                Not Before: Mar  1 10:23:44 2019 GMT
                Not After : Mar 31 10:23:44 2019 GMT
            Subject: CN = mrvolleyball
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
    ...
    

    k8s主要是通过Subject: CN = mrvolleyball来识别账户名

    接下来将账户注册到kubectl config当中进行管理:

    root@k8s-master:/etc/kubernetes/ssl# kubectl config set-cluster mrvolleyball-k8s --server https://192.168.17.171:6443
    Cluster "mrvolleyball-k8s" set.
    root@k8s-master:/etc/kubernetes/ssl# kubectl config set-cluster mrvolleyball-k8s --certificate-authority=k8s-root-ca.pem
    Cluster "mrvolleyball-k8s" set.
    root@k8s-master:/etc/kubernetes/ssl# kubectl config set-context context@mrvolleyball-k8s --cluster=mrvolleyball-k8s --user=mrvolleyball
    Context "context@mrvolleyball-k8s" created.
    root@k8s-master:/etc/kubernetes/ssl# kubectl config set-credentials mrvolleyball --client-certificate=mrvolleyball.crt --client-key=mrvolleyball.key
    User "mrvolleyball" set.
    

    创建好之后使用新账户来登录:

    root@k8s-master:/etc/kubernetes/ssl# kubectl config use-context context@mrvolleyball-k8s
    Switched to context "context@mrvolleyball-k8s".
    root@k8s-master:/etc/kubernetes/ssl# kubectl get pod
    Error from server (Forbidden): pods is forbidden: User "mrvolleyball" cannot list pods in the namespace "default"
    

    由于没有权限,我们只能允许被进入k8s集群,但是没有访问任何资源的权限

    四、serviceAccount

    ● 当一个pod被创建的时候,pod也需要去k8s-api注册自己的信息,这时候使用的身份验证及时serviceaccount
    ● 相对于创建证书与私钥的方式,serviceaccount突出轻的特点,使用token认证

    对于k8s来说,会默认在每一个命名空间下面,创建一个token用于pod进行身份验证

    root@k8s-master:/etc/kubernetes/ssl# kubectl get secret --all-namespaces | grep default-token
    default       default-token-v9nkm                        kubernetes.io/service-account-token   3         192d
    kube-public   default-token-hzfqq                        kubernetes.io/service-account-token   3         192d
    kube-system   default-token-g9ghd                        kubernetes.io/service-account-token   3         192d
    test1         default-token-j5j67                        kubernetes.io/service-account-token   3         85d
    

    当pod启动的时候,会默认挂载当前namespace下secret进入pod,通过这个secret,进行身份验证

    创建一个busybox进行测试:

    root@k8s-master:~# echo 'apiVersion: v1
    > kind: Pod
    > metadata:
    >   name: busybox
    > spec:
    >   containers:
    >   - image: busybox:latest
    >     name: busybox
    >     command: ["sleep","3600"]' | kubectl apply -f -
    pod "busybox" created>
    
    root@k8s-master:~# kubectl describe pod busybox
    ...
    Volumes:
      default-token-v9nkm:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-v9nkm
        Optional:    false
    ...
    

    来到volumes这里,default-token-v9nkm正是我们default namespace中默认的key,通过挂载这个secret,pod拿到了进入k8s-api的准入许可

    五、小结

    ● 本文介绍了k8s的账户管理的两种方式userAccount、serviceAccount,以及两种不同的验证方式
    ● 下一节介绍基于角色的权限控制RBAC



  • 相关阅读:
    记一次生产数据库"意外"重启的经历
    我爬了链家青岛市北3000套二手房得出一个结论
    我用Python实现了一个小说网站雏形
    Linux下安装 Python3
    Lepus搭建企业级数据库慢查询分析平台
    Lepus搭建企业级数据库全方位监控系统
    shell浅谈之九子shell与进程处理
    shell中测试命变量是否已经定义
    getline数据来源你的三种方式
    awk中的system和getline的用法
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/13633245.html
Copyright © 2011-2022 走看看