使用 Terraform 在 Minikube 集群中部署 Kubernetes 资源
如何使用 Terraform 在 Minikube 集群中创建 Kubernetes 资源
目录
- 背景设定
- 介绍
- 首先,
- 本演示中使用的 Kubernetes 概念
- 在minikube中实现k8s部署自动化的步骤
- 步骤 1 启动 minikube
- 步骤 2 创建 Terraform 代码
- 步骤 3:运行 Terraform 代码以创建资源
- 步骤 4:验证 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
- 请按照文档安装Terraform CLI
您还可以参考我的另一篇博客,了解更多关于在工作站上设置minikube的信息。
本演示中使用的 Kubernetes 概念
namespace是将不同的 k8s 工作负载、密钥等进行逻辑分组。例如:我们可以将开发环境和生产环境的配置分组到不同的namespaces.deployment这是一个 Kubernetes 配置声明,我们可以在其中声明不同的工作负载及其相关配置。此外,我们还可以在下创建部署,namespace以便在逻辑上区分所需的资源集。kube config安装时会创建该文件,minikube其中包含创建本地 Kubernetes 集群所需的信息。Kube 配置包含不同的clusters上下文contexts,minikube其中之一是指向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
在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
步骤 2 创建 Terraform 代码
-
本演示中使用的 Terraform 代码可以在这里找到。
-
在 Terraform 中,我们可以将不同的 Terraform 构建块拆分到不同的文件中,这是最佳实践的一部分。
-
我们有两个文件,作为 k8s minikube 自动化的一部分。
providers.tf
- 此文件包含有关 Terraform HashiCorp 提供程序模块的详细信息,我们将在
required_providers本部分中使用这些模块来实现自动化。 - 此外,在本
provider节中,我们需要声明kube config文件路径和(minikube)context我们将用于自动化。
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "2.11.0"
}
}
}
provider "kubernetes" {
config_path = "~/.kube/config"
config_context = "minikube"
}
k8s.tf
k8s.tf这是主文件,我们将在其中声明我们的新namespace和deploymentKubernetesTerraform 中的 provider 模块支持与 Kubernetes 配置声明参数相同的参数,例如metadata,spec等。-
因此,如果您熟悉如何创建 Kubernetes 配置 YAML 文件,那么利用该配置 YAML 文件编写 Terraform 代码就会非常容易。否则,创建 Kubernetes 配置就需要一定的学习成本。
-
namespace定义如下:
resource "kubernetes_namespace" "example" {
metadata {
name = "k8s-ns-by-tf"
}
}
deployment将按如下方式定义,并且它是在namespace我们正在创建的新项下创建的。
resource "kubernetes_deployment" "example" {
metadata {
name = "terraform-example"
labels = {
test = "MyExampleApp"
}
namespace = "k8s-ns-by-tf"
}
- 在部署中,我们声明了一个
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"
.....
.....
.....
}
- 请参考仓库中的k8s.tf文件查看完整的配置信息。
步骤 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.
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)
}
}
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]
步骤 4:验证 Kubernetes 资源
-
我们需要使用该
kubectl命令来验证 Kubernetes 资源。它可以从这里安装。 -
我们可以使用以下命令验证 Kubernetes 资源:
-
使用 - 列出命名空间
kubectl get ns
$ kubectl get ns k8s-ns-by-tf
NAME STATUS AGE
k8s-ns-by-tf Active 3m52s
- 使用以下方式查看部署情况 -
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
- 使用以下命令获取已部署的 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
清理演示资源
- 演示结束后,我们可以使用
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.
结论
-
在这篇博客中,我们介绍了一些 Kubernetes 的基本概念,以及如何在 minikube 中创建 Kubernetes 资源自动化。
-
请参考我的教程博客系列,了解更多关于 Kubernetes 的信息。