Kubernetes基础:用户认证

这篇文章总结和介绍一下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文件内容设定示例

格式: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文件来创建证书,如下时管理用户所用到的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代码为例介绍,其中{{ 变量名称 }}中请按照自己的需要进行设定。

  • 第一条命令:生成CA与密钥文件

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相关信息,另外生成的证书文件前缀也可以进行指定。

设定kuberconfig的四条命令

以下同样使用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 }}

创建clusterrolebinding

在Kubernetes中,role/clusterrole/clusterrolebinding各司其职,创建clusterrolebinding则是常用的一条命令,以下使用dashboard创建的示例进行说明

  • 创建Service Account

kubectl create serviceaccount dashboard-admin -n kube-system

  • 创建clusterolebinding

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

查询token信息

以下用dashboard的token使用为例进行,

  • 获取secret名称
dashboard_secret=`kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}'`
  • 获取token信息

kubectl describe secret -n kube-system ${dashboard_secret} | grep -E ‘^token’ | awk ‘{print $2}’

参考内容

https://kubernetes.io/docs/reference/access-authn-authz/authentication/

你可能感兴趣的:(Kubernetes,深入浅出kubernetes)