Одним прекрасным утром девелоперы пожаловались, что не создаются 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.