چگونه و چه زمانی از Terraform با Kubernetes استفاده کنیم

این مقاله در ابتدا توسط کووید راتی در وبلاگ mogenius ارسال شده است.
Terraform یک زیرساخت به عنوان ابزار کد است که جایگزین روش ClickOps برای تعریف، استقرار و مدیریت زیرساخت به صورت محلی، درون محل یا در فضای ابری میشود. روش اعلانی آن برای تعریف زیرساخت به شما امکان می دهد بر روی وضعیت هدف زیرساخت تمرکز کنید تا مراحل مورد نیاز برای دستیابی به آن وضعیت، که مدیریت زیرساخت را آسان تر می کند.
Terraform برای تعریف زیرساخت مورد نظر شما زبان اعلانی خود به نام زبان پیکربندی Hashicorp (که به آن زبان Terraform نیز میگویند) دارد و ابزار خط فرمان آن انجام عملیات روی زیرساخت شما را آسان میکند.
در این مقاله، نحوه و زمان استفاده از Terraform با Kubernetes را با مثالی از استقرار محلی nginx خواهید آموخت.
چه زمانی از Terraform با Kubernetes استفاده کنیم
Terraform یک ابزار مبتنی بر پلتفرم است، بنابراین میتوانید از آن برای مدیریت کل پشته خود صرف نظر از چارچوبها، کتابخانهها، پلتفرمهای ابری و غیره استفاده کنید. این ابزار با آوردن تمام تعاریف زیرساخت خود در یک مکان، توسعه چند ابری و ابری ترکیبی را امکانپذیر میکند. مدیریت زیرساخت ها، هزینه ها و امنیت را آسان تر می کند.
ترکیب Terraform با سیستم کنترل نسخه و خط لوله CI/CD به شما کمک می کند تا استقرار زیرساخت را خودکار کنید. اگر پروژه Terraform خود را در یک مخزن Git ذخیره کنید، هر گونه تغییر در پروژه با خروجی طرح Terraform همراه است که تغییراتی را که روابط عمومی در زیرساخت ایجاد می کند، توضیح می دهد. سپس بازبین میتواند تغییرات کد را تأیید کند و a را فعال کند terraform application -auto-approve فرمان
استفاده از Kubernetes با Terraform به شما امکان می دهد تمام زیرساخت های خود را – مانند شبکه، حجم های ذخیره سازی، پایگاه های داده، گروه های امنیتی، فایروال ها، DNS و غیره – در پروژه Terraform تعریف کنید. وقتی با تمام زیرساختها در محیطهای چند ابری و ترکیبی-ابر سروکار دارید، Terraform به کارتان میآید، بهویژه زمانی که در حال مدیریت وابستگیها بین اشیاء مختلف Kubernetes و منابع ابری هستید.
استفاده از Terraform با Kubernetes
حالا بیایید نحوه استفاده از Terraform با Kubernetes را با بررسی نمونه ای از راه اندازی دو خوشه nginx جداگانه بررسی کنیم.
برای سادگی، شما خوشه ها را در ماشین محلی خود مستقر خواهید کرد، که برای توسعه عالی است، اما در یک سناریوی دنیای واقعی، خوشه ها احتمالاً در فضای ابری میزبانی می شوند.
تنظیم محیط
برای استفاده از Terraform با Kubernetes، به ابزارهای زیر روی سیستم خود نیاز دارید:
-
Docker Engine: پایه و اساس استقرار کانتینرها را با استفاده از Minikube در دستگاه محلی شما ایجاد می کند
-
Minikube: به عنوان خوشه محلی Kubernetes عمل می کند که از آن برای اجرای سرویس ها و استقرارهای nginx جداگانه استفاده خواهید کرد.
-
kubectl: به شما امکان می دهد از خط فرمان خود به منابع Kubernetes – مانند pods، استقرار و سرویس ها – دسترسی پیدا کنید.
-
Terraform CLI: به شما امکان می دهد با یک پروژه Terraform از خط فرمان خود کار کنید (یعنی می توانید از این ابزار برای برنامه ریزی، اعمال و تخریب زیرساخت استفاده کنید)
- Git: سیستم کنترل نسخه که به شما امکان می دهد کد منبع ماژولی را که در این آموزش با آن کار می کنید دانلود و مدیریت کنید.
اطمینان حاصل کنید که Docker Engine و Minikube فعال هستند. برای شروع Minikube از دستورات زیر استفاده کنید:
minikube start
minikube dashboard
خروجی مشابه زیر را خواهید دید:
➜ ~ minikube dashboard
🤔 Verifying dashboard health ...
🚀 Launching proxy ...
🤔 Verifying proxy health ...
🎉 Opening http://127.0.0.1:57560/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
URL http://127.0.0.1:57560 را یادداشت کنید زیرا بعداً در این آموزش به آن نیاز خواهید داشت.
با اجرای دستور زیر وضعیت دستگاه Docker خود را بررسی کنید:
docker info
در نهایت، این مخزن GitHub را که حاوی ماژول Terraform nginx برای این آموزش است، کلون کنید:
git clone https://github.com/kovid-r/terraform-nginx-k8s.git
اگرچه می توانید تمام کدهای Terraform خود را در یک واحد بنویسید .tf فایل، عمل بدی برای مدیریت کد در نظر گرفته می شود. در مخزن، کدی را خواهید دید که به سه فایل زیر در مخزن GitHub تقسیم شده است:
- main.tf: شامل تعاریف فضای نام، استقرار و سرویس Kubernetes است
- variables.tf: شامل تعاریف متغیرهای Terraform است که برای آن مقادیر را از طریق پارامترهای فایل پیکربندی Minikube ارائه خواهید کرد.
- versions.tf: شامل تعریف ارائه دهنده Kubernetes به همراه منبع و نسخه آن است
می توانید اطلاعات بیشتری در مورد نحوه ساختاردهی فایل ها و دایرکتوری ها در مخزن GitHub بیابید.
پیکربندی ارائه دهنده Terraform Kubernetes
این آموزش از ارائهدهنده رسمی Kubernetes Hashicorp برای ایجاد دو خوشه محلی Kubernetes استفاده میکند.
هنگامی که دستور terraform init را برای اولین بار اجرا می کنید، قطعه زیر از فایل versions.tf در مخزن GitHub ماژول ارائه دهنده را به پروژه محلی Terraform شما وارد می کند:
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.11" # Update based on latest stable version
}
}
required_version = ">= 1.0.0"
}
ایجاد و پیکربندی یک ماژول Terraform nginx
برای استقرار nginx با استفاده از Kubernetes و Terraform، ابتدا باید یک ماژول Terraform nginx ایجاد کنید. Terraform به شما امکان می دهد هنگام ایجاد منابع جدید در زیرساخت خود، ماژول های قابل استفاده مجدد ایجاد کنید. اگرچه ایجاد ماژول ها آسان است، Terraform به طور کلی توصیه می کند که از آنها در حد اعتدال استفاده کنید، به خصوص زمانی که انتزاع جدیدی در معماری برنامه شما ایجاد نمی کنند.
می توانید آموزش رسمی Terraform را دنبال کنید تا ماژول خود را بسازید، اما برای این آموزش، از پیش ساخته استفاده خواهید کرد. terraform-nginx-k8s ماژول از مخزن GitHub. این ماژول بر اساس ارائه دهنده رسمی Kubernetes از رجیستری Terraform است.
قبل از استقرار terraform-nginx-k8s ماژول، اجازه دهید نحوه پیکربندی اجزای اصلی آن و نحوه تعریف منابع مختلف Kubernetes را بررسی کنیم.
ایجاد فضای نام Kubernetes برای استقرار منابع
می توانید از فضاهای نام Kubernetes برای مدیریت خوشه ها و زیرخوشه ها به صورت جداگانه استفاده کنید. ماژول از کد زیر برای ایجاد فضای نام جدید استفاده می کند:
## resource "kubernetes_namespace" "nginx" {
metadata {
name = var.namespace
}
}
این یک جدید ایجاد می کند kubernetes_namespace با نام پیشفرض تنظیم شده به عنوان nginx، که میتوانید آن را در خود لغو کنید متغیرها.tf فایل بعداً در آموزش، از این کد برای ایجاد دو فضای نام استفاده خواهید کرد. nginx-cluster-one-ns و nginx-cluster-two-ns، یکی برای هر خوشه Kubernetes. در هر یک از آن خوشه ها، استقرارهای nginx را ایجاد خواهید کرد.
تعریف استقرار nginx
بعد، ماژول استقرار nginx را با استفاده از منبع kubernetes_deployment تعریف می کند:
resource "kubernetes_deployment" "nginx" {
metadata {
name = "nginx-deployment"
namespace = kubernetes_namespace.nginx.metadata[0].name
labels = {
app = "nginx"
}
}
spec {
replicas = var.replicas
selector {
match_labels = {
app = "nginx"
}
}
template {
metadata {
labels = {
app = "nginx"
}
}
spec {
container {
name = "nginx"
image = "nginx:${var.nginx_version}"
port {
container_port = 80
}
resources {
limits = {
cpu = var.cpu_limit
memory = var.memory_limit
}
}
}
}
}
}
}
این منبع آرگومان هایی مانند فضای نام، تعداد نسخه ها، نسخه nginx، محدودیت CPU و محدودیت حافظه را از متغیرها.tf فایل هنگام فراخوانی ماژول می توانید تعاریف متغیر پیش فرض را لغو کنید. به عنوان مثال، وقتی ماژول را برای پیکربندی استقرار Kubernetes در قسمت بعدی آموزش وارد میکنید، برخی از متغیرها را به صورت زیر تعریف میکنید:
namespace = "nginx-cluster-one-ns"
nginx_version = "1.21.1"
replicas = 2
cpu_limit = "250"
memory_limit = "128Mi"
این نسخه nginx و منابعی را که می خواهید به سرور ارائه دهید را مشخص می کند.
تعریف سرویس Kubernetes برای nginx
در نهایت، ماژول یک سرویس Kubernetes را تعریف می کند، برنامه ای که در خوشه Kubernetes شما در پشت یک نقطه پایانی منفرد رو به بیرون اجرا می شود:
resource "kubernetes_service" "nginx" {
metadata {
name = "nginx-service"
namespace = kubernetes_namespace.nginx.metadata[0].name
}
spec {
selector = {
app = "nginx"
}
port {
port = 80
target_port = 80
}
type = var.service_type
}
}
استقرار ماژول و اعمال تنظیمات
اکنون که تمام اجزای اصلی ماژول Kubernetes nginx را اجرا کرده اید، می توانید آن را مستقر کرده و پیکربندی خود را اعمال کنید.
ابتدا دو خوشه مجزای nginx را با قرار دادن قطعه زیر در a تعریف کنید .tf فایل را در دایرکتوری جدیدی که انتخاب می کنید:
module "nginx_cluster_one" {
source = "/path/to/nginx-module/"
kubernetes_host = "http://127.0.0.1:57560/" # replace with your minikube dashboard address
kubernetes_client_certificate = "/path/to/.minikube/profiles/minikube/client.crt"
kubernetes_client_key = "/path/to/.minikube/profiles/minikube/client.key"
kubernetes_cluster_ca_certificate = "/path/to/.minikube/ca.crt"
namespace = "nginx-cluster-one-ns"
nginx_version = "1.21.1"
replicas = 2
cpu_limit = "250m"
memory_limit = "128Mi"
service_type = "ClusterIP"
}
module "nginx_cluster_two" {
source = "/path/to/nginx-module/"
kubernetes_host = "http://127.0.0.1:57560/" # replace with your minikube dashboard address
kubernetes_client_certificate = "/path/to/.minikube/profiles/minikube/client.crt"
kubernetes_client_key = "/path/to/.minikube/profiles/minikube/client.key"
kubernetes_cluster_ca_certificate = "/path/to/.minikube/ca.crt"
namespace = "nginx-cluster-two-ns"
nginx_version = "1.21.1"
replicas = 3
cpu_limit = "250m"
memory_limit = "128Mi"
service_type = "ClusterIP"
}
این ماژول را برای هر دو خوشه وارد می کند و پارامترهای خاص خوشه را برای متغیرهایی مانند فضای نام Kubernetes، نسخه nginx، محدودیت CPU، محدودیت حافظه و نوع سرویس و موارد دیگر در اختیار آن قرار می دهد. حتما به روز رسانی کنید kubernetes_client_certificate، kubernetes_client_key، و kubernetes_cluster_ca_certificate متغیرهایی با مسیرهای صحیح از فایل پیکربندی Minikube شما، که در آن خواهد بود .minikube پوشه در فهرست اصلی که Minikube را در آن نصب کرده اید.
هنگامی که متغیرها را به روز کردید، دستورات Terraform زیر را یکی پس از دیگری اجرا کنید:
terraform init
terraform plan
terraform apply
هنگامی که شما اجرا می کنید terraform اعمال شود دستور، از شما خواسته می شود تا اقدامات را تأیید کنید. بله را تایپ کنید هنگامی که اینتر را فشار دهید، خروجی مشابه زیر را خواهید دید:
Plan: 6 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
module.nginx_cluster_one.kubernetes_namespace.nginx: Creating...
module.nginx_cluster_one.kubernetes_namespace.nginx: Creation complete after 0s [id=nginx-cluster-one-ns]
module.nginx_cluster_one.kubernetes_service.nginx: Creating...
module.nginx_cluster_one.kubernetes_deployment.nginx: Creating...
module.nginx_cluster_two.kubernetes_namespace.nginx: Creating...
module.nginx_cluster_two.kubernetes_namespace.nginx: Creation complete after 0s [id=nginx-cluster-two-ns]
module.nginx_cluster_one.kubernetes_service.nginx: Creation complete after 0s [id=nginx-cluster-one-ns/nginx-service]
module.nginx_cluster_two.kubernetes_service.nginx: Creating...
module.nginx_cluster_two.kubernetes_deployment.nginx: Creating...
module.nginx_cluster_two.kubernetes_service.nginx: Creation complete after 0s [id=nginx-cluster-two-ns/nginx-service]
module.nginx_cluster_one.kubernetes_deployment.nginx: Creation complete after 4s [id=nginx-cluster-one-ns/nginx-deployment]
module.nginx_cluster_two.kubernetes_deployment.nginx: Creation complete after 4s [id=nginx-cluster-two-ns/nginx-deployment]
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
پس از تکمیل استقرار، از دستور terraform show استفاده کنید تا خودتان بررسی کنید که آیا زیرساخت مورد نظر مستقر شده است یا خیر. یک نمونه خروجی از دستور terraform show را می توان در این GitHub Gist یافت.
متناوبا، استفاده کنید kubectl CLI برای دریافت اطلاعات در مورد خوشه های خود و منابع مستقر در آنها. در اینجا نحوه دریافت همه منابع مستقر در فضای نام آمده است nginx-cluster-one-ns:
➜ kubectl get all -n nginx-cluster-one-ns
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7d85df7dbc-ff2wz 1/1 Running 0 101m
pod/nginx-deployment-7d85df7dbc-g8xqh 1/1 Running 0 101m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service ClusterIP 10.109.36.68 80/TCP 128m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 128m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7d85df7dbc 2 2 2 128m
replicaset.apps/nginx-deployment-d55b49455 0 0 0 116m
اگر خوشه دوم nginx با موفقیت مستقر شد، باید همان را دریافت کنید nginx-cluster-two-ns.
این اطلاعات همانطور که در تصویر زیر نشان داده شده است در داشبورد Kubernetes نیز موجود است:
مقیاس بندی استقرار nginx
مقیاس بندی استقرار nginx شما در Terraform بسیار ساده است. برای افزایش مقیاس استقرار nginx در این آموزش، کافی است به فایل **.tf ** بروید و تغییرات زیر را اعمال کنید:
- در nginx_cluster_one تعداد کپی ها را از 2 به 4 و محدودیت CPU را از 250 متر به 450 متر تغییر دهید.
- در nginx_cluster_two تعداد کپی ها را از 3 به 5 و محدودیت CPU را از 250 متر به 450 متر تغییر دهید.
این تغییرات به استقرار nginx شما اجازه میدهد تا به دلیل افزایش منابع، درخواستهای بیشتری را برطرف کند. پس از انجام این تغییرات، شما .tf باید چیزی شبیه به زیر باشد:
module "nginx_cluster_one" {
source = "/path/to/nginx-module/"
kubernetes_host = "http://127.0.0.1:57560/" # replace with your minikube dashboard address
kubernetes_client_certificate = "/path/to/.minikube/profiles/minikube/client.crt"
kubernetes_client_key = "/path/to/.minikube/profiles/minikube/client.key"
kubernetes_cluster_ca_certificate = "/path/to/.minikube/ca.crt"
namespace = "nginx-cluster-one-ns"
nginx_version = "1.21.1"
replicas = 4
cpu_limit = "450m"
memory_limit = "128Mi"
service_type = "ClusterIP"
}
module "nginx_cluster_two" {
source = "/path/to/nginx-module/"
kubernetes_host = "http://127.0.0.1:57560/" # replace with your minikube dashboard address
kubernetes_client_certificate = "/path/to/.minikube/profiles/minikube/client.crt"
kubernetes_client_key = "/path/to/.minikube/profiles/minikube/client.key"
kubernetes_cluster_ca_certificate = "/path/to/.minikube/ca.crt"
namespace = "nginx-cluster-two-ns"
nginx_version = "1.21.1"
replicas = 5
cpu_limit = "450m"
memory_limit = "128Mi"
service_type = "ClusterIP"
}
تغییرات را با استفاده از terraform اعمال شود دستور:
Plan: 0 to add, 2 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
module.nginx_cluster_two.kubernetes_deployment.nginx: Modifying... [id=nginx-cluster-two-ns/nginx-deployment]
module.nginx_cluster_one.kubernetes_deployment.nginx: Modifying... [id=nginx-cluster-one-ns/nginx-deployment]
module.nginx_cluster_two.kubernetes_deployment.nginx: Still modifying... [id=nginx-cluster-two-ns/nginx-deployment, 10s elapsed]
module.nginx_cluster_one.kubernetes_deployment.nginx: Still modifying... [id=nginx-cluster-one-ns/nginx-deployment, 10s elapsed]
module.nginx_cluster_two.kubernetes_deployment.nginx: Modifications complete after 15s [id=nginx-cluster-two-ns/nginx-deployment]
module.nginx_cluster_one.kubernetes_deployment.nginx: Modifications complete after 15s [id=nginx-cluster-one-ns/nginx-deployment]
Apply complete! Resources: 0 added, 2 changed, 0 destroyed.
پس از اعمال تغییرات زیرساخت، آن را اجرا کنید kubectl همه -n nginx-cluster-one-ns را دریافت می کند فرمان برای تأیید اینکه شما به جای دو پاد در کلاستر خود چهار پاد در حال اجرا دارید:
➜ kubectl get all -n nginx-cluster-one-ns
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-d55b49455-2sqwg 1/1 Running 0 33s
pod/nginx-deployment-d55b49455-n87wf 1/1 Running 0 33s
pod/nginx-deployment-d55b49455-ww6l8 1/1 Running 0 25s
pod/nginx-deployment-d55b49455-zlntp 1/1 Running 0 26s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service ClusterIP 10.109.36.68 80/TCP 141m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 4/4 4 4 141m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7d85df7dbc 0 0 0 141m
replicaset.apps/nginx-deployment-d55b49455 4 4 4 128m
مدیریت منابع Kubernetes با Terraform
اکنون میدانید که چگونه nginx را در دو خوشه مختلف Kubernetes راهاندازی و استقرار کنید، و میتوانید شروع به کاوش منابع اضافی Kubernetes کنید که به مدیریت زیرساخت شما کمک میکنند.
برای مدیریت بهتر استقرارهای چندگانه یک منبع، از یک ConfigMap برای تزریق فایل های پیکربندی و متغیرهای محیطی به پادهای خود استفاده کنید که nginx می تواند در حین راه اندازی بخواند. به عنوان مثال، یک نمونه از تعریف منبع Kubernetes ConfigMap فایل nginx.conf را ذخیره می کند که می تواند در اولین بارگذاری nginx بارگیری شود:
resource "kubernetes_config_map" "nginx_configmap" {
metadata {
name = "nginx-configmap"
namespace = var.namespace
}
data = {
"nginx.conf" = <<-EOF
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
EOF
}
}
یکی دیگر از منابع مهم Kubernetes این است kubernetes_ingress، که به شما امکان می دهد قوانینی را برای اتصالات ورودی برای رسیدن به نقاط پایانی تعریف شده توسط باطن تعریف کنید. در اینجا یک نمونه از اسناد رسمی Terraform در مورد نحوه توصیف این منبع در پروژه Terraform آورده شده است:
resource "kubernetes_ingress" "example_ingress" {
metadata {
name = "example-ingress"
}
spec {
backend {
service_name = "myapp-1"
service_port = 8080
}
rule {
http {
path {
backend {
service_name = "myapp-1"
service_port = 8080
}
path = "/app1/*"
}
path {
backend {
service_name = "myapp-2"
service_port = 8080
}
path = "/app2/*"
}
}
}
tls {
secret_name = "tls-secret"
}
}
}
در حالی که این منابع بخشی از مخزن GitHub نیستند که در ابتدای آموزش شبیه سازی کرده اید، می توانید این منابع را بر اساس نیاز خود به ماژول خود اضافه کنید.
نتیجه گیری
این مقاله برخی از ویژگیهای مفید Terraform و نحوه استفاده از آن برای استقرار nginx در Kubernetes با استفاده از یک ماژول ساخته شده با ارائهدهنده رسمی Kubernetes از رجیستری Terraform را نشان میدهد.
مدیریت Kubernetes می تواند دشوار باشد، به خصوص زمانی که تغییرات ایجاد شده در محیط های محلی را به تولید می رسانید. از آنجایی که انعکاس تنظیمات واقعی تولید دشوار است، تیم ها اغلب با معضل بدنام «روی ماشین من کار می کند» مواجه می شوند.
mogenius به شما کمک میکند تا با ایجاد محیطهای سلفسرویس Kubernetes با دید بهتر، با این چالش مقابله کنید. mogenius با دید یکپارچه از اجزای برنامه و زیرساخت، تعامل ساده Kubernetes و عیبیابی هدایتشده، از تست محلی بهتر برای توسعهدهندگان پشتیبانی میکند. همچنین به شما این امکان را می دهد که به طور یکپارچه با خطوط لوله CI/CD ادغام شوید، دامنه های خارجی را پیکربندی کنید، SSL را مدیریت کنید، تعادل بار را تنظیم کنید و مدیریت گواهی را مدیریت کنید. این رویکرد تجربه توسعهدهنده را افزایش میدهد، به ویژه در محیطهای ابری یا چند ابری.