Terraform学习笔记

举报
luofeng13 发表于 2021/10/25 21:40:03 2021/10/25
【摘要】 背景介绍Terraform是HashiCorp公司开源的工具,目前众多的云厂商支持使用terraform进行资源编排。Terraform采用插件的方式对接不同种类和厂家资源,涉及计算、存储、网络、数据库等。因为插件的可扩展性强,未来会支持更多种类的资源操作以及编排。目前我司也有相应的云服务插件。

背景介绍

Terraform是HashiCorp公司开源的工具,目前众多的云厂商支持使用terraform进行资源编排。Terraform采用插件的方式对接不同种类和厂家资源,涉及计算、存储、网络、数据库等。因为插件的可扩展性强,未来会支持更多种类的资源操作以及编排。目前我司也有相应的云服务插件

跑通Kubernetes样例

1、下载terraform二进制(https://www.terraform.io/downloads.html),保存到$PATH目录。

2、Terraform拉取Plugins, 运行 terraform init;如果是内网运行可能遇到错误(x509: certificate signed by unknown authority),记得注册公司的根证书。

provider "kubernetes" {
  config_path = "~/.kube/config"
}

3、编写需要部署的资源文件deploy.tf, 需要注意的Terraform与yaml语法略微有差别,文章后面有介绍。

resource "kubernetes_deployment" "test"
      |                            |                          |
资源语法关键字  资源类型      Terraform能识别的资源名称
provider "kubernetes" {
  config_path = "~/.kube/config"
}
resource "kubernetes_namespace" "test" {
  metadata {
    name = "nginx"
  }
}
resource "kubernetes_deployment" "test" {
  metadata {
    name      = "nginx"
    namespace = kubernetes_namespace.test.metadata.0.name
  }
  spec {
    replicas = 1
    selector {
      match_labels = {
        app = "MyTestApp"
      }
    }
    template {
      metadata {
        labels = {
          app = "MyTestApp"
        }
      }
      spec {
        container {
          image = "nginx"
          name  = "nginx-container"
          port {
            container_port = 80
          }
        }
      }
    }
  }
}

4、运行terraform plan查看资源概览

# kubernetes_deployment.test:
resource "kubernetes_deployment" "test" {
    id               = "nginx/nginx"
    wait_for_rollout = true

    metadata {
        generation       = 1
        name             = "nginx"
        namespace        = "nginx"
        resource_version = "138151370"
        uid              = "610b9bd5-da91-405e-9beb-5559a8031a5b"
    }

    spec {
        min_ready_seconds         = 0
        paused                    = false
        progress_deadline_seconds = 600
        replicas                  = "1"
        revision_history_limit    = 10

        selector {
            match_labels = {
                "app" = "MyTestApp"
            }
        }

        strategy {
            type = "RollingUpdate"

            rolling_update {
                max_surge       = "25%"
                max_unavailable = "25%"
            }
        }

        template {
            metadata {
                generation = 0
                labels     = {
                    "app" = "MyTestApp"
                }
            }

            spec {
                active_deadline_seconds          = 0
                automount_service_account_token  = true
                dns_policy                       = "ClusterFirst"
                enable_service_links             = true
                host_ipc                         = false
                host_network                     = false
                host_pid                         = false
                restart_policy                   = "Always"
                share_process_namespace          = false
                termination_grace_period_seconds = 30

                container {
                    image                      = "nginx"
                    image_pull_policy          = "Always"
                    name                       = "nginx-container"
                    stdin                      = false
                    stdin_once                 = false
                    termination_message_path   = "/dev/termination-log"
                    termination_message_policy = "File"
                    tty                        = false

                    port {
                        container_port = 80
                        host_port      = 0
                        protocol       = "TCP"
                    }

                    resources {}
                }
            }
        }
    }
}

# kubernetes_namespace.test:
resource "kubernetes_namespace" "test" {
    id = "nginx"

    metadata {
        generation       = 0
        name             = "nginx"
        resource_version = "138151336"
        uid              = "d9a012f4-f2e3-4af9-932f-073ada5fdefc"
    }
}

5、执行terraform apply,部署Kuberntes资源,部署过程Terraform会持久化状态文件:terraform.tfstate(注意不要删除该文件)。

5、部署后,运行terraform show查看刚刚部署的资源。

# kubernetes_deployment.test:
resource "kubernetes_deployment" "test" {
    id               = "nginx/nginx"
    wait_for_rollout = true

    metadata {
           ...
    }

    spec {
           ...
    }
}

# kubernetes_namespace.test:
resource "kubernetes_namespace" "test" {
    id = "nginx"

    metadata {
            ...  
    }
}

6、资源更新,更新deploy镜像,修改deploy.tf,运行terraform apply。

QA:

1、如何定义资源的先后关系?

2、如果引用其他资源的属性?

参考

1、Terraform语法,例如list、map格式。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。