资讯专栏INFORMATION COLUMN

Terraform与Kubernetes

solocoder / 1058人阅读

看到Terraform可以替代kubectl管理k8s资源的生命周期,于是调研了下它的使用场景,并对比Terraform和Helm的区别

一.Terraform介绍

Terraform是一款开源工具,出自HashiCorp公司,著名的Vagrant、Consul也出自于该公司。其主要作用是:让用户更轻松地管理、配置任何基础架构,管理公有和私有云服务,也可以管理外部服务,如GitHub,Nomad。

区别于ansible和puppet等传统的配置管理工具,Terraform趋向于更上层的一个组装者。

Terraform使用模板来定义基础设施,通过指令来实现资源创建/更新/销毁的全生命周期管理,实现“基础设施即代码”,具体示例如下:

resource "alicloud_instance" "web" {
    # cn-beijing
    availability_zone = "cn-beijing-b"
    image_id = "ubuntu_140405_32_40G_cloudinit_20161115.vhd"

    system_disk_category = "cloud_ssd"

    instance_type = "ecs.n1.small"
    internet_charge_type = "PayByBandwidth"
    security_groups = ["${alicloud_security_group.tf_test_foo.id}"]
    instance_name = "test_foo"
    io_optimized = "optimized"
}

这是阿里云的一个Terraform逻辑,执行terraform apply,就可以创建一个ECS实例

Terraform AliCloud provider: terraform-provider

二.Terraform支持K8S

17年9月,Terraform官方宣布支持Kubernetes,提供Kubernetes应用程序的完整生命周期管理,包含Pod的创建、删除以及副本控制等功能(通过调用API)。

以下是操作示例:

1.安装kubernete集群

当前k8s的installer列表,已经很多了...

使用Terraform在阿里云上安装k8s集群:kubernetes-examples

2.创建应用:

1.初始化k8s-provider

因为是调用apiserver,所以需要指定k8s集群的连接方式

provider "kubernetes" {} // 默认~/.kube/config
或:
provider "kubernetes" {
  host = "https://104.196.242.174"

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

2.初始化terraform

$ terraform init

Initializing provider plugins...
- Downloading plugin for provider "kubernetes"...

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

3.创建RC

// Terraform不支持Deployment
// issue:https://github.com/terraform-providers/terraform-provider-kubernetes/issues/3

resource "kubernetes_replication_controller" "nginx" {
  metadata {
    name = "scalable-nginx-example"
    labels {
      App = "ScalableNginxExample"
    }
  }

  spec {
    replicas = 2
    selector {
      App = "ScalableNginxExample"
    }
    template {
      container {
        image = "nginx:1.7.8"
        name  = "example"

        port {
          container_port = 80
        }

        resources {
          limits {
            cpu    = "0.5"
            memory = "512Mi"
          }
          requests {
            cpu    = "250m"
            memory = "50Mi"
          }
        }
      }
    }
  }
}

4.创建service

resource "kubernetes_service" "nginx" {
  metadata {
    name = "nginx-example"
  }
  spec {
    selector {
      App = "${kubernetes_replication_controller.nginx.metadata.0.labels.App}"
    }
    port {
      port = 80
      target_port = 80
    }

    type = "LoadBalancer"
  }
}

4.查看和执行

以上的步骤均为执行计划的定义
执行操作:terraform apply
查看当前执行几乎:terraform plan
三.为什么使用Terraform

1.如果你的基础设施(虚机、BLB等)是用Terraform来管理,那么你无需任何成本,可以用同样的配置语言,来管理k8s集群

2.完整的生命周期管理

3.每个执行的同步反馈

4.关系图谱:比如PVC和PV,如果PV创建失败,则不会去执行PVC的流程

四.与Helm的对比

如果是对K8S做上层的资源管理,大多数人会想到用Helm:参考

以下是Helm与Terraform都创建一个APP的操作对比:https://dzone.com/articles/te...

Terraform的优势:

1.如果你的基础设施已经用了Terraform,那么k8s集群管理也可以直接用这个,没有学习成本

2.Terraform不需要在k8s集群中安装任何组件,它通过APISERVER管理资源

Terraform的缺点:

1.对K8S的支持还比较弱,而且17年9月才开始支持,项目还在初期

2.严重依赖Terraform的基础设施provider,比如外部磁盘、consul等没有支持的话,k8s中无法使用

2.不支持beta资源,这个是硬伤,如:Deployment/StatefulSet/Daemonset不支持

3.没有生态和市场的概念,比如helm中的仓库,共享大家的应用仓库

五.吐槽

对于Terraform,不支持Deployment这一条,足以让很多人放弃这个方案,而issue中对于这个的讨论,也有点不太乐观

必须在v1中的资源才会支持。对于Deployment大家只能用RC代替、或者kube exec加进去(尬

但对于kubernetes而言,beta阶段的很多资源,已经被大家广泛使用(Deployment、Daemonset),而且新版本的Deployment已经变成了apps/v1。

k8s各种版本(v1、apps/v1)的区别:参考文章

不知道后续Terraform有没有更多的支持,观望下~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25288.html

相关文章

  • TerraformKubernetes

    看到Terraform可以替代kubectl管理k8s资源的生命周期,于是调研了下它的使用场景,并对比Terraform和Helm的区别 一.Terraform介绍 Terraform是一款开源工具,出自HashiCorp公司,著名的Vagrant、Consul也出自于该公司。其主要作用是:让用户更轻松地管理、配置任何基础架构,管理公有和私有云服务,也可以管理外部服务,如GitHub,Nomad。...

    mengera88 评论0 收藏0
  • 如何创建高效、经济的Kubernetes集群

    摘要:本文是介绍关于如何创建一个高效的集群,用于在上使用和的开发目的。单击左下角的按钮,忽略警告并强制访问页面。取而代之的,我们将在这里使用,在上创建代理,自动设置这些由服务器管理的集群。 Kubernetes是我主要学习的主题之一。我知道不光是我,还有一定数量的人愿意在工作之余进一步使用和研究它。 本文是介绍关于如何创建一个高效的Kubernetes集群,用于在Scaleway上使用Ter...

    BaronZhang 评论0 收藏0
  • 如何使用OPA实现多云策略和流程可移植性

    摘要:如何允许开发人员团队在多云和混合云环境中编写和实施一致的策略和授权。使用跨云创建一致的策略和流程开放策略代理是一种流行的工具,正是因为它与域无关。简而言之,组织无需浪费任何时间对应用程序进行逆向工程以实现多云可移植性。OpenPolicy Agent如何允许开发人员团队在多云和混合云环境中编写和实施一致的策略和授权。 随着多云战略成为完全主流,公司和开发团队必须弄清楚如何在云环境中创建...

    BLUE 评论0 收藏0
  • 使用Kubernetes你需要知道的硬道理

    摘要:是谷歌内部为解决这个问题所做的工作的产物,它为管理容器如何在整个集群中运行提供了一个单一的框架。在云中使用服务在许多云中作为标准问题项提供,尽管它在谷歌云平台,中最突出地表现为本地特性。使用,运行控制平面,将重点部署将用于所需配置的容器。每一项创新都会带来新的复杂性。容器使以一种方便的、可移植的形式打包和运行应用程序成为可能,但至少要说以规模管理容器是一个挑战。Kubernetes是谷歌内部...

    fyber 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<