#azure #kubernetes #terraform #terraform-provider-azure
#azure #kubernetes #terraform #terraform-provider-azure
Вопрос:
Текущее состояние: у меня есть все службы в кластере и только в одной resource_group. Моя проблема в том, что мне приходится каждый раз запускать все службы, и мое развертывание становится медленным.
Что я хочу сделать: я хочу разделить каждую службу в моем каталоге, чтобы я мог развернуть ее отдельно. Теперь у меня есть серверная часть для каждой службы, так что у нее может быть свое собственное удаленное состояние, и при развертывании ничего не изменится. Однако могу ли я по-прежнему использовать все службы в одной и той же resource_group? Если да, то как я могу этого добиться? Если мне нужно создать группу ресурсов для каждой службы, которую я хочу развернуть отдельно, могу ли я по-прежнему использовать тот же кластер?
main.tf
provider "azurerm" {
version = "2.23.0"
features {}
}
resource "azurerm_resource_group" "main" {
name = "${var.resource_group_name}-${var.environment}"
location = var.location
timeouts {
create = "20m"
delete = "20m"
}
}
resource "tls_private_key" "key" {
algorithm = "RSA"
}
resource "azurerm_kubernetes_cluster" "main" {
name = "${var.cluster_name}-${var.environment}"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
dns_prefix = "${var.dns_prefix}-${var.environment}"
node_resource_group = "${var.resource_group_name}-${var.environment}-worker"
kubernetes_version = "1.18.6"
linux_profile {
admin_username = var.admin_username
ssh_key {
key_data = "${trimspace(tls_private_key.key.public_key_openssh)} ${var.admin_username}@azure.com"
}
}
default_node_pool {
name = "default"
node_count = var.agent_count
vm_size = "Standard_B2s"
os_disk_size_gb = 30
}
role_based_access_control {
enabled = "false"
}
addon_profile {
kube_dashboard {
enabled = "true"
}
}
network_profile {
network_plugin = "kubenet"
load_balancer_sku = "Standard"
}
timeouts {
create = "40m"
delete = "40m"
}
service_principal {
client_id = var.client_id
client_secret = var.client_secret
}
tags = {
Environment = "Production"
}
}
provider "kubernetes" {
version = "1.12.0"
load_config_file = "false"
host = azurerm_kubernetes_cluster.main.kube_config[0].host
client_certificate = base64decode(
azurerm_kubernetes_cluster.main.kube_config[0].client_certificate,
)
client_key = base64decode(azurerm_kubernetes_cluster.main.kube_config[0].client_key)
cluster_ca_certificate = base64decode(
azurerm_kubernetes_cluster.main.kube_config[0].cluster_ca_certificate,
)
}
backend.tf (для основного)
terraform {
backend "azurerm" {}
}
client.tf (служба, которую я хочу развернуть отдельно)
resource "kubernetes_deployment" "client" {
metadata {
name = "client"
labels = {
serviceName = "client"
}
}
timeouts {
create = "20m"
delete = "20m"
}
spec {
progress_deadline_seconds = 600
replicas = 1
selector {
match_labels = {
serviceName = "client"
}
}
template {
metadata {
labels = {
serviceName = "client"
}
}
}
}
}
}
resource "kubernetes_service" "client" {
metadata {
name = "client"
}
spec {
selector = {
serviceName = kubernetes_deployment.client.metadata[0].labels.serviceName
}
port {
port = 80
target_port = 80
}
}
}
backend.tf (для клиента)
terraform {
backend "azurerm" {
resource_group_name = "test-storage"
storage_account_name = "test"
container_name = "terraform"
key="test"
}
}
deployment.sh
terraform -v
terraform init
-backend-config="resource_group_name=$TF_BACKEND_RES_GROUP"
-backend-config="storage_account_name=$TF_BACKEND_STORAGE_ACC"
-backend-config="container_name=$TF_BACKEND_CONTAINER"
terraform plan
terraform apply -target="azurerm_resource_group.main" -auto-approve
-var "environment=$ENVIRONMENT"
-var "tag_version=$TAG_VERSION"
PS: При необходимости я могу создать тестовую группу ресурсов с нуля. Не беспокойтесь о его текущем состоянии.
PS2: Файлы состояния сохраняются в нужном месте, с этим проблем нет.
Ответ №1:
Если вы хотите развернуть ресурсы отдельно, вы могли бы взглянуть на terraform apply
с помощью этого параметра.
-target=resource Resource to target. Operation will be limited to this
resource and its dependencies. This flag can be used
multiple times.
Например, просто разверните группу ресурсов и ее зависимости следующим образом,
terraform apply -target="azurerm_resource_group.main"
Комментарии:
1. Даже если мое развертывание не завершается с ошибкой, мой клиент не обновляется. Вот результат, который я получаю: применить завершено! Ресурсы: 0 добавлено, 0 изменено, 0 уничтожено.
2. Вы просто обновляете ресурс (редактируете исходный файл terraform) вместо развертывания нового? Не могли бы вы удалить старый файл состояния, а затем развернуть эти ресурсы отдельно?
3. Я полностью удалил старую группу ресурсов. Я только что обнаружил, что при запуске terraform plan отображаются правильные обновления. Я думаю, что то, что я делаю -target=»azurerm_resource_group.main», неверно.
4. Не могли бы вы удалить свои старые файлы состояния или переименовать их и развернуть ресурсы в качестве моего ответа? Поскольку terraform apply полагается на ваш старый файл состояний. Если ресурс отображается в файле состояния, то
terraform apply
ничего не делает. Для короткого теста вы можете просто создать группу ресурсов с помощью виртуальной сети.5. Как вы сказали, я удалил оба своих файла состояния, а также перестроил кластер перед запуском нового кода. У меня все та же проблема, изменения клиента не применяются к моей основной группе ресурсов / кластеру.