这篇文章总结和介绍一下Kubernetes用户和认证相关的基础知识以及实际使用时常用的相关命令。
在Kubernetes中,用户主要分为普通用户和Service Account用户。
用户类别 | 用户特征 |
---|---|
普通用户 | 普通用户为外部管理的用户,一般通过密钥文件与之关联。Kubernetes中并没有相关的API调用可以直接进行集群的普通用户添加,因为在Kubernetes中并没有相应的对象来代表普通用户 |
Service Account用户 | Service Account用户可以通过Kubernetes的API进行管理,可以通过API调用进行创建,通过与credentials密件进行关联,将证书路径或者证书内容在密件中进行保存,设定关联的namespace,而这些密件会被挂载到pod中,在通信的时候即可直接通过这些密件确认用户信息,从而进行信息的交换。 |
通过指定APIServer的启动参数,Kubernetes的认证主要分为如下三类
类型 | 参数设定方式 | 说明 |
---|---|---|
证书认证 | --client-ca-file=文件名称 | 通过client-ca-file所指定的文件需要包含API Server所认可的CA的信息,当此证书文件有效时,证书中的CN(common name)会作为请求操作的用户名,而O(organization)所指定的内容会成为组的信息(需要注意的是需要在Kubernetes 1.4的版本之后)。 |
Token认证 | --token-auth-file=文件名称 | 目前token还是长期有效的状况,而且token列表必须要通过重启API server才能生效,而token-auth-file所指定文件就是csv文件,此文件中最少包含三列信息:token、用户名、用户id,而group的信息等则是可选的。 |
密码认证 | --basic-auth-file=文件名称 |
密码认证方式作为一种最基本的认证方式,是通过用户名和密码方式进行认证的。与token方式一样,目前此密码设定也是长期有效的状况。不过作为一种明文保存密码的基本认证方式,这种方式目前还是在Kubernetes中得到支持,但随着RBAC等方式的成熟,应该逐渐降低直接使用密码文件进行认证的场景。密码文件也是一个csv文件,最少包含密码、用户名、用户id三列。
格式:token,user,uid,“group1,group2,group3”
示例:00fdeedfa65384fe4dca538a54a0e8a1,kubelet-bootstrap,10001,“system:kubelet-bootstrap”
格式:password,user,uid,“group1,group2,group3”
说明:在Kubernetes 1.6及以后的版本,还可以包括一个有逗号分开的group名称的第四列,需要注意的是此列中如果超过一个group的信息,需要用双引号印起来
创建证书时需要通过csr文件来创建证书,如下时管理用户所用到的csr的json文件示例
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "DaLian",
"ST": "LiaoNing",
"O": "system:masters",
"OU": "System"
}
]
}
这个文件中包含很多信息,但是作为kubernetes认证相关的最重要的信息,莫过于是两件事情:
至于使用csr生成证书,自然前提就是使用证书认证方式了,所以若何确认这个对象成为了关键性问题。在当前的Kubernetes的证书认证方式中,实际上是通过CN和O来进行定位的:
信息类别 | 设定值 | 用户信息 |
---|---|---|
CN | admin | 说明此用户名称为admin |
O | system:masters | 说明此用户组为system:masters,可与系统缺省的设定进行关联 |
以下使用easypack中的Ansible代码为例介绍,其中{{ 变量名称 }}中请按照自己的需要进行设定。
cfssl gencert -initca {{ var_ssl_file_ca_csr }} | cfssljson -bare ca -
这条命令会生成CA和CA的密钥文件,会成为后续文件的输入
cfssl gencert -ca={{ var_ssl_ca_dir }}/{{ var_ssl_file_ca_pem }} -ca-key={{ var_ssl_ca_dir }}/{{ var_ssl_file_ca_key }} -config={{ var_ssl_ca_dir }}/{{ var_ssl_file_ca_config }} -profile={{ var_ssl_profile_etcd }} {{ var_ssl_file_etcd_csr }} | cfssljson -bare {{ var_ssl_etcd_cert_prefix }}
这条命令需要使用的输入主要有生成的CA和CA密钥文件,同时包含CA配置文件其中需要指定profile相关信息,另外生成的证书文件前缀也可以进行指定。
以下同样使用easypack中的Ansible代码为例介绍,其中{{ 变量名称 }}中请按照自己的需要进行设定。
kubectl config set-cluster {{ var_kubeconfig_cluster }}
–certificate-authority={{ var_ssl_ca_dir }}/{{ var_ssl_file_ca_pem }}
–embed-certs={{ var_kubeconfig_embed_certs }}
–server={{ var_kube_master_https }}
–kubeconfig={{ var_kubeconfig_kubectl }}
kubectl config set-credentials {{ var_kubeconfig_client_kubectl }}
–client-certificate={{ var_ssl_k8s_dir }}/{{ var_ssl_admin_cert_prefix }}.pem
–client-key={{ var_ssl_k8s_dir }}/{{ var_ssl_admin_cert_prefix }}-key.pem
–embed-certs={{ var_kubeconfig_embed_certs }}
–kubeconfig={{ var_kubeconfig_kubectl }}
kubectl config set-context {{ var_kubeconfig_client_kubectl }}
–cluster={{ var_kubeconfig_cluster }}
–user={{ var_kubeconfig_client_kubectl }}
–kubeconfig={{ var_kubeconfig_kubectl }}
kubectl config use-context {{ var_kubeconfig_client_kubectl }} --kubeconfig={{ var_kubeconfig_kubectl }}
在Kubernetes中,role/clusterrole/clusterrolebinding各司其职,创建clusterrolebinding则是常用的一条命令,以下使用dashboard创建的示例进行说明
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
以下用dashboard的token使用为例进行,
dashboard_secret=`kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}'`
kubectl describe secret -n kube-system ${dashboard_secret} | grep -E ‘^token’ | awk ‘{print $2}’
https://kubernetes.io/docs/reference/access-authn-authz/authentication/