发布于 2026-01-06 1 阅读
0

使用 Terraform 在 Minikube 集群中部署 Kubernetes 资源

使用 Terraform 在 Minikube 集群中部署 Kubernetes 资源

如何使用 Terraform 在 Minikube 集群中创建 Kubernetes 资源

目录

背景设定

在本博客中,我们将了解如何使用 Terraform 自动化在 minikube 中自动创建namespacenginx 应用程序。deployment

介绍

基于容器的应用工作负载可以使用 Kubernetes(简称 k8s)进行管理,并且有多种方法可以创建 Kubernetes 集群。
诸如 EKS、GKE 和 AKS 等基于云的 Kubernetes 解决方案可用于部署生产级集群。

我们可以使用 minikube 创建本地 Kubernetes 集群,用于简单的概念验证和学习。有关 minikube 的更多详细信息,请参阅其文档。

minikube在 macOS、Linux 和 Windows 上快速搭建本地 Kubernetes 集群。我们致力于帮助应用程序开发者和 Kubernetes 新用户。

在minikube中,有多种方法可以实现集群创建的自动化,Terraform自动化也可以用于minikube中的k8s自动化。

首先,

您还可以参考我的另一篇博客,了解更多关于在工作站上设置minikube的信息。

本演示中使用的 Kubernetes 概念

  • namespace是将不同的 k8s 工作负载、密钥等进行逻辑分组。例如:我们可以将开发环境和生产环境的配置分组到不同的namespaces.
  • deployment这是一个 Kubernetes 配置声明,我们可以在其中声明不同的工作负载及其相关配置。此外,我们还可以在下创建部署,namespace以便在逻辑上区分所需的资源集。
  • kube config安装时会创建该文件,minikube其中包含创建本地 Kubernetes 集群所需的信息。Kube 配置包含不同的clusters上下文contextsminikube其中之一是指向kube config文件中 minikube 集群的上下文。
  • context指的是一组参数,其中包含 Kubernetes 集群、用户和命名空间的信息。

  • kube config上下文minikube和聚类信息示例

apiVersion: v1
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Mon, 20 Jun 2022 08:51:10 IST
        provider: minikube.sigs.k8s.io
        version: v1.24.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
clusters:
- cluster:
    certificate-authority: $USERHOME_DIR/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Mon, 20 Jun 2022 08:51:10 IST
        provider: minikube.sigs.k8s.io
        version: v1.24.0
      name: cluster_info
    server: https://192.168.49.2:8443
  name: minikube
Enter fullscreen mode Exit fullscreen mode

在minikube中实现k8s部署自动化的步骤

步骤 1 启动 minikube

  • 使用命令minikube start启动本地 Kubernetes minikube 集群
$ minikube start
😄  minikube v1.24.0 on Ubuntu 21.04
    ▪ KUBECONFIG=$USERHOME/.kube/config
🎉  minikube 1.26.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.26.0
💡  To disable this notice, run: 'minikube config set WantUpdateNotification false'

✨  Using the docker driver based on existing profile
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
🔄  Restarting existing docker container for "minikube" ...
🐳  Preparing Kubernetes v1.22.3 on Docker 20.10.8 ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: default-storageclass, storage-provisioner

❗  /snap/bin/kubectl is version 1.24.2, which may have incompatibilites with Kubernetes 1.22.3.
    ▪ Want kubectl v1.22.3? Try 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Enter fullscreen mode Exit fullscreen mode

步骤 2 创建 Terraform 代码

  • 本演示中使用的 Terraform 代码可以在这里找到。

  • 在 Terraform 中,我们可以将不同的 Terraform 构建块拆分到不同的文件中,这是最佳实践的一部分。

  • 我们有两个文件,作为 k8s minikube 自动化的一部分。

providers.tf

  • 此文件包含有关 Terraform HashiCorp 提供程序模块的详细信息,我们将在required_providers本部分中使用这些模块来实现自动化。
  • 此外,在本provider节中,我们需要声明kube config文件路径和(minikubecontext我们将用于自动化。
terraform {
  required_providers {
    kubernetes = {
      source = "hashicorp/kubernetes"
      version = "2.11.0"
    }
  }
}

provider "kubernetes" {
  config_path    = "~/.kube/config"
  config_context = "minikube"
}
Enter fullscreen mode Exit fullscreen mode

k8s.tf

  • k8s.tf这是主文件,我们将在其中声明我们的新namespacedeployment
  • KubernetesTerraform 中的 provider 模块支持与 Kubernetes 配置声明参数相同的参数,例如metadata,spec等。
  • 因此,如果您熟悉如何创建 Kubernetes 配置 YAML 文件,那么利用该配置 YAML 文件编写 Terraform 代码就会非常容易。否则,创建 Kubernetes 配置就需要一定的学习成本。

  • namespace定义如下:

resource "kubernetes_namespace" "example" {
  metadata {
    name = "k8s-ns-by-tf"
  }
}
Enter fullscreen mode Exit fullscreen mode
  • deployment将按如下方式定义,并且它是在namespace我们正在创建的新项下创建的。
resource "kubernetes_deployment" "example" {
  metadata {
    name = "terraform-example"
    labels = {
      test = "MyExampleApp"
    }
    namespace = "k8s-ns-by-tf"
  }
Enter fullscreen mode Exit fullscreen mode
  • 在部署中,我们声明了一个spec,它包含replica定义和部署template定义。
  • 在这个自动化示例中,我们将为nginx应用程序创建部署。
  • 以下是显示规范定义的示例配置片段:
  spec {
    replicas = 2

    selector {
      match_labels = {
        test = "MyExampleApp"
      }
    }

    template {
      metadata {
        labels = {
          test = "MyExampleApp"
        }
      }

      spec {
        container {
          image = "nginx:1.21.6"
          name  = "example"

      .....
      .....
      .....
   }
Enter fullscreen mode Exit fullscreen mode

步骤 3:运行 Terraform 代码以创建资源

  • 我们将运行 Terraform 命令来启动 minikube 中的 k8s 部署。

  • terraform init

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/kubernetes from the dependency lock file
- Using previously-installed hashicorp/kubernetes v2.11.0

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.

Enter fullscreen mode Exit fullscreen mode
  • terraform plan
$ terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # kubernetes_deployment.example will be created
  + resource "kubernetes_deployment" "example" {
      + id               = (known after apply)
      + wait_for_rollout = true

      + metadata {
          + generation       = (known after apply)
          + labels           = {
              + "test" = "MyExampleApp"
            }
          + name             = "terraform-example"
          + namespace        = "k8s-ns-by-tf"
          + resource_version = (known after apply)
          + uid              = (known after apply)
        }

      + spec {
      .....

      .....

      .....
      }
   }

  # kubernetes_namespace.example will be created
  + resource "kubernetes_namespace" "example" {
      + id = (known after apply)

      + metadata {
          + generation       = (known after apply)
          + name             = "k8s-ns-by-tf"
          + resource_version = (known after apply)
          + uid              = (known after apply)
        }
    }

Enter fullscreen mode Exit fullscreen mode
  • terraform apply
$ terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # kubernetes_deployment.example will be created
  + resource "kubernetes_deployment" "example" {
}
  # kubernetes_namespace.example will be created
  + resource "kubernetes_namespace" "example" {
}

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

kubernetes_namespace.example: Creating...
kubernetes_namespace.example: Creation complete after 0s [id=k8s-ns-by-tf]
kubernetes_deployment.example: Creating...
kubernetes_deployment.example: Creation complete after 3s [id=k8s-ns-by-tf/terraform-example]

Enter fullscreen mode Exit fullscreen mode

步骤 4:验证 Kubernetes 资源

  • 我们需要使用该kubectl命令来验证 Kubernetes 资源。它可以从这里安装。

  • 我们可以使用以下命令验证 Kubernetes 资源:

  • 使用 - 列出命名空间kubectl get ns

$ kubectl get ns k8s-ns-by-tf
NAME           STATUS   AGE
k8s-ns-by-tf   Active   3m52s
Enter fullscreen mode Exit fullscreen mode
  • 使用以下方式查看部署情况 -kubectl get deployment -n k8s-ns-by-tf
$ kubectl get deployment -n k8s-ns-by-tf
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
terraform-example   2/2     2            2           4m14s
Enter fullscreen mode Exit fullscreen mode
  • 使用以下命令获取已部署的 Pod:kubectl get pods -n k8s-ns-by-tf
  • 既然我们提到了 2 个副本,我们可以看到部署了两个 pod。namespace
$ kubectl get pods -n k8s-ns-by-tf
NAME                                 READY   STATUS    RESTARTS   AGE
terraform-example-67ddfbc845-9dx4r   1/1     Running   0          9m4s
terraform-example-67ddfbc845-d68bw   1/1     Running   0          9m4s
Enter fullscreen mode Exit fullscreen mode

清理演示资源

  • 演示结束后,我们可以使用terraform destroy命令清除已部署的资源。
$ terraform destroy
kubernetes_namespace.example: Refreshing state... [id=k8s-ns-by-tf]
kubernetes_deployment.example: Refreshing state... [id=k8s-ns-by-tf/terraform-example]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:
  # kubernetes_deployment.example will be destroyed
  - resource "kubernetes_deployment" "example" {
}
  # kubernetes_namespace.example will be destroyed
  - resource "kubernetes_namespace" "example" {
}

Plan: 0 to add, 0 to change, 2 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

kubernetes_namespace.example: Destroying... [id=k8s-ns-by-tf]
kubernetes_deployment.example: Destroying... [id=k8s-ns-by-tf/terraform-example]
kubernetes_deployment.example: Destruction complete after 0s
kubernetes_namespace.example: Destruction complete after 6s

Destroy complete! Resources: 2 destroyed.
Enter fullscreen mode Exit fullscreen mode

结论

  • 在这篇博客中,我们介绍了一些 Kubernetes 的基本概念,以及如何在 minikube 中创建 Kubernetes 资源自动化。

  • 请参考我的教程博客系列,了解更多关于 Kubernetes 的信息。

参考

关注我并分享你的想法,

文章来源:https://dev.to/chefgs/deploy-kubernetes-resources-in-minikube-cluster-using-terraform-1p8o