#amazon-web-services #kubernetes #kubernetes-ingress #amazon-eks #aws-load-balancer
Вопрос:
Попытка развернуть контроллер aws-балансировщика нагрузки на Kubernetes.
У меня есть следующий код TF:
resource "kubernetes_deployment" "ingress" {
metadata {
name = "alb-ingress-controller"
namespace = "kube-system"
labels = {
app.kubernetes.io/name = "alb-ingress-controller"
app.kubernetes.io/version = "v2.2.3"
app.kubernetes.io/managed-by = "terraform"
}
}
spec {
replicas = 1
selector {
match_labels = {
app.kubernetes.io/name = "alb-ingress-controller"
}
}
strategy {
type = "Recreate"
}
template {
metadata {
labels = {
app.kubernetes.io/name = "alb-ingress-controller"
app.kubernetes.io/version = "v2.2.3"
}
}
spec {
dns_policy = "ClusterFirst"
restart_policy = "Always"
service_account_name = kubernetes_service_account.ingress.metadata[0].name
termination_grace_period_seconds = 60
container {
name = "alb-ingress-controller"
image = "docker.io/amazon/aws-alb-ingress-controller:v2.2.3"
image_pull_policy = "Always"
args = [
"--ingress-class=alb",
"--cluster-name=${local.k8s[var.env].esk_cluster_name}",
"--aws-vpc-id=${local.k8s[var.env].cluster_vpc}",
"--aws-region=${local.k8s[var.env].region}"
]
volume_mount {
mount_path = "/var/run/secrets/kubernetes.io/serviceaccount"
name = kubernetes_service_account.ingress.default_secret_name
read_only = true
}
}
volume {
name = kubernetes_service_account.ingress.default_secret_name
secret {
secret_name = kubernetes_service_account.ingress.default_secret_name
}
}
}
}
}
depends_on = [kubernetes_cluster_role_binding.ingress]
}
resource "kubernetes_ingress" "app" {
metadata {
name = "owncloud-lb"
namespace = "fargate-node"
annotations = {
"kubernetes.io/ingress.class" = "alb"
"alb.ingress.kubernetes.io/scheme" = "internet-facing"
"alb.ingress.kubernetes.io/target-type" = "ip"
}
labels = {
"app" = "owncloud"
}
}
spec {
backend {
service_name = "owncloud-service"
service_port = 80
}
rule {
http {
path {
path = "/"
backend {
service_name = "owncloud-service"
service_port = 80
}
}
}
}
}
depends_on = [kubernetes_service.app]
}
Это работает до версии 1.9
по мере необходимости. Как только я обновлюсь до версии 2.2.3
, модуль не сможет обновиться, и в модуле появится следующая ошибка: {"level":"error","ts":1629207071.4385357,"logger":"setup","msg":"unable to create controller","controller":"TargetGroupBinding","error":"no matches for kind "TargetGroupBinding" in version "elbv2.k8s.aws/v1beta1""}
Я прочитал обновление документа и внес изменения в политику IAM, как они утверждают, но в них также упоминается:
обновление CRD для привязки целевых групп
И это там, где я не уверен, как это сделать с помощью terraform
Если я попытаюсь выполнить развертывание в новом кластере (например, не обновление с версии 1.9, я получу ту же ошибку) Я получаю ту же ошибку.
Ответ №1:
С помощью кода Terraform вы применяете Deployment
ресурс и Ingress
ресурс, но вы также должны добавить CustomResourceDefinitions
для TargetGroupBinding
пользовательского ресурса.
Это описано в разделе «Добавление контроллера в кластер» в документации по установке контроллера балансировщика нагрузки — с примерами для Helm и Kubernetes Yaml.
Terraform поддерживает бета-версию для применения CRD, включая пример развертывания CustomResourceDefinition.
Комментарии:
1. ладно, спасибо за это … просто интересно, есть ли у вас или знаете ли вы какой-либо онлайн-ресурс, который вы рекомендуете о том, как вы могли бы запускать команды управления с помощью terraform ?
2. @alexis Я обновил свой ответ с поддержкой бета-версии Terraform для CRD, включая ссылку на пример применения пользовательских определений ресурсов.
3. Большое спасибо!. Я уверен, что этого достаточно для меня, чтобы понять это и забрать отсюда. Еще раз спасибо за потраченное время