创建用户认证授权的 kubeconfig 文件
当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就需要对用户的身份进行认证和对其权限做出限制。
Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) 两种:
- UserAccount是给kubernetes集群外部用户使用的,例如运维或者集群管理人员,使用kubectl命令时用的就是UserAccount账户;UserAccount是全局性。在集群所有namespaces中,名称具有唯一性,默认情况下用户为admin;
- ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户;ServiceAccount仅局限它所在的namespace,每个namespace都会自动创建一个default service account;创建Pod时,如果没有指定Service Account,Pod则会使用default Service Account。
前提
- 使用kubeadm安装的集群,所有的证书文件都在/etc/kubernetes/pki目录下
- 可以访问kubernetes集群,并用于最高管理员权限
通过服务账户创建
获取集群的api
USER=test
NAMESPACE=test
export KUBE_APISERVER=`kubectl config view -ojsonpath='{.clusters[0].cluster.server}'`
创建一个sa用户
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${USER}
namespace: ${NAMESPACE}
labels:
sa: ${USER}-${NAMESPACE}
EOF
获取该用户的token
DASH_TOCKEN=$(kubectl -n ${NAMESPACE} get secrets `kubectl get sa -n ${NAMESPACE} -l sa=${USER}-${NAMESPACE} -ojsonpath={.items[0].secrets[0].name}` -o jsonpath={.data.token} |base64 -d)
1、创建角色role.yaml
在 RBAC API 中,一个角色包含了一套表示一组权限的规则。 权限以纯粹的累加形式累积(没有” 否定” 的规则)。 角色可以由命名空间(namespace)内的 Role 对象定义,而整个 Kubernetes 集群范围内有效的角色则通过 ClusterRole 对象实现。
cat <<EOF | kubectl apply -f -
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: ${NAMESPACE} #执行命名空间
name: ${USER} #role名字
rules:
- apiGroups: ["*"]
resources: ["*"] #可操作资源
verbs: ["get","watch","list","create","update","patch","delete"] #可以操作动作
EOF
2、创建角色绑定rolebinding.yaml
cat <<EOF | kubectl apply -f -
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ${USER}
namespace: ${NAMESPACE}
subjects:
- kind: ServiceAccount
name: ${USER}
namespace: ${NAMESPACE}
roleRef:
kind: Role
name: ${USER}
apiGroup: rbac.authorization.k8s.io
EOF
3、更改集群配置和用户上下文环境
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=${USER}-sa.kubeconfig
kubectl config set-credentials ${USER} --token=$DASH_TOCKEN --kubeconfig=${USER}-sa.kubeconfig
kubectl config set-context ${USER}@kubernetes --cluster=kubernetes --user=${USER} --kubeconfig=${USER}-sa.kubeconfig
kubectl config use-context ${USER}@kubernetes --kubeconfig=${USER}-sa.kubeconfig
4、切换角色,进行验证
kubectl get all -n ${NAMESPACE} --kubeconfig=${USER}-sa.kubeconfig
使用范围:
- 生成的kubeconfig和token可以给官方的dashboard使用
- kubectl使用
通过用户账户创建
USER=dev
NAMESPACE=dev
DIR_HOME=$(dirname $(realpath ${BASH_SOURCE[0]}))
export KUBE_APISERVER=`kubectl config view -ojsonpath='{.clusters[0].cluster.server}'`
1、创建证书key
openssl genrsa -out ${USER}.key 2048
openssl req -new -key ${USER}.key -out ${USER}.csr -subj "/CN=${USER}"
openssl x509 -req -in ${USER}.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ${USER}.crt -days 3650
2、更改集群配置和用户上下文环境
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=${USER}.kubeconfig
kubectl config set-credentials ${USER} --client-certificate=${DIR_HOME}/${USER}.crt --client-key=${DIR_HOME}/${USER}.key --embed-certs=true --kubeconfig=${USER}.kubeconfig
kubectl config set-context ${USER}@kubernetes --cluster=kubernetes --user=${USER} --kubeconfig=${USER}.kubeconfig
kubectl config use-context ${USER}@kubernetes --kubeconfig=${USER}.kubeconfig
3、切换回管理员身份
kubectl config use-context kubernetes-admin@kubernetes
4、创建角色role.yaml
cat <<EOF | kubectl apply -f -
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: ${NAMESPACE} #执行命名空间
name: ${USER} #role名字
rules:
- apiGroups: ["*"]
resources: ["*"] #可操作资源
verbs: ["get","watch","list","create","update","patch","delete"] #可以操作动作
EOF
5、创建角色绑定rolebinding.yaml
cat <<EOF | kubectl apply -f -
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ${USER}
namespace: ${NAMESPACE}
subjects:
- kind: User
name: ${USER}
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: ${USER}
apiGroup: rbac.authorization.k8s.io
EOF
6、切换角色,进行验证
kubectl config use-context ${USER}@kubernetes --kubeconfig=${USER}.kubeconfig
kubectl get all -n ${NAMESPACE}
7、切换回管理员身份
kubectl config use-context kubernetes-admin@kubernetes
创建dashboard访问token
创建用户
# dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
获取 token:
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"