Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revisionBoth sides next revision | ||
devops:kubernetes [2021/02/16 18:46] – [Настройка client в keycloak] admin | devops:kubernetes [2022/03/04 05:11] – [Headless Services для Stafullset] admin | ||
---|---|---|---|
Line 309: | Line 309: | ||
В список: | В список: | ||
kubectl -n elasticsearch patch sts es-data --type=json -p=' | kubectl -n elasticsearch patch sts es-data --type=json -p=' | ||
+ | Добавляем порт для контейнера в **Deployment**: | ||
+ | kubectl patch deployment mcs-api --type=json -p=' | ||
===== Патчинг нескольких значений за раз ===== | ===== Патчинг нескольких значений за раз ===== | ||
Line 350: | Line 352: | ||
set -e | set -e | ||
- | KUB_CONTEXT=' | + | KUB_CONTEXT=' |
- | KUB_USERNAME=' | + | KUB_USERNAME=' |
- | KUB_USERGROUP=' | + | KUB_USERGROUP=' |
#cluster or ns (namespace) | #cluster or ns (namespace) | ||
# | # | ||
AUTH_SCOPE=' | AUTH_SCOPE=' | ||
# If AUTH_SCOPE = ns then we need namespace name | # If AUTH_SCOPE = ns then we need namespace name | ||
- | KUB_NAMESPACE=' | + | KUB_NAMESPACE=' |
- | KUB_ROLE_NAME='app-dev-full' | + | KUB_ROLE_NAME=" |
# Comma separated quoted - '" | # Comma separated quoted - '" | ||
KUB_ROLE_APIGROUPS='" | KUB_ROLE_APIGROUPS='" | ||
KUB_ROLE_RESOURCES='" | KUB_ROLE_RESOURCES='" | ||
- | KUB_ROLE_VERBS='" | + | KUB_ROLE_VERBS='" |
echo " | echo " | ||
Line 447: | Line 449: | ||
name: ${KUB_USERGROUP} | name: ${KUB_USERGROUP} | ||
apiGroup: rbac.authorization.k8s.io | apiGroup: rbac.authorization.k8s.io | ||
- | roleRef: | + | roleRef: |
- | kind: ClusterRole | + | kind: ClusterRole |
name: ${KUB_ROLE_NAME} | name: ${KUB_ROLE_NAME} | ||
- | | + | |
EOF | EOF | ||
fi | fi | ||
Line 477: | Line 479: | ||
name: ${KUB_USERGROUP} | name: ${KUB_USERGROUP} | ||
apiGroup: rbac.authorization.k8s.io | apiGroup: rbac.authorization.k8s.io | ||
- | roleRef: | + | roleRef: |
- | kind: Role | + | kind: Role |
name: ${KUB_ROLE_NAME} | name: ${KUB_ROLE_NAME} | ||
- | | + | |
EOF | EOF | ||
fi | fi | ||
Line 508: | Line 510: | ||
current-context: | current-context: | ||
EOF | EOF | ||
+ | |||
+ | kubectl delete certificatesigningrequests ${KUB_USERNAME}_csr | ||
</ | </ | ||
===== Создание закрытого ключа пользователя и запроса сертификата ===== | ===== Создание закрытого ключа пользователя и запроса сертификата ===== | ||
Line 652: | Line 656: | ||
current-context: | current-context: | ||
EOF</ | EOF</ | ||
+ | ===== Bash-скрипты в init-контейнерах при деплойменте с помощью helm ===== | ||
+ | В чарте в директории files я имею просто скрипт, | ||
+ | Я поменщаю этот скрипт в секрет с помощью такого манифеста: | ||
+ | < | ||
+ | apiVersion: v1 | ||
+ | kind: Secret | ||
+ | metadata: | ||
+ | name: files | ||
+ | type: Opaque | ||
+ | data: | ||
+ | {{ (.Files.Glob " | ||
+ | </ | ||
+ | В деплойменте я запускаю init-контейнер, | ||
+ | < | ||
+ | ... | ||
+ | initContainers: | ||
+ | - name: copy-files | ||
+ | image: docker.rdleas.ru/ | ||
+ | command: | ||
+ | - " | ||
+ | - " | ||
+ | - "cp / | ||
+ | volumeMounts: | ||
+ | - name: files | ||
+ | mountPath: /tmp/files/ | ||
+ | ... | ||
+ | volumes: | ||
+ | - name: files | ||
+ | secret: | ||
+ | secretName: files | ||
+ | </ | ||
+ | то есть мне надо сделать скрипт исполняемым (дать соотвествующие разрешения), | ||
+ | |||
====== Обновление сертификатов ====== | ====== Обновление сертификатов ====== | ||
https:// | https:// | ||
Line 688: | Line 725: | ||
base64 -w 0 ./ | base64 -w 0 ./ | ||
И затем подставляем в поле **client-certificate-data: | И затем подставляем в поле **client-certificate-data: | ||
- | ===== Kubernetes LDAP Auth ===== | + | ====== Kubernetes LDAP Auth ====== |
**LDAP**-аутентификацию к кластеру **kubernetes** можно прикрутить с помощью различных средств, | **LDAP**-аутентификацию к кластеру **kubernetes** можно прикрутить с помощью различных средств, | ||
* Служба каталога с поддрежкой протокола LDAP. Например - Active Directory | * Служба каталога с поддрежкой протокола LDAP. Например - Active Directory | ||
Line 694: | Line 731: | ||
* Некое web-приложение, | * Некое web-приложение, | ||
- | ==== OIDC Providers ==== | + | ===== OIDC Providers |
* Dex | * Dex | ||
* Keycloak | * Keycloak | ||
- | ==== WebApps ==== | + | ===== WebApps |
* Kuberos - https:// | * Kuberos - https:// | ||
* GangWay | * GangWay | ||
* Dex K8s Authenticator | * Dex K8s Authenticator | ||
- | ==== Keycloak + kubelogin ==== | + | ===== Keycloak + kubelogin |
Мне понравился такой вариант - **Keycloak** в качестве OIDC-провайдера и **kubelogin** в качестве способа получения токена. \\ | Мне понравился такой вариант - **Keycloak** в качестве OIDC-провайдера и **kubelogin** в качестве способа получения токена. \\ | ||
- | === Настройка client в keycloak === | + | ==== Настройка client в keycloak |
- | В параметры клиента в **keycloak** в **valid redirect uris** нужно прописать **http:// | + | В параметры клиента в **keycloak** в **valid redirect uris** нужно прописать **http:// |
- | === Настройка кластера kubernetes === | + | ==== Настройка кластера kubernetes |
На каждой мастер-ноде редактируем файл **/ | На каждой мастер-ноде редактируем файл **/ | ||
< | < | ||
Line 731: | Line 768: | ||
oidc-username-claim: | oidc-username-claim: | ||
- | === Настройка клиентской машины === | + | ==== Настройка клиентской машины |
Устанавливаем плагин kubelogin. \\ | Устанавливаем плагин kubelogin. \\ | ||
Скачиваем бинарник https:// | Скачиваем бинарник https:// | ||
Line 756: | Line 793: | ||
name: sbl-apps-dev-oidc</ | name: sbl-apps-dev-oidc</ | ||
- | === Назначение привилегий в кластере === | + | ==== Назначение привилегий в кластере |
Название групп в манифестах должно быть точно таким же как и в токене. В моей инсталляции в начале названия группы есть слеш. \\ | Название групп в манифестах должно быть точно таким же как и в токене. В моей инсталляции в начале названия группы есть слеш. \\ | ||
Права на неймспейс (в даннос лучае - default) выдаем так: | Права на неймспейс (в даннос лучае - default) выдаем так: | ||
Line 808: | Line 845: | ||
</ | </ | ||
- | === Разрешение проблем === | + | ==== Разрешение проблем |
Поглядеть текущий токен можно так: | Поглядеть текущий токен можно так: | ||
kubelogin get-token --oidc-issuer-url=https:// | kubelogin get-token --oidc-issuer-url=https:// | ||
Расшифровать его (и увидеть список групп в нем) можно тут: https:// | Расшифровать его (и увидеть список групп в нем) можно тут: https:// | ||
- | == invalid bearer token, oidc: email not verified == | + | === invalid bearer token, oidc: email not verified |
В логе **kube-apiserver** ошибка | В логе **kube-apiserver** ошибка | ||
Unable to authenticate the request due to an error: [invalid bearer token, oidc: email not verified] | Unable to authenticate the request due to an error: [invalid bearer token, oidc: email not verified] | ||
Line 825: | Line 862: | ||
kubectl --token=$token --server=https:// | kubectl --token=$token --server=https:// | ||
- | ==== Dex + Dex K8s authenticator ==== | + | ===== Dex + Dex K8s authenticator |
https:// | https:// | ||
https:// | https:// | ||
Line 831: | Line 868: | ||
https:// | https:// | ||
- | ==== Keycloak + Gangway ==== | + | ===== Keycloak + Gangway |
https:// | https:// | ||
- | ==== Dex + GangWay ==== | + | ===== Dex + GangWay |
https:// | https:// | ||
Line 842: | Line 879: | ||
https:// | https:// | ||
- | ====== | + | ====== |
- | Мониторинг веб-приложения - graphana | + | Если так случайно вышло, что вы удалили **PersistentVolume**, |
+ | На помощь приходит специальная утилитка: | ||
+ | git clone https:// | ||
+ | cd k8s-reset-terminating-pv | ||
+ | go build -o resetpv | ||
+ | Собранный бинарник: | ||
+ | Заходим на мастер-ноду, | ||
+ | ssh user@master-node | ||
+ | sudo -H tar -cvzf ~/ | ||
+ | sudo docker | ||
+ | exit | ||
+ | В выводе среди всего прочего | ||
+ | < | ||
+ | --cert-file=/ | ||
+ | --key-file=/ | ||
+ | --trusted-ca-file=/ | ||
+ | В вашей инсталляции имена, | ||
+ | И забираем с мастер-ноды кластера архив с сертификатами, | ||
+ | scp user@master-node:/ | ||
+ | tar -xvf ./ | ||
+ | mv ./ | ||
+ | И дальше применяем утилиту: | ||
+ | ./resetpv --etcd-ca ./ca.crt --etcd-cert ./ | ||
+ | Если вдруг так вышло, что вы удалили все PV в кластере (как я - хотел удалить **pvc** в неймспейсе но просто опечатался и вместо **pvc** ввел **pv**): | ||
+ | kubectl delete -n namespace pv --all | ||
+ | то чтобы отменить удаление всех PV делаем так: | ||
+ | PVs=`kubectl get pv | grep Terminating | awk ' | ||
+ | for pv in $PVs; do ./resetpv --etcd-ca ./ca.crt --etcd-cert ./ | ||
+ | |||
+ | ====== Распределить поды деплоймента по разным нодам кластера ====== | ||
+ | < | ||
+ | apiVersion: apps/v1 | ||
+ | kind: Deployment | ||
+ | metadata: | ||
+ | name: my-service | ||
+ | labels: | ||
+ | app: my-service | ||
+ | spec: | ||
+ | replicas: 2 | ||
+ | selector: | ||
+ | matchLabels: | ||
+ | app: my-service | ||
+ | template: | ||
+ | metadata: | ||
+ | labels: | ||
+ | app: my-service | ||
+ | spec: | ||
+ | topologySpreadConstraints: | ||
+ | - maxSkew: 1 | ||
+ | topologyKey: | ||
+ | whenUnsatisfiable: | ||
+ | labelSelector: | ||
+ | matchLabels: | ||
+ | app: my-service | ||
+ | </ | ||
+ | |||
+ | ====== Headless Services для Stafullset ====== | ||
+ | И другие вопросы про то как давать доступ к индивидуальным подам реплик стейтфуллсетов. | ||
+ | https:// | ||
+ | ====== Как скопировать секрет из одного неймспейса в другой ====== | ||
+ | kubectl get secret my-tlssecret --namespace=nginx-ns -o yaml | sed ' |