Kubernetes. Добавить пользователя админа
Помогите, пожалуйста с rbac. Пытаюсь создать юзера с правами admin.
ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin-test
rules:
- apiGroups: [""]
#
# at the HTTP level, the name of the resource for accessing Secret
# objects is "secrets"
resources: ["all"]
verbs: ["get", "watch", "list", "admin", "edit", "view"]
Cluster-role-binding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-test-global
subjects:
- kind: User
name: user1
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: admin-test
apiGroup: rbac.authorization.k8s.io
После чего создаю config файл для kubectl с помощью:
kubeadm alpha kubeconfig user --client-name=user1
На выходе получаю:
(Forbidden): pods is forbidden: User "user1" cannot list resource "pods" in API group
Ответы (1 шт):
Тебе не нужно создавать РОЛЬ админа тк она уже есть по умолчанию
Необходимо сгенерить пользователя и повесить через RoleBinding пользователя на существующую роль.
(Чтобы сделать ограниченную роль нужно будет вникать в то какие resources нужны пользователю и описывать их в отдельной роли.)
Ниже листинг скрипта который создаёт пользователя (генерит сертификат) и предоставляет команду для настройки отдельного контекста под этого пользователя
#!/bin/bash
#
# Created: mobilesfinks
#
function usage {
echo "Usage: $0 [K8S_USERNAME] [K8S_GROUP] [KUBECONTEXT]"
echo -e "\tK8S_USERNAME - kuber username for generate cert"
echo -e "\tK8S_GROUP - kuber groupname for generate cert"
echo -e "\tKUBECONTEXT - kuber context for cluster for generate cert"
echo -e "\nExample: ./create_k8s_user.sh SomeUser dev dc01 "
}
if [ $# -ne 3 ]
then
echo "Need 3 arguments"
usage
exit 1
fi
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
base64_args=' -w '
elif [[ "$OSTYPE" == "darwin"* ]]; then
base64_args=''
else
echo "Unknown OS."
exit 1
fi
# Vars
export DIRECTORY=`dirname $0`
export K8S_USERNAME="$1"
export K8S_GROUP="$2"
export KUBECONTEXT="$3"
export USER_DIR="${DIRECTORY}/certs/${KUBECONTEXT}/${K8S_USERNAME}"
#debug
# echo "USER_DIR: ${USER_DIR}"
# Генерация запроса
function encode {
cat $1 | base64 ${base64_args}
}
function gen_csr {
mkdir -p ${USER_DIR}
openssl genrsa -out ${USER_DIR}/${K8S_USERNAME}.key 2048
openssl req -new -key ${USER_DIR}/${K8S_USERNAME}.key -out ${USER_DIR}/${K8S_USERNAME}.csr -subj "/CN=${K8S_USERNAME}/O=${K8S_GROUP}"\n
encode ${USER_DIR}/${K8S_USERNAME}.csr #| base64 -
}
# генерим новый запрос только если ещё нет файла csr
if [ -f "${USER_DIR}"/${K8S_USERNAME}.csr ]; then
export K8S_USERNAME_CSR_enc="$(encode ${USER_DIR}/${K8S_USERNAME}.csr)"
else
export K8S_USERNAME_CSR_enc="$(gen_csr)"
fi
# Генерим запрос для кубера
cat ${DIRECTORY}/templates/k8s_csr.tmpl | envsubst > ${USER_DIR}/k8s_${K8S_USERNAME}-csr.yaml
# отправляем в кубер
kubectl --context ${KUBECONTEXT} apply -f ${USER_DIR}/k8s_${K8S_USERNAME}-csr.yaml
# Подтвержаем сертификата нового пользователя
kubectl --context ${KUBECONTEXT} certificate approve ${K8S_USERNAME}-csr
# Вытаскиваем сертификат пользователя и сохраняем в файл
kubectl --context ${KUBECONTEXT} get csr ${K8S_USERNAME}-csr -o jsonpath='{.status.certificate}'|base64 --decode > ${USER_DIR}/${K8S_USERNAME}.crt
function print_cluster_conf {
deftoken=$(kubectl --context ${KUBECONTEXT} get secrets | grep default-token | awk '{print $1}')
ca_crt=$(kubectl --context ${KUBECONTEXT} get secrets ${deftoken} -o json | jq -r '.data["ca.crt"]')
endpoint=$(kubectl --context ${KUBECONTEXT} config view -o jsonpath="{.clusters[?(@.name == \"${KUBECONTEXT}\")].cluster.server}")
echo "
HOMEDIR=\$(getent passwd \"\$USER\" | cut -d: -f6)
"
echo -e "echo '$ca_crt' | base64 -d > \${HOMEDIR}/.kube/${KUBECONTEXT}_ca.crt \n"
echo -e "kubectl config set-cluster ${KUBECONTEXT} --embed-certs=true --server=$endpoint --certificate-authority=\${HOMEDIR}/.kube/${KUBECONTEXT}_ca.crt"
}
function print_set_contex_params {
# У пользователя
USER_CERT_ENC=$( encode ${USER_DIR}/${K8S_USERNAME}.crt)
USER_KEY_ENC=$(encode ${USER_DIR}/${K8S_USERNAME}.key)
echo "
HOMEDIR=\$(getent passwd \"\$USER\" | cut -d: -f6)
echo "${USER_CERT_ENC}" |base64 -d > \${HOMEDIR}/.kube/${KUBECONTEXT}-${K8S_USERNAME}.crt
echo "${USER_KEY_ENC}" |base64 -d > \${HOMEDIR}/.kube/${KUBECONTEXT}-${K8S_USERNAME}.key
kubectl config set-credentials ${K8S_USERNAME} --client-certificate=\${HOMEDIR}/.kube/${KUBECONTEXT}-${K8S_USERNAME}.crt --client-key=\${HOMEDIR}/.kube/${KUBECONTEXT}-${K8S_USERNAME}.key
kubectl config set-context ${K8S_USERNAME} --cluster=${KUBECONTEXT} --user=${K8S_USERNAME}
"
} # end function get sa
echo -e "#######################################################"
echo -e "####### Команды для добавления кластера ${KUBECONTEXT}"
echo -e "####### Выполнить у пользователя ######################"
echo -e "#######################################################"
print_cluster_conf
echo -e '\n'
echo -e "#######################################################"
echo -e "####### Команды для добавления контекста ${KUBECONTEXT}-${K8S_USERNAME}"
echo -e "####### Выполнить у пользователя ######################"
echo -e "#######################################################"
print_set_contex_params
После генерации пользователя добавляем примерно такой ClusterRoleBinding (RoleBinding)
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: allow-all_admins
subjects:
- kind: User
name: SomeUser
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io