使用 Terraform 创建 Kubernetes (k8s) 资源涉及将基础设施定义为代码。这允许您的部署实现自动化、版本控制和可重复性。在这里,我将指导您使用 Terraform 创建一些常见的 Kubernetes 资源:命名空间、部署和服务。
现在,让我们开始创建资源。
mkdir terraform-k8s && cd terraform-k8s
provider.tf
文件来定义 Kubernetes 提供程序terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
}
}
}
provider "kubernetes" {
config_path = "~/.kube/config"
}
注意:确保更新配置文件的路径
namespace.tf
文件来定义 Kubernetes 命名空间。resource "kubernetes_namespace" "demo" {
metadata {
name = "demo-namespace"
}
}
deployment.tf
用于部署应用程序的文件。resource "kubernetes_deployment" "demo" {
metadata {
name = "demo-deployment"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
replicas = 3
selector {
match_labels = {
app = "demo"
}
}
template {
metadata {
labels = {
app = "demo"
}
}
spec {
container {
image = "nginx:latest"
name = "demo-deployment"
}
}
}
}
}
service.tf
文件来公开部署。resource "kubernetes_service" "demo" {
metadata {
name = "demo-service"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
selector = {
app = "example"
}
port {
port = 80
target_port = 80
}
type = "LoadBalancer"
}
}
configmap.tf
文件来定义配置映射。resource "kubernetes_config_map" "demo" {
metadata {
name = "demo-config"
namespace = kubernetes_namespace.example.metadata[0].name
}
data = {
"config.json" = jsonencode({
"key" = "value"
})
}
}
secret.tf
文件来定义 Kubernetes Secret。resource "kubernetes_secret" "demo" {
metadata {
name = "demo-secret"
namespace = kubernetes_namespace.example.metadata[0].name
}
data = {
"password" = base64encode("supersecret")
}
}
注意:使用 Kubernetes 本机密钥而不是使用外部密钥或密钥存储 csi 驱动程序并不是一个好的做法
pvc.tf
文件来定义 PersistentVolumeClaim。resource "kubernetes_persistent_volume_claim" "demo" {
metadata {
name = "demo-pvc"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
access_modes = ["ReadWriteOnce"]
resources {
requests = {
storage = "10Gi"
}
}
}
}
ConfigMap
和 Secret
。resource "kubernetes_deployment" "demo" {
metadata {
name = "demo-deployment"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
replicas = 3
selector {
match_labels = {
app = "demo"
}
}
template {
metadata {
labels = {
app = "demo"
}
}
spec {
container {
image = "nginx:latest"
name = "demo"
volume_mount {
mount_path = "/etc/config"
name = "config"
}
volume_mount {
mount_path = "/etc/secret"
name = "secret"
read_only = true
}
}
volume {
name = "config"
config_map {
name = kubernetes_config_map.example.metadata[0].name
}
}
volume {
name = "secret"
secret {
secret_name = kubernetes_secret.example.metadata[0].name
}
}
}
}
}
}
terraform init
在工作目录中运行命令。它将下载所有必要的提供程序和所有模块,并初始化后端。terraform plan
在工作目录中运行命令。它将给出执行计划。terraform apply
命令,它将在AWS上创建所有必需的资源。kubectl get all --namespace=demo-namespace
现在,您已经学习了如何使用 Terraform 创建各种 K8s 资源。您现在可以使用它并根据您的需要进行相应的修改。