当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制。
下面以创建一个 devuser 用户并将其绑定到 dev 和 test 两个 namespace 为例说明。
创建 CA 证书和秘钥
创建 devuser-csr.json 文件
{
"CN": "devuser",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "Kubernetes",
"OU": "Kubernetes"
}
]
}
生成CA证书和私钥
我们已经将生成的证书和秘钥放在了所有节点的/etc/kubernetes/pki
目录下,下面我们再在 master 节点上为 devuser 创建证书和秘钥,在/etc/kubernetes/pki
目录下执行以下命令:
执行该命令前请先确保该目录下已经包含如下文件:
# ca 集群根证书
ca-key.pem
ca.pem
ca-config.json
devuser-csr.json
生成命令:
cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=/etc/kubernetes/pki/ca-config.json -profile=kubernetes devuser-csr.json|cfssljson -bare devuser
2023/09/19 17:38:51 [INFO] generate received request
2023/09/19 17:38:51 [INFO] received CSR
2023/09/19 17:38:51 [INFO] generating key: rsa-2048
2023/09/19 17:38:51 [INFO] encoded CSR
2023/09/19 17:38:51 [INFO] signed certificate with serial number 272484136328588252159908466004591786980109646031
2023/09/19 17:38:51 [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文件
export KUBE_APISERVER="https://172.16.108.157:9443"
# 设置集群参数
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=devuser.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials devuser --client-certificate=devuser.pem --client-key=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:
kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes kubernetes kubernetes-admin
显示的用户仍然是admin,这是因为kubectl中使用了$HOME/.kube/config
文件作为了默认的context配置,不要直接替换文件,最好是备份后重命名,或者可以在命令中指定用哪个config文件访问,命令如下:
kubectl --kubeconfig=/root/devuser/devuser.kubeconfig get pods -n dev
kubectl --kubeconfig=/root/.kube/config get pods -n dev
使用kubernetes-plugin插件连接k8s的认证方式
使用证书方式连接k8s
- 通过解码方式获取kubectl使用的admin证书
查看/root/devuser/devuser.kubeconfig
文件,文件中有3个值:certificate-authority-data、client-certificate-data、client-key-data,解码它们获得证书。
# 注意将下面的值替换成自己本地生成的字符串值
echo certificate-authority-data | base64 -d > ca.crt
echo client-certificate-data | base64 -d > client.crt
echo client-key-data | base64 -d > client.key
根据这3个文件生成一个PKCS12格式的客户端证书文件。
openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt
# 密码:123456
生成证书的时候,需要填写密码,后面会用到,生成的证书如下:
ca.crt
cert.pfx
client.crt
client.key
- 添加认证
将生成的cert.pfx上传到凭证
- kubernetes plugin与k8s连接配置
将ca.crt中的内容填写到kubernetes server certificate key字段
完成后点击测试连接,查看是否成功。
Rolebinding
如果我们想限制devuser用户的行为,需要使用RBAC创建角色绑定以将该用户的行为限制在某个或某几个namespace空间范围内,如:
1.其实测试环境里可以绑定user和clusterrole=admin,能满足我们的需求,只是这样权限太高。
kubectl create rolebinding dev-devuser-rolebinding --clusterrole=admin --user=devuser --namespace=dev
kubectl create rolebinding test-devuser-rolebinding --clusterrole=admin --user=devuser --namespace=test
2.我们这里使用的rolebinding绑定的是用户账号devuser和用户角色role,这样可以让devuser用户对dev和test 2个namespace具有完全访问权限。
namespace: dev
# 新建role
cat dev-devuser.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: dev-devuser
namespace: dev
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
# 新建rolebinding,绑定role和useraccount
k create rolebinding dev-devuser-rolebinding --role=dev-devuser --user=devuser -n dev
# 测试命令
k --kubeconfig=/root/devuser/devuser.kubeconfig get pods -n dev
namespace: test
# 新建role
cat test-devuser.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: test-devuser
namespace: test
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
# 新建rolebinding
k create rolebinding test-devuser-rolebinding --role=test-devuser --user=devuser -n test
# 测试
k --kubeconfig=/root/devuser/devuser.kubeconfig get pods -n test
参考链接:
https://www.cnblogs.com/deny/p/13848781.html
https://jimmysong.io/kubernetes-handbook/guide/kubectl-user-authentication-authorization.html