经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
普通程序员看k8s的账户管理
来源:cnblogs  作者:wilson排球  时间:2019/4/8 12:32:51  对本文有异议

一、知识准备

● 账户管理分为: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账户私钥

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

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

  1. root@k8s-master:/etc/kubernetes/ssl# openssl req -new -key mrvolleyball.key -out mrvolleyball.csr -subj "/CN=mrvolleyball"
  2. 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
  3. Signature ok
  4. subject=CN = mrvolleyball
  5. Getting CA Private Key

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

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

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

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

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

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

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

  1. root@k8s-master:/etc/kubernetes/ssl# kubectl config use-context context@mrvolleyball-k8s
  2. Switched to context "context@mrvolleyball-k8s".
  3. root@k8s-master:/etc/kubernetes/ssl# kubectl get pod
  4. 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进行身份验证

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

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

创建一个busybox进行测试:

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

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

五、小结

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



至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

原文链接:http://www.cnblogs.com/MrVolleyball/p/10669186.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号