天天看點

Terraform與Kubernetes

看到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與Kubernetes

使用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

中對于這個的讨論,也有點不太樂觀

Terraform與Kubernetes

必須在v1中的資源才會支援。對于Deployment大家隻能用RC代替、或者kube exec加進去(尬

但對于kubernetes而言,beta階段的很多資源,已經被大家廣泛使用(Deployment、Daemonset),而且新版本的Deployment已經變成了apps/v1。

本文轉自SegmentFault-

Terraform與Kubernetes

繼續閱讀