1、知识准备
● 帐户管理分为:userAccount与serviceAccount
● userAccount:一般是给人设计使用的,而且userAccount不在k8s集群内管理
● serviceAccount:一般是为集群内pod,外部service访问而设计的,更轻量级,更专一与实现某个任务
● k8s帐户管理,主要提供身份验证的功能,必须是k8s受权的帐户,才能被容许进入集群。这里须要注意的是身份验证以后只是被容许进入集群,可是不必定有访问资源的权限,此时须要用到RBAC来实现
● k8s帐户认证主要有证书+私钥、token和帐户名密码等方式进行认证docker
2、环境准备
组件 | 版本 |
---|---|
OS | Ubuntu 18.04.1 LTS |
docker | 18.06.0-ce |
k8s | v1.10.1 |
3、userAccount
咱们首先生成一个userAccount,生成userAccount的方法:api
建立mrvolleyball帐户私钥app
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分别是证书与私钥spa
签署完成,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
来识别帐户名code
接下来将帐户注册到kubectl config当中进行管理:server
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.
建立好以后使用新帐户来登陆:token
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集群,可是没有访问任何资源的权限ssl
4、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的准入许可
5、小结
● 本文介绍了k8s的帐户管理的两种方式userAccount、serviceAccount,以及两种不一样的验证方式
● 下一节介绍基于角色的权限控制RBAC
至此,本文结束 在下才疏学浅,有撒汤漏水的,请各位不吝赐教...