使用terraform管理本地k8s集群

介绍

官方文档地址:https://developer.hashicorp.com/terraform
Github地址:https://github.com/hashicorp/terraform

什么是Terraform?

Terraform 是一种基础架构即代码(Infrastructure as Code IaC)工具,可让您安全高效地构建、更改云和本地资源并对其进行版本控制。使用 Terraform,用户可以通过编写简单的声明式语言来描述他们需要的基础架构资源,然后 Terraform 会自动完成创建、更新和删除等操作,从而简化了基础架构管理的过程。Terraform 可以管理计算、存储和网络资源等低级组件,以及 DNS 条目和 SaaS 功能等高级组件。

Terraform 通过其应用程序编程接口 (API) 在云平台和其他服务上创建和管理资源。提供商使 Terraform 能够使用几乎任何具有可访问 API 的平台或服务。

Terraform 支持多种基础架构提供商,例如 Amazon Web Services(AWS)、Microsoft Azure、Google Cloud Platform(GCP)、OpenStack、VMware 等,以及多种基础架构资源,例如虚拟机、网络、存储、负载均衡、数据库等。用户可以在一个 Terraform 配置文件中定义他们需要的资源,然后使用 Terraform 命令行工具来执行这些操作。

terraform-provider的地址是:
https://github.com/orgs/hashicorp/repositories?language=&q=terraform-provider&sort=&type=all

Terraform是怎么工作的?

核心 Terraform 工作流包括三个阶段:

  • 写入(Write):定义资源,这些资源可能跨多个云提供商和服务。例如,您可以创建一个配置,以便在具有安全组和负载均衡器的虚拟私有云 (VPC) 网络中的虚拟机上部署应用程序。
  • 计划(Plan):Terraform 创建一个执行计划,描述它将根据现有基础架构和您的配置创建、更新或销毁的基础架构。
  • 应用(Apply):批准后,Terraform 会按照正确的顺序执行建议的操作,并遵守任何资源依赖关系。例如,如果您更新 VPC 的属性并更改该 VPC 中的虚拟机数量,Terraform 将在扩展虚拟机之前重新创建 VPC。

file

配置文件使用一种类似于 JSON 的语言——HCL(HashiCorp 配置语言)语言编写。

HCL 语法简单,通过 HCL 开发运维(DevOps)团队能够轻松地跨多个云提供商和本地数据中心对基础架构进行配置和再配置。

连接k8s集群

安装Terraform

我是centos7.9系统,安装方式可以用yum也可以二进制安装。

file

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform

wget https://releases.hashicorp.com/terraform/1.5.6/terraform_1.5.6_linux_386.zip
unzip terraform_1.5.6_linux_386.zip
mv terraform /usr/local/bin/

terraform --version

file

安装k8s provider插件

这里装不装都行,init时会自动装的。
地址为:https://github.com/hashicorp/terraform-provider-kubernetes
使用方式:https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs

wget https://github.com/hashicorp/terraform-provider-kubernetes/archive/refs/tags/v2.23.0.zip
mkdir -p ~/.terraform.d/plugins
unzip v2.23.0.zip -d ~/.terraform.d/plugins

file

file

配置Terraform

需要在provider中配置k8s的集群信息,即kubeconfig。可以使用文件也可以使用证书,还可以使用exec插件。

文件示例

provider "kubernetes" {
  config_path    = "~/.kube/config"
  config_context = "my-context"
}

还支持多个路径。

provider "kubernetes" {
  config_paths = [
    "/path/to/config_a.yaml",
    "/path/to/config_b.yaml"
  ]
}

证书示例

provider "kubernetes" {
  host = "https://cluster_endpoint:port"

  client_certificate     = file("~/.kube/client-cert.pem")
  client_key             = file("~/.kube/client-key.pem")
  cluster_ca_certificate = file("~/.kube/cluster-ca-cert.pem")
}

exec插件示例

一些云提供商具有短期身份验证令牌,这些令牌可能会相对较快地过期。为了确保 Kubernetes 提供程序接收有效的凭据,可以使用基于 exec 的插件在初始化提供程序之前获取新令牌。例如,在 EKS 上, eks get-token 可以使用以下命令:

provider "kubernetes" {
  host                   = var.cluster_endpoint
  cluster_ca_certificate = base64decode(var.cluster_ca_cert)
  exec {
    api_version = "client.authentication.k8s.io/v1beta1"
    args        = ["eks", "get-token", "--cluster-name", var.cluster_name]
    command     = "aws"
  }
}

我的集群时kubeadm创建的,所以直接使用文件路径。

provider "kubernetes" {
  config_path   = "/etc/kubernetes/admin.conf"
}

创建资源

这里创建一个nginx deployment+service。
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service
下面的配置,创建name为nginx,副本数是1,label是app=nginx,镜像是nginx:latest,容器名是nginx,容器端口是80,service类型为nodeport,端口是30008。

provider "kubernetes" {
  config_path   = "/etc/kubernetes/admin.conf"
}

resource "kubernetes_deployment" "nginx" {
  metadata {
    name = "nginx"
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app = "nginx"
      }
    }

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

      spec {
        container {
          image = "nginx:latest"
          name  = "nginx"
          port {
            container_port = 80
            }
        }
      }
    }
  }
}

resource "kubernetes_service" "nginx" {
  metadata {
    name = "nginx"
  }

  spec {
    selector = {
      app = "nginx"
    }

    type = "NodePort"

    port {
      name = "http"
      port = 80
      target_port = 80
      node_port = 30008
    }
  }
}

init

terraform init

file

plan

terraform plan

file

file

apply

terraform apply

需要确认,输入yes。

file

file

查看资源

file

云上使用

https://registry.terraform.io/
阿里云:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs
我这里没有云上环境,暂未测试。

0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
最旧
最新 最多投票
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x