Как сохранить файлы и / или папки на постоянном диске Google Compute Engine для использования в GKE?

#google-cloud-platform #terraform #google-kubernetes-engine

#google-облачная платформа #терраформирование #google-kubernetes-engine

Вопрос:

У меня есть кластер GKE и постоянный диск Google Compute Engine, созданный terraform. Этот диск используется для создания постоянного тома kubernetes, который затем запрашивается и монтируется в контейнер в модуле.

Что я хочу сделать, так это сохранить некоторые файлы и папки на этом постоянном диске, чтобы при его монтировании мой контейнер мог получить доступ к этим файлам и папкам. Я попытался провести исследование, и, похоже, способ сделать это — подключить диск к вычислительному механизму или даже к контейнеру, затем скопировать и вставить из локального в него.

Есть ли лучший способ? Предпочтительно с использованием terraform.

Вот как определяются эти ресурсы.

 resource "google_compute_disk" "app" {
  name = "app-${var.project_id}"
  type = "pd-standard"
  zone = var.zone
  size = var.volume_size_gb
  labels = {
    environment = var.environment
  }
}

resource "kubernetes_persistent_volume" "app" {
  metadata {
    name = "app-${var.project_id}"
  }
  spec {
    access_modes = ["ReadWriteOnce"]
    capacity = {
      storage = "${var.volume_size_gb}Gi"
    }
    persistent_volume_source {
      gce_persistent_disk {
        pd_name = google_compute_disk.app.name
        fs_type = "ext4"
      }
    }
    storage_class_name = "standard"
  }
}

resource "kubernetes_persistent_volume_claim" "app" {
  metadata {
    name = "app-${var.project_id}"
  }
  spec {
    access_modes = ["ReadWriteOnce"]
    resources {
      requests = {
        storage = "${var.volume_size_gb}Gi"
      }
    }
    volume_name = kubernetes_persistent_volume.app.metadata.0.name
    storage_class_name = "standard"
  }
}

resource "kubernetes_deployment" "core_app" {
  metadata {
    name = "core-app"
    labels = {
      app = "core"
    }
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app = "core"
      }
    }

    template {
      metadata {
        labels = {
          app = "core"
        }
      }
      spec {
        volume {
          name = "app-volume"
          persistent_volume_claim {
            claim_name = kubernetes_persistent_volume_claim.app.metadata.0.name
          }
        }

        container {
          name = "core-app"
          image = "core-image:latest"

          port {
            container_port = 8080
          }

          volume_mount {
            mount_path = "/mnt/extra-addons"
            name = "app-volume"
            sub_path = "addons"
          }

          readiness_probe {
            tcp_socket {
              port = "8069"
            }
            initial_delay_seconds = 5
            period_seconds = 10
          }

          image_pull_policy = "Always"
        }
      }
    }
  }
}
 

Ответ №1:

Способ правильный. Если вы хотите инициализировать диск:

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

Теперь о Terraform, у меня есть мнение, а теперь реальный ответ для вас. Terraform — это инструмент IaC: инфраструктура как код. Это означает: выделенный для инфраструктуры.

В вашем случае вы хотите выполнить «развертывание программного обеспечения». Ресурсы K8S, которые вы развертываете, а также подготовка и монтирование диска и так далее. IMO, Terraform — неподходящий инструмент для этого. У вас есть другие инструменты, такие как Ansible, которые больше подходят для управления программным обеспечением / ОС.

Примечание: я уверен, что с помощью Terraform 0.13 или 0.14 вы можете создать сценарий, который вы можете выполнить и достичь желаемого, но я думаю, что это неправильный путь.