Одним прекрасным утром девелоперы пожаловались, что не создаются AWS LoadBalancer из Ingress нашего Dev-кластера Kubernetes (AWS EKS).
Балансеры создаются через AWS ALB Controller, см. AWS Elastic Kubernetes Service: запуск ALB Ingress controller.
Сама ошибка в лога контроллера выглядела так:
E0304 07:12:38.595113 1 controller.go:217] kubebuilder/controller «msg»=»Reconciler error» «error»=»no object matching key \»test-namespace/test-ingress\» in local store» «controller»=»alb-ingress-controller» «request»={«Namespace»:»test-namespace»,»Name»:»test-ingress»}
E0304 07:12:39.610204 1 controller.go:217] kubebuilder/controller «msg»=»Reconciler error» «error»=»failed to build LoadBalancer configuration due to failed to get AWS tags. Error: InvalidSignatureException: Signature not yet current: 20210304T071239Z is still later than 20210304T071056Z (20210304T070556Z + 5 min.)\n\tstatus code: 400, request id: 0ee08317-ca50-4b20-b136-49e6dda2b4ff» «controller»=»alb-ingress-controller» «request»={«Namespace»:»test-namespace»,»Name»:»test-ingress»}
Сам текст «20210304T071239Z is still later than 20210304T071056Z» подсказало направление мысли, а быстрое гугление по запросу «InvalidSignatureException: Signature not yet current» привело к этому треду в Github Issues, где обсуждается AWS SDK и проблема с синхронизацией времени.
Пробуем просто пересоздать под с ALB Controller — по идее, после рестарта он начнёт правильно отсчитывать время, и всё заработает.
Находим деплоймент контроллера:
[simterm]
$ kk -n kube-system get deploy NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 96d
[/simterm]
Скейлим в ноль:
[simterm]
$ kk -n kube-system scale deploy alb-ingress-controller --replicas=0 deployment.apps/alb-ingress-controller scaled
[/simterm]
Обратно в 1 под:
[simterm]
$ kk -n kube-system scale deploy alb-ingress-controller --replicas=1 deployment.apps/alb-ingress-controller scaled
[/simterm]
Проверяем под:
[simterm]
$ kk -n kube-system get pod | grep alb alb-ingress-controller-7bd97f99bb-bzzdm 1/1 Running 0 4s
[/simterm]
Пересоздаём тестовый Ingress:
[simterm]
$ kk -n test-namespace get ingress NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress <none> * aadca942-testnamespace-tes-***.us-east-2.elb.amazonaws.com 80 4m53s
[/simterm]
Всё заработало.
Позже нашёл ещё один пост на эту тему — идея с рестартом пода была правильной, см. Solving «Signature not yet current» Error When Using AWS in Docker.