kubernetes-handbook/guide/kubectl-user-authentication...

140 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 创建用户认证授权的 kubeconfig 文件
当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制。
下面以创建一个 devuser 用户并将其绑定到 dev 和 test 两个 namespace 为例说明。
## 创建 CA 证书和秘钥
**创建 `devuser-csr.json` 文件**
```json
{
"CN": "devuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
```
**生成 CA 证书和私钥**
在 [创建 TLS 证书和秘钥](../practice/create-tls-and-secret-key.md) 一节中我们将生成的证书和秘钥放在了所有节点的 `/etc/kubernetes/ssl` 目录下,下面我们再在 master 节点上为 devuser 创建证书和秘钥,在 `/etc/kubernetes/ssl` 目录下执行以下命令:
执行该命令前请先确保该目录下已经包含如下文件:
```
ca-key.pem ca.pem ca-config.json devuser-csr.json
```
```bash
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes devuser-csr.json | cfssljson -bare devuser
2017/08/31 13:31:54 [INFO] generate received request
2017/08/31 13:31:54 [INFO] received CSR
2017/08/31 13:31:54 [INFO] generating key: rsa-2048
2017/08/31 13:31:55 [INFO] encoded CSR
2017/08/31 13:31:55 [INFO] signed certificate with serial number 43372632012323103879829229080989286813242051309
2017/08/31 13:31:55 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
```
这将生成如下文件:
```
devuser.csr devuser-key.pem devuser.pem
```
## 创建 kubeconfig 文件
```bash
# 设置集群参数
export KUBE_APISERVER="https://172.20.0.113:6443"
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=devuser.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials devuser \
--client-certificate=/etc/kubernetes/ssl/devuser.pem \
--client-key=/etc/kubernetes/ssl/devuser-key.pem \
--embed-certs=true \
--kubeconfig=devuser.kubeconfig
# 设置上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=devuser \
--namespace=dev \
--kubeconfig=devuser.kubeconfig
# 设置默认上下文
kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
```
我们现在查看 kubectl 的 context
```bash
kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes kubernetes admin
default-context default-cluster default-admin
```
显示的用户仍然是 admin这是因为 kubectl 使用了 `$HOME/.kube/config` 文件作为了默认的 context 配置,我们只需要将其用刚生成的 `devuser.kubeconfig` 文件替换即可。
```bash
cp -f ./devuser.kubeconfig /root/.kube/config
```
关于 kubeconfig 文件的更多信息请参考 [使用 kubeconfig 文件配置跨集群认证](../guide/authenticate-across-clusters-kubeconfig.md)。
## RoleBinding
如果我们想限制 devuser 用户的行为,需要使用 RBAC创建角色绑定以将该用户的行为限制在某个或某几个 namespace 空间范围内,例如:
```bash
kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=test
```
这样 devuser 用户对 dev 和 test 两个 namespace 具有完全访问权限。
让我们来验证以下,现在我们在执行:
```bash
# 获取当前的 context
kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes kubernetes devuser dev
* kubernetes kubernetes devuser test
# 无法访问 default namespace
kubectl get pods --namespace default
Error from server (Forbidden): User "devuser" cannot list pods in the namespace "default". (get pods)
# 默认访问的是 dev namespace您也可以重新设置 context 让其默认访问 test namespace
kubectl get pods
No resources found.
```
现在 kubectl 命令默认使用的 context 就是 devuser 了,且该用户只能操作 dev 和 test 这两个 namespace并拥有完全的访问权限。
可以使用我写的 [create-user.sh 脚本](https://github.com/rootsongjc/kubernetes-handbook/blob/master/tools/create-user/create-user.sh)来创建 namespace 和用户并授权,参考[说明](../tools/create-user/README.md)。
关于角色绑定的更多信息请参考 [基于角色的访问控制](../concepts/rbac.md)。