Всем привет!
Интересная статья от Rory McCune, где он размышляет о секретах в Kubernetes. При создании ServiceAccount (SA) Kubernetes создает ей Secret. Но можно сделать и наоборот – при создании Secret с использованием Annotations можно указать к какой SA он должен «прикрепиться».
А что, если указать несуществующую SA? Применить такой манифест получится, в ответ мы получим, что Secret был создан, вот только… его не будет. Rory попробовал сделать аналогичное упражнение с существующей SA – все работает. Забавно, что при Edit-операции и изменения существующей SA на несуществующую Secret опять пропадет. При этом он пропадет и из ETCD.
Причиной стал один их многих Controllers K8S, а именно – Token Controller, который, в том числе «watches ServiceAccount token Secret addition, and ensures the referenced ServiceAccount exists, and adds a token to the Secret if needed», но удаляет ли он что-либо?
Для проверки гипотезы (что Token Controller удаляет Secret при отсутствии валидной SA) Rory сделал простенькую Audit Policy и посмотрел, что именно ему вернет Kube-ApiServer при попытке создания Secret. Итог –
"kind": "DeleteOptions". Такое вот интересное поведение, подробнее о котором можно прочесть в самой статье.