Kubernetes的User Account用于从 集群外部 访问 api-server 时 使用
kubectl命令就是作为kubernetes-admin用户来执行的,默认使用x509客户端证书方式,x509 是双向认证的
参考 https://kubernetes.io/docs/reference/access-authn-authz/authentication/
查看当前集群中的用户信息
kubectl config view
下面我们在集群中添加新的 user account
现在3台机器,k8s1、k8s2 和 k8s_user ,
k8s_user 上生成私钥
openssl genrsa -out client.key 2048
生成csr
openssl req -new -key client.key -out client.csr -subj "/CN=lizhe"
确认服务器上的 Kubernetes 根证书
我这里是 /etc/kubernetes/ssl
在Kubernetes节点 k8s1 上找到下面两个文件,转存到 k8s_user
kube-ca-key.pem 和 kube-ca.pem
k8s_user上
生成 client.crt
openssl x509 -req -in client.csr -CA /home/lizhe/works/ssl/kube-ca.pem -CAkey /home/lizhe/works/ssl/kube-ca-key.pem -CAcreateserial -out client.crt -days 365
这是错误的情况
如果一切顺利的话
不校验server端证书
curl --cert ./client.crt --key ./client.key --insecure -s https://k8s1.me:6443/api
校验server端证书
curl --cert ./client.crt --key ./client.key --cacert /home/lizhe/works/ssl/kube-ca.pem -s https://k8s1.me:6443/api
上面的用户 lizhe 会被分配到 group system:authenticated
这个 group 默认携带 以下 3 个 clusterrole
system:public-info-viewer
system:discovery
system:basic-user
访问 api 还是可以的,但是要访问 pod,基本没戏
curl --cert ./client.crt --key ./client.key --cacert /home/lizhe/works/ssl/kube-ca.pem -s https://k8s1.me:6443/api/v1/namespaces/default/pods
创建一个可以 list pod 的 clusterrole,然后绑定 用户 lizhe 到 podrole
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
namespace: default
name: podrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
EOF
kubectl create rolebinding podrolebinding -n default --clusterrole podrole --user lizhe
curl --cert ./client.crt --key ./client.key --cacert /home/lizhe/works/ssl/kube-ca.pem -s https://k8s1.me:6443/api/v1/namespaces/default/pods