使用Terraform来讲解管理Kubernetes集群的方法

image.png

首先

Kubernetes(K8s)是最受欢迎的开源容器编排和调度工具之一。它由Google开发,但也得到了其他许多独立开发者和企业如Red Hat、华为、微软、IBM等的贡献。

在Kubernetes中,存在着客户端和服务器的架构。Kubernetes集群中,总是可以找到Master和Worker节点,Master作为控制节点,由多个组件组成,如kube-scheduler、kube-apiserver和kube-controller-manager等。默认情况下,Kubernetes集群有一个Master节点,但也可以设置为多Master节点的Kubernetes集群。无论是哪种情况,Master都控制着Worker节点。

过去被称为Minion的节点通常是虚拟机(VM)的工作机器,但也可能是裸机(Bare Metal Machine)。每个节点都由必要的服务组成,用于主节点管理Pod。

    例:Kubelet、コンテナランタイム、kube-proxy。

查看Kubernetes架构,我想你会发现它是一个复杂的系统。这种复杂性在某种程度上是为了创建这样一种具备弹性的抽象系统而必要的。复杂性不仅存在于其功能性方面,而且也存在于Kubernetes集群的部署和维护中。

要创建自己的Kubernetes集群,您需要提供自己的资源和证书。生成用于认证的自定义Kubernetes配置,管理数据加密,引导etcd集群、控制平面、工作节点和管理器Pod网络路由,设置DNS附件,并进行冒烟测试。一些开源工具可以帮助完成这些任务,但是部署和管理自己的Kubernetes集群并不容易。这就是为什么许多公司选择使用类似GKE的托管Kubernetes集群的易用性的原因。

使用云管理的集群,你不需要保持集群和其依赖关系的一致性,因此可以更容易地使用Kubernetes。而使用基础设施即代码(IaC),Kubernetes集群的引导会更加简便。此外,事实上,创建和维护各种Kubernetes环境有许多优点。将基础设施添加到版本控制中,也可以在团队和个人之间共享。

DevOps的其中一个支柱是自助式基础架构。通过使用像Terraform这样的工具,可以创建和验证基础架构模板,并可用于按需配置和重复利用。在这篇博客文章中,将使用Terraform来创建GKE集群的基础架构模板。

前提条件 (Qian ti tiao jian)

在开始之前,需要一个有效的Google Cloud账户。第二步是选择或创建一个项目,并激活Kubernetes Engine API。请确保与项目关联的结算账户存在。

一旦API激活(可能需要数分钟),需要安装Google CloudSDK。

安装完SDK后,使用CloudShell进行项目配置。

gcloud config set project <project-id>

设置计算区域。

gcloud config set compute/zone <compute-zone>

您可以使用以下内容获得可用区域的列表。

gcloud config set compute/zone compute-zone

你现在可以使用以下内容来进行集群创建的测试。

gcloud container clusters create <cluster_name>

Terraform与Google Cloud Platform API进行互动。一个好的做法是只为Terraform创建一个专用的服务帐号。这样可以增强控制,并使安全性管理更加灵活。

在云控制台中,点击[IAM & 管理员]->[服务帐号],然后点击[创建服务帐号]。

给服务账号命名,并赋予“项目编辑者”角色。生成并下载该账号的JSON密钥,然后运行它并被要求保存到下一个位置。

<project>/auth/serviceaccount.json

这是一个创建Terraform模板的项目文件夹。您也可以通过添加.gitignore文件来忽略凭据和其他未使用的文件。

auth/* 
.terraform/*

此外,您需要安装Terraform。由于它是一个二进制软件包,所以没什么复杂的。只需下载二进制文件并将其设置为可执行即可。要下载Terraform,请使用官方下载页面,选择您的操作系统并下载二进制文件。

wget https://releases.hashicorp.com/terraform/0.12.18/terraform_0.12.18_linux_amd64.zip
unzip terraform_0.12.18_linux_amd64.zip
sudo mv terraform /usr/bin/terraform
sudo chmod +x /usr/bin/terraform

使用 Terraform 创建第一个 GKE 集群

terraform提供程序

Terraform可以与许多云提供商(如AWS、Azure和GCP)进行交互,因此每个云都需要一种用于认证和管理的云API和接口的驱动程序,这种驱动程序通常被称为提供商。

让我们创建GCP提供商。创建一个名为「provider.tf」的文件,将以下代码粘贴进去。

provider "google" {
  credentials = "${file("./auth/serviceaccount.json")}"
  project     = "<your_project_name>"
  region      = "<your_region>"
}

请先将先前生成的 JSON 密钥保存到 “auth/serviceaccout.json”,然后使用以下代码进行初始化。

terraform init

这将初始化项目并下载GCP提供者文件。

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "google" (hashicorp/google) 3.2.0...

Terraform资源

让我们开始创建基础设施的虚拟资源。通过使用Terraform,您可以定义要创建的云资源的名称和配置。在这种情况下,我们将创建一个GKE集群。

创建一个名为”gke.tf”的文件,然后粘贴以下代码。

resource "google_container_cluster" "primary" {
  name     = "<cluster_name>"
  network            = "default"
  location               = "<location>"
  initial_node_count = 1
  }

请务必将其更改为实际值。

给孩子们一个梦想,他们将永远不知道什么叫可持续发展。所以,我们应该教育他们关于环境保护的重要性,以确保他们的未来和地球的未来不受到伤害。

让孩子们有一个梦想,他们将永远不明白持续发展的意义。因此,我们应该教导他们关于环保的重要性,以确保他们以及地球的未来不受伤害。

resource "google_container_cluster" "primary" {
  name     = "my-gke-cluster"
  network            = "default"
  location               = "europe-west1"
  initial_node_count = 1
  }

地球形态计划

在Terraform中,有一种声明式的DSL。这意味着只需在”tf”文件中描述所需的状态,Terraform将负责实现它。换句话说,为了创建所需的基础架构,不需要逐步说明执行模型。

当使用”terraform plan”命令时,Terraform会生成执行计划。它会将资源的当前状态与期望的状态进行比较。

应用Terraform

在执行plan命令后,Terraform生成了一个解释执行计划的文件(本地文件)。通过这个文件,apply命令可以了解要应用于资源(即”my-gke-cluster”)的更改。

由于这是第一次创建集群,因此没有什么要更新的,一切都将是第一次创建。

让我们使用”apply”命令来创建集群。

terraform apply

您应该能够查看与GKE集群相关的各种配置。

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

使用Terraform进行资源的更新

在这个教程的前半部分,我们使用简单的Terraform模板创建了一个Kubernetes集群。要更新集群,您也可以使用Terraform。使用相同的”tf”文件(”gke.tf”),您可以添加或更新所需的配置来使集群达到预期的状态。

假设我们要添加一个具有一个“n1-standard-1”节点的预置节点池,并启用Stackdriver服务。

需要添加以下内容并更新代码。

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name       = "my-node-pool"
  location   = "europe-west1"
  cluster    = google_container_cluster.primary.name
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = "n1-standard-1"

    metadata = {
      disable-legacy-endpoints = "true"
    }

    oauth_scopes = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]
  }
}

这是最终的 “gke.tf” 文件的格式。

resource "google_container_cluster" "primary" {
  name     = "my-gke-cluster"
  network            = "default"
  location               = "europe-west1"
  initial_node_count = 1
  }

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name       = "my-node-pool"
  location   = "europe-west1"
  cluster    = google_container_cluster.primary.name
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = "n1-standard-1"

    metadata = {
      disable-legacy-endpoints = "true"
    }

    oauth_scopes = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]
  }
}

而不是输入如下内容,

..
"primary_preemptible_nodes" {
  name       = "my-node-pool"
  location   = "europe-west1"
  cluster    = "my-gke-cluster"
  node_count = 1
..

请尝试使用Terraform变量和以下方法。

..
"primary_preemptible_nodes" {
  name       = "my-node-pool"
  location   = "europe-west1"
  cluster    = google_container_cluster.primary.name
  node_count = 1
..

使用Terraform销毁集群。

我用Terraform创建了一个集群。 同样的工具还提供了基于状态销毁资源的功能。 当我使用Terraform销毁集群时,它也会更新状态。

要想销毁集群,需要使用如下操作。

terraform destroy

总结

本文介绍了如何将创建GKE集群变得简单且可复制的方法。

我们可以对GKE集群进行定制,例如添加热更新而无需重新创建新的集群,或者丢弃并重新创建新的集群。

将IaC和云计算的能力结合起来是创建开发者自助服务的好方法,通过向模板文件添加配置管理层,可以更精细地控制自助服务的基础架构。

如果您对使用Prometheus监视Kubernetes感兴趣,可以考虑使用Prometheus + Thanos进行HA Kubernetes监视。另外,您还可以尝试MetricFire的免费试用,开始使用Prometheus进行监视。预约一次演示,直接咨询有关监视需求的问题。

bannerAds