====== Kubernetes: RBAC теория ======
{{ :devops:k8s:picture.png?nolink&810x364 }}
===== Доступ по сертификату. =====
В Kubernetes пользователей как таковых нет. Но можно эмулировать доступ пользователя используя ssl сертификаты. Для этого имя пользователя добавляют в dn сертификата. Например:
cn=user,dc=cluster,dc=local
Генерируем ключ пользователя.
# openssl genrsa -out user.key 4096
Создадим временную директорию.
# mkdir users
# cd users/
Создадим конфигурационный файл opessl csr.cnf.
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = user
DC = cluster
DC = local
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
Генерируем запрос на сертификат.
# openssl req -config csr.cnf -new -key user.key -nodes -out user.csr
Поместим содержимое файла csr в формате base64 в переменную среды окружения BASE64_CSR:
# export BASE64_CSR=$(cat user.csr | base64 | tr -d '\n')
Создаём файл csr.yaml с запросом на подпись:
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: user_csr
spec:
groups:
- system:authenticated
request: ${BASE64_CSR}
usages:
- digital signature
- key encipherment
- server auth
- client auth
Применяем запрос.
# cat csr.yaml | envsubst | kubectl apply -f -
Проверяем наличие запроса:
# kubectl get csr
Подписываем и генерируем сертификат:
# kubectl certificate approve user_csr
Поместим сертификат пользователя в файл.
# kubectl get csr user_csr -o jsonpath={.status.certificate} | base64 --decode> user.crt
Создание файла config\\
Получаем информацию о подключении к кластеру.
# kubectl cluster-info
Нас интересует строка
Kubernetes master is running at https://192.168.218.49:6443
Начинаем создавать файл конфигурации.\ Сначала добавим информацию о кластере.
# kubectl config --kubeconfig=./config set-cluster k8s --server=https://192.168.218.49:6443 \
--certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true
Добавляем пользователя.
# kubectl config --kubeconfig=./config set-credentials user --client-key=user.key --client-certificate=user.crt --embed-certs=true
Определяем контекст.
# kubectl config --kubeconfig=./config set-context default --cluster=k8s --user=user --namespace kubetest
Устанавливаем контекст по умолчанию.
# kubectl config --kubeconfig=./config use-context default
Проверяем доступ к серверу
# kubectl --kubeconfig=./config -n kubetest get pods
Мы должны получить сообщение об ошибке доступа пользователя artur к ресурсу. Это нормально. На данном этапе мы сконфигурировали доступ к кластеру для пользователя – конфигурационный файл для программы kubectl.
Доступ к элементам API кластера мы будем описывать отдельно.
Скопируйте полученный config файл в домашнюю директорию пользователя artur:
# mkdir /home/user/.kube
# cp config /home/user/.kube
# chown -R user:user /home/user/.kube
===== ServiceAccount =====
ServiveAccount используют для доступа к API Kubernetes из приложений.\\
Когда в системе создаётся pod, ему по умолчанию присваивается default ServiceAccount текущего namespace.\\
Посмотреть ServiceAccount в namespace можно следующим образом:
# kubectl -n kubetest get serviceaccounts
Создавать ServiceAccount можно прямо в командной строке:
# kubectl -n kubetest create serviceaccount testaccount
Или при помощи yaml файла:
apiVersion: v1
kind: ServiceAccount
metadata:
name: testaccount
namespace: kubetest
# kubectl apply -f file.yaml
Если приложение (pod) запускается без явного указания ServiceAccount, ему присваивается ServiceAccount default.
Для определения ServiceAccount, при описании пода используйте serviceAccountName.
При запуске приложения ему автоматически подключается директория /var/run/secrets/kubernetes.io/serviceaccount в которой находятся файлы:
* ca.crt – сертификат CA кластера.
* Namespace – содержит имя namespace, в котором находится pod.
* token – содержит токен, используемый для доступа к API кластера.
Если вы хотите получать доступ к API кластера не из приложения, а, например из командной строки при помощи curl. Необходимо получить токен соответствующего ServiceAccount:
# kubectl -n kubetest get secret $(kubectl -n kubetest get serviceaccount kubetest-account \
-o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 –decode