【实践文档】Terraform自动化开通阿里云ACK/ASK服务

  • [x] 账户余额>=100元;

参考文档:

  • https://registry.terraform.io/providers/hashicorp/kubernetes/2.12.1   Kubernetes Provider

  • https://registry.terraform.io/providers/aliyun/alicloud/1.177.0  Alicloud Provider

实验代码库:

  • https://github.com/terraform-group/terraform-aliyun-ack


首先根据web页面了解创建ACK集群所需要的参数,然后再写TF代码;
2af654f4ca66b747e176225c39a19c13.png
5d4e36fb063eca7d43098941a0dd8726.png

2cc63053d65bfc53f20533b4609951cf.png
image.png

e29317817af6baa8a1e6f1990db61d39.png

1. 初始化

provider:   alicloud / kubernetes
配置RAM

export ALICLOUD_ACCESS_KEY="L2Nx"
export ALICLOUD_SECRET_KEY="nAjce5FTE"

f5795130e918926b995f9257d172e04b.png

2. 申请网络资源

resource "alicloud_vpc" "vpc" {
  vpc_name   = "k8s_vpc"
  cidr_block = "172.16.0.0/12"
}

resource "alicloud_vswitch" "vsw" {
  vpc_id     = alicloud_vpc.vpc.id
  cidr_block = "172.16.0.0/16"
  zone_id    = "cn-zhangjiakou-a"
}

vpc
39629a69d25edc9d22b9a923d8b87b2e.png
vswitch

7b70cc1137cf6d3c3d5a8b19aeb0f2f9.png

3. 申请ACK集群

locals {
  cluster_version = "1.20.11-aliyun.1"
  service_cidr    = "192.168.0.0/16"
  pod_cidr        = "10.81.0.0/16"
}

resource "alicloud_cs_managed_kubernetes" "k8s" {
  name                  = var.cluster_name
  version               = local.cluster_version
  cluster_spec          = "ack.standard"
  availability_zone     = "cn-zhangjiakou-a"
  service_cidr          = local.service_cidr
  pod_cidr              = local.pod_cidr
  new_nat_gateway       = true
  load_balancer_spec    = "slb.s1.small"
  slb_internet_enabled  = true
  password              = "Password123.com"
  node_port_range       = "30000-32767"
  os_type               = "Linux"
  platform              = "CentOS"
  worker_number         = 1
  worker_instance_types = ["ecs.g6.xlarge"]
  worker_vswitch_ids    = [alicloud_vswitch.vsw.id]
  worker_disk_category  = "cloud_efficiency"
  worker_disk_size      = 40

  dynamic "addons" {
    for_each = var.cluster_addons
    content {
      name   = lookup(addons.value, "name", var.cluster_addons)
      config = lookup(addons.value, "config", var.cluster_addons)
    }
  }
  runtime = {
    name    = "docker"
    version = "19.03.5"
  }
}
terraform fmt
terraform validate
terraform plan
terraform apply
terraform apply -auto-approve

截图:
f14a978cd607a9069089154620884268.png

4. 部署K8s资源

resource "kubernetes_deployment_v1" "jenkins" {
  provider = kubernetes.clustera
  metadata {
    name = "jenkins"
    labels = {
      app = "jenkins"
    }
    namespace = kubernetes_namespace.jenkins.id
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app = "jenkins"
      }
    }

    template {
      metadata {
        labels = {
          app = "jenkins"
        }
      }

      spec {
        container {
          image             = "jenkins/jenkins:2.332.2-centos7-jdk8"
          name              = "jenkins"
          image_pull_policy = "IfNotPresent"

          port {
            container_port = 8080
          }

          resources {
            limits = {
              cpu    = "1000m"
              memory = "4096Mi"
            }
            requests = {
              cpu    = "250m"
              memory = "1024Mi"
            }
          }
          #   liveness_probe {
          #     http_get {
          #       path = "/"
          #       port = 8080
          #     }
          #     initial_delay_seconds = 30
          #     period_seconds        = 3
          #   }
        }
      }
    }
  }
}


resource "kubernetes_service_v1" "jenkins" {
  provider = kubernetes.clustera
  metadata {
    name      = "jenkins-service"
    namespace = kubernetes_namespace.jenkins.id
  }
  spec {
    selector = {
      app = kubernetes_deployment_v1.jenkins.metadata[0].labels.app
    }
    port {
      port        = 8080
      target_port = 8080
    }

    type = "ClusterIP"
  }
}


resource "kubernetes_ingress_v1" "jenkins_ingress" {
  provider = kubernetes.clustera
  metadata {
    name      = "jenkins-ingress"
    namespace = kubernetes_namespace.jenkins.id
  }

  spec {
    rule {
      host = "jenkins.zeyang.site"
      http {
        path {
          backend {
            service {
              name = kubernetes_service_v1.jenkins.metadata[0].name
              port {
                number = 8080
              }
            }
          }
          path_type = "Prefix"
          path      = "/"
        }
      }
    }
  }
}
provider "kubernetes" {
  # Configuration options
  config_path    = "../config/clustera.config"
  config_context = "kubernetes-admin-cf1aa641cfb1942c693960bca49925eb7"
  alias          = "clustera"
  insecure       = true
}

resource "kubernetes_namespace" "jenkins" {
  provider = kubernetes.clustera
  metadata {
    name = "devops"
  }
}
resource "alicloud_dns_record" "record" {
  name        = "zeyang.site"
  host_record = "jenkins"
  type        = "A"
  value       =  kubernetes_ingress_v1.jenkins_ingress.status[0].load_balancer[0].ingress[0].ip
}

实验截图:
ecad719cdf35035e5ed2ef7f8932fa4e.png

91849a216bb5e01c035419ffa1d2147f.png
image.png

dd6fec26e71719be4e402bb2b949ac51.png

5. 销毁资源

cd devops
terraform destroy
cd ..

cd infra
terraform destroy

14fc9271b8a5e11b23d02b388788704a.png

ASK扩展

手动在web控制台创建一个ASK集群:
70756d8b1940e612f4f62b77d84c6a91.png
115752f588576845adf02b74c6171bb0.png
导入到本地参考文档:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/cs_serverless_kubernetes#import

首先,定义一个空的资源

resource "alicloud_cs_serverless_kubernetes" "main" {

}

导入资源,替换集群的ID

terraform import alicloud_cs_serverless_kubernetes.main c995c50e1efa54eb9a1b03c8e41df22e5

ebbb9c24df278300891d7ee059fa2b45.png
写入Terraform代码中

terraform state list 
alicloud_cs_serverless_kubernetes.main
terraform state show alicloud_cs_serverless_kubernetes.main
838327dca63d4852411a978536f24c0b.png
image.png
resource "alicloud_vpc" "vpc" {
  vpc_name   = "k8s_vpc"
  cidr_block = "172.16.0.0/12"
}

resource "alicloud_vswitch" "vsw" {
  vpc_id     = alicloud_vpc.vpc.id
  cidr_block = "172.16.0.0/16"
  zone_id    = "cn-zhangjiakou-c"
}

resource "alicloud_cs_serverless_kubernetes" "main" {
  cluster_spec                   = "ack.standard"
  deletion_protection            = false
  load_balancer_spec             = "slb.s2.small"
  logging_type                   = "SLS"
  name                           = "k8s"
  tags                           = {}
  version                        = "1.22.10-aliyun.1"
  vpc_id                         = alicloud_vpc.vpc.id
  vswitch_ids                    = [alicloud_vswitch.vsw.id]
  new_nat_gateway                = true
  endpoint_public_access_enabled = true
  time_zone                      = "Asia/Shanghai"
  service_cidr                   = "192.168.0.0/16"
  service_discovery_types        = ["CoreDNS"]


  timeouts {}
  addons {
    # SLB Ingress
    name = "alb-ingress-controller"
    config = "{\"IngressSlbNetworkType\":\"internet\",\"IngressSlbSpec\":\"slb.s2.small\"}"
  }
  addons {
    name = "metrics-server"
  }
  #   addons {
  #     name = "knative"
  #   }
}

删除集群报错:是需要手动先去删除ECI容器后再删除集群:

[
  {
    "instanceId":"eci-8vb2yx0ikaafizuhtin1",
    "resource_type":"ALIYUN::ECI::ContainerGroup",
    "dependencies":[
      {
        "cluster_id":"c995c50e1efa54eb9a1b03c8e41df22e5",
        "instance_id":"eci-8vb2yx0ikaafizuhtin1",
        "resource_type":"ALIYUN::ECI::ContainerGroup",
        "resource_info":"",
        "created":"0001-01-01T00:00:00Z",
        "auto_create":0,
        "state":""
      }
    ]
  },
  {
    "instanceId":"eci-8vb58w1ymcng876cbd8o",
    "resource_type":"ALIYUN::ECI::ContainerGroup",
    "dependencies":[
      {
        "cluster_id":"c995c50e1efa54eb9a1b03c8e41df22e5",
        "instance_id":"eci-8vb58w1ymcng876cbd8o",
        "resource_type":"ALIYUN::ECI::ContainerGroup",
        "resource_info":"",
        "created":"0001-01-01T00:00:00Z",
        "auto_create":0,
        "state":""
      }
    ]
  },
  {
    "instanceId":"eci-8vbhhxj8vesgv9tv6ooa",
    "resource_type":"ALIYUN::ECI::ContainerGroup",
    "dependencies":[
      {
        "cluster_id":"c995c50e1efa54eb9a1b03c8e41df22e5",
        "instance_id":"eci-8vbhhxj8vesgv9tv6ooa",
        "resource_type":"ALIYUN::ECI::ContainerGroup",
        "resource_info":"",
        "created":"0001-01-01T00:00:00Z",
        "auto_create":0,
        "state":""
      }
    ]
  },
  {
    "instanceId":"eci-8vbi7fptgy6ir4ua3gn1",
    "resource_type":"ALIYUN::ECI::ContainerGroup",
    "dependencies":[
      {
        "cluster_id":"c995c50e1efa54eb9a1b03c8e41df22e5",
        "instance_id":"eci-8vbi7fptgy6ir4ua3gn1",
        "resource_type":"ALIYUN::ECI::ContainerGroup",
        "resource_info":"",
        "created":"0001-01-01T00:00:00Z",
        "auto_create":0,
        "state":""
      }
    ]
  },
  {
    "instanceId":"eci-8vb9vrtvpldaxrh3m62d",
    "resource_type":"ALIYUN::ECI::ContainerGroup",
    "dependencies":[
      {
        "cluster_id":"c995c50e1efa54eb9a1b03c8e41df22e5",
        "instance_id":"eci-8vb9vrtvpldaxrh3m62d",
        "resource_type":"ALIYUN::ECI::ContainerGroup",
        "resource_info":"",
        "created":"0001-01-01T00:00:00Z",
        "auto_create":0,
        "state":""
      }
    ]
  },
  {
    "instanceId":"eci-8vb2yx0ikaafizuhtin0",
    "resource_type":"ALIYUN::ECI::ContainerGroup",
    "dependencies":[
      {
        "cluster_id":"c995c50e1efa54eb9a1b03c8e41df22e5",
        "instance_id":"eci-8vb2yx0ikaafizuhtin0",
        "resource_type":"ALIYUN::ECI::ContainerGroup",
        "resource_info":"",
        "created":"0001-01-01T00:00:00Z",
        "auto_create":0,
        "state":""
      }
    ]
  }
]

感谢“大可不加冰”老师的建议,后续可以将kubeconfig文件不要存储在本地,有时候配置和terraform不一定在同一台机器中。可以通过output或者remote_state的方式获取。

视频回放参考

0a4349c3608b7ff711230a6acc4f02a8.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值