Как выкатить новую версию контейнера в капсуле на Kubernetes, используя Terraform? - PullRequest
0 голосов
/ 17 декабря 2018

Пока я изучал Kubernetes и Terraform, я создавал пример микросервисов Node.js.

Пока все идет хорошо, и с помощью нескольких команд я могу подготовить кластер Kubernetes иразверните на нем несколько микросервисов Node.js.

Полный пример доступен на GitHub: https://github.com/ashleydavis/nodejs-microservices-example

Вы можете увидеть полную настройку кластера и модулей в этом файле:https://github.com/ashleydavis/nodejs-microservices-example/blob/master/scripts/infrastructure/kubernetes/kubernetes.tf

Например, один из модулей определен следующим образом:

resource "kubernetes_pod" "web" {
  metadata {
    name = "nodejs-micro-example-web"

    labels {
      name = "nodejs-micro-example-web"
    }
  }

  spec {
    container {
      image = "${var.docker_registry_name}.azurecr.io/web:${var.version}"
      name  = "nodejs-micro-example-web"
    }
  }
}

Все отлично работает при первоначальном развертывании, но я не могу заставить систему обновитькогда я изменяю код и создаю новые версии образов Docker.

Когда я делаю это, я обновляю переменную «version», которую вы можете видеть в предыдущем фрагменте кода.

Когда явпоследствии запустив terraform apply, я получаю следующую ошибку, говорящую о том, что модуль уже существует:

kubernetes_pod.web: pods "nodejs-micro-example-web" already exists

Поэтому мой вопрос заключается в том, как использовать Kubernetes и Terraform для развертывания обновлений кода (то есть обновлениеed Docker images) и новые модули будут развернуты в кластере?(и в то же время очистить старые капсулы).

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Чтобы ответить на мой собственный вопрос ... Сейчас я использую развертывание Kubernetes в своем скрипте Terraform для предоставления модуля, и это хорошо работает.

Пример полного кода на Github .

Это конфигурация:

resource "kubernetes_deployment" "web" {
  metadata {
    name = "web"

    labels {
      test = "web"
    }
  }

  spec {
    replicas = 1

    selector {
      match_labels {
        test = "web"
      }
    }

    template {
      metadata {
        labels {
          test = "web"
    }
  }

  spec {
    container {
      image = "${var.docker_registry_name}.azurecr.io/web:${var.version}"
      name  = "web"

          port {
            container_port = 80
          }
        }
      }
    }
  }
}
0 голосов
/ 17 декабря 2018

Это следующая строка, которая неверна:

    name = "nodejs-micro-example-web"

, потому что имя модуля уникально в его пространстве имен.

Вы почти никогда не хотите развернуть автономныйPod, потому что kubernetes считает их эфемерными.Обычно это не проблема, потому что блоки создаются под наблюдением Deployment или ReplicationController (или нескольких других, но, надеюсь, вы поняли идею).В вашем случае, если ^ H ^ H, когда этот Pod упадет, kubernetes не перезапустит его, и тогда весьма неплохо поспорить, что исход сведет на нет большую часть значения, которое kubernetes привносит в ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...