Я создаю Namespace
в кластере кубов и устанавливаю свое приложение в этом пространстве имен. Приложение отправляет регулярные запросы сердцебиения на сервер и, если оно получает «удалить себя» ответ от сервера, оно удаляет себя, вызывая delete во всем пространстве имен куба. Я также предоставляю кластеру приложений широкий доступ, создав ClusterRoleBinding
, сделав ServiceAccount
подчиненным ClusterRoleBinding
и запустив модуль с этим ServiceAccount
.
. Проблема в том, что я хочу удалить ClusterRoleBinding
как часть процесса самостоятельного удаления приложения (если это возможно). Если я удалю ClusterRoleBinding
до этого, приложение не сможет выполнить удаление на Namespace
, поэтому это похоже на проблему курицы и яйца. Есть ли способ сделать это?
Это то, что я уже пытался безрезультатно:
Добавлен обработчик PreStop в контейнере приложения. Так что теперь, когда приложение вызывает delete во всем пространстве имен, kube вызывает этот обработчик перед тем, как уничтожить контейнер. В этом обработчике PreStop, если я сплю более 5 сек c перед вызовом удаления на ClusterRoleBinding
, я получаю "Несанкционированный" ответ от kubernetes.
Это привело меня к мысли, что, возможно, ServiceAccount
, связанный с ClusterRoleBinding
, будет удален до того, как приложение сможет удалить ClusterRoleBinding
в обработчике PreStop. Таким образом, чтобы проверить это, перед выдачей delete в Пространстве имен я добавляю финализатор к ServiceAccount
, затем в обработчике PreStop жду 5 se c, выдача delete на ClusterRoleBinding
(снова get "Unauthorized «ошибка возвращается», , затем я получаю объект ServiceAccount
по имени (возвращает ошибку «Несанкционированный») , удаляем финализатор из ServiceAccount
(ошибка получения »= "финализатор не существует для объекта ''") , потому что он не может удалить финализатор для пустого объекта. Когда я использую kubectl, я обнаружил, что ServiceAccount
существует, но находится в "Завершается" состояние, как и ожидалось, с финализатором по-прежнему установлен.
Отменяет ли kube доступ, когда ServiceAccount
находится в состоянии "Terminating"
, даже если он еще не удален?
Есть ли способ удалить ClusterRoleBinding
и Namespace
из того же процесса, который выполняется в Namespace
, который необходимо удалить? (Учитывая, что ClusterRoleBinding
мы хотим удалить дает приложению разрешение на удаление Namespace
в первую очередь)
Любая помощь будет принята с благодарностью!
Определения YAML для ClusterRoleBinding
и ServiceAccount
приведены ниже:
### ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
creationTimestamp: null
name: xyz-myapp-cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: xyz
namespace: xyz-myapp
### ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: null
name: xyz
namespace: xyz-myapp
Соответствующие журналы приложений:
time="2020-02-18T16:08:33Z" level=info msg="App instructed to remove itself"
time="2020-02-18T16:08:33Z" level=info msg="Created finalizer 'xyz.myapp.com/my-finalizer' on ServiceAccount"
time="2020-02-18T16:08:33Z" level=info msg="Called delete on Namespace"
time="2020-02-18T16:08:38Z" level=info msg="PreStop handler called"
time="2020-02-18T16:08:38Z" level=info msg="----- sleeping for 5 sec -----"
time="2020-02-18T16:08:43Z" level=info msg="Deleting ClusterRoleBinding"
time="2020-02-18T16:08:43Z" level=warning msg="Failed to delete ClusterRoleBinding" error="Unexpected error removing ClusterRolebinding: Unauthorized"
time="2020-02-18T16:08:43Z" level=warning msg="Failed to get ServiceAccount" error=Unauthorized
time="2020-02-18T16:08:43Z" level=warning msg="Failed to remove finalizer from ServiceAccount" error="finalizer 'xyz.myapp.com/my-finalizer' doesn't exist for object ''"