الگوی برنامههای کاربردی: استراتژیهای استقرار کارآمد Kubernetes با Terraform و ArgoCD

فهرست مطالب
- مروری بر فناوریهای بومی ابری
- Terraform، Kubernetes، ArgoCD یکپارچه سازی
- مشکلات مدیریت دستی
- پیچیدگی های استقرار
- زیرساخت به عنوان کد
- اصول GitOps
- پیکربندی خوشه
- راه اندازی شبکه
- مدیریت منابع
- راه اندازی اولیه
- پیکربندی RBAC
- مراحل ورود
ساختارهای مخزن
- مخزن برنامه
- مخزن GitOps
- مدیریت مانیفست
استراتژی های پیاده سازی
- پیکربندی مخزن
- دستورات ArgoCD CLI
- الگوی “برنامه برنامه ها”.
مفاهیم اصلی
- پیکربندی اعلامی
- کنترل نسخه
- همگام سازی خودکار
مزایای سازمانی
- مزایای تیم زیرساخت
- بهبودهای تیم توسعه
- بهره وری عملیاتی
- تعریف زیرساخت
- استقرار ArgoCD
- گردش کار یکپارچه سازی مداوم
- هم افزایی فناوری
- مقیاس پذیری و چابکی
- ابزارهای زیرساخت
- راه حل های نظارتی
- پلتفرم های کنترل نسخه
مقدمه
در چشمانداز سریع در حال تحول فناوریهای بومی ابری، سازمانها بهطور مداوم به دنبال استراتژیهایی برای سادهسازی زیرساختها، افزایش قابلیت اطمینان استقرار و بهبود همکاری تیمی هستند.
ترکیبی از اصول Terraform، Kubernetes، ArgoCD و GitOps راه حلی قدرتمند برای این چالش ها ارائه می دهد.
چالش زیرساخت های سنتی
به طور سنتی، مدیریت زیرساخت و استقرار برنامه ها فرآیندهای دستی و مستعد خطا بودند:
- محیط های ناسازگار
- رانش پیکربندی
- دید محدود به تغییرات
- رویه های پیچیده بازگشت
- استقرار آهسته و پرخطر
زیرساخت رویکرد مدرن را به عنوان کد و GitOps وارد کنید
تدارک زیرساخت Terraform دوباره طراحی شد
Terraform مدیریت زیرساخت را توسط:
- تعریف زیرساخت با استفاده از فایل های پیکربندی اعلامی
- پشتیبانی از استقرار ابرهای چند ابری و ترکیبی
- ایجاد زیرساخت های سازگار و قابل تکرار
- ارائه یک نمای واضح و کنترل شده توسط نسخه از وضعیت زیرساخت
مثال تدارک خوشه Terraform Kubernetes
در یک پروژه، که ساختار پروژه من به شرح زیر است:
├── Makefile
├── README.md
├── plans
│ └── plan.tfplan
├── resources.helm.tf
├── resources.main.tf
├── resources.outputs.tf
├── resources.variables.tf
├── terraform.backend.tf
├── terraform.data.tf
├── terraform.locals.tf
└── terraform.provider.tf
در resources.main.tf
، من منابع مورد نیاز برای چرخش خوشه kubernetes را همانطور که در زیر مشاهده می کنید تعریف می کنم:
module "network_security_group" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/network_security_group"
name = "rnd-nsg"
location = data.azurerm_resource_group.existing.location
resource_group_name = data.azurerm_resource_group.existing.name
rules = [
{
name = "nsg-rule-1"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "*"
source_port_range = "*"
destination_port_range = "*"
source_address_prefix = "*"
destination_address_prefix = "*"
},
{
name = "nsg-rule-2"
priority = 101
direction = "Outbound"
access = "Allow"
protocol = "*"
source_port_range = "*"
destination_port_range = "*"
source_address_prefix = "*"
destination_address_prefix = "*"
}
]
depends_on = [data.azurerm_resource_group.existing]
tags = merge(var.tags)
}
module "virtual_network" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/virtual_network"
name = "rndvnet"
location = data.azurerm_resource_group.existing.location
resource_group_name = data.azurerm_resource_group.existing.name
address_space = ["10.0.0.0/16"]
depends_on = [data.azurerm_resource_group.existing, module.network_security_group.this]
tags = merge(var.tags)
}
module "k8ssubnet" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/subnet"
name = "rndsubnetk8s"
resource_group_name = data.azurerm_resource_group.existing.name
virtual_network_name = module.virtual_network.virtual_network_name
subnet_address_prefix = ["10.0.1.0/24"]
service_endpoints = ["Microsoft.Storage", "Microsoft.Web"]
delegation_name = null
service_delegation_name = null
service_delegation_actions = null
depends_on = [data.azurerm_resource_group.existing, module.virtual_network.this, module.network_security_group.this]
}
module "podsubnet" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/subnet"
name = "rndsubnetpods"
resource_group_name = data.azurerm_resource_group.existing.name
virtual_network_name = module.virtual_network.virtual_network_name
subnet_address_prefix = ["10.0.2.0/24"]
service_endpoints = ["Microsoft.Storage"]
delegation_name = "aks-delegation"
service_delegation_name = "Microsoft.ContainerService/managedClusters"
service_delegation_actions = ["Microsoft.Network/virtualNetworks/subnets/join/action"]
depends_on = [data.azurerm_resource_group.existing, module.virtual_network.this, module.network_security_group.this]
}
module "subnet_nsg_association" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/subnet_network_security_group_association"
subnet_id = module.k8ssubnet.subnet_id
network_security_group_id = module.network_security_group.id
depends_on = [data.azurerm_resource_group.existing, module.k8ssubnet.this, module.network_security_group.this]
}
module "container_registry" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/container_registry"
resource_group_name = data.azurerm_resource_group.existing.name
location = data.azurerm_resource_group.existing.location
name = "rndacrteo"
sku = "Standard"
is_admin_enabled = true
is_public_network_access_enabled = true
depends_on = [data.azurerm_resource_group.existing]
tags = merge(var.tags)
}
module "kubernetes" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/kubernetes/kubernetes_cluster"
name = "k8s-cluster"
resource_group_name = data.azurerm_resource_group.existing.name
location = data.azurerm_resource_group.existing.location
node_count = 1
dns_prefix = "rndaks"
vnet_subnet_id = module.k8ssubnet.subnet_id
vm_size = "Standard_A2_v2"
pod_subnet_id = module.podsubnet.subnet_id
kubernetes_version = "1.30.0"
is_role_based_access_control_enabled = true
sku_tier = "Free"
default_node_pool_name = "k8spool"
service_cidr = "10.1.0.0/16"
dns_service_ip = "10.1.0.10"
depends_on = [module.k8ssubnet.this, module.podsubnet.this]
}
module "k8s_role_assignment" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/role_assignment"
principal_id = module.kubernetes.kubelet_identity_object_id
role_definition_name = "AcrPull"
scope = module.container_registry.id
skip_service_principal_aad_check = true
}
سپس در resources.helm.tf
، من منابع مورد نیاز برای پیکربندی نمودارهای فرمان را در خوشه ارائه شده بالا تعریف می کنم
module "ingress_nginx" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/helm/helm_release"
chart = "ingress-nginx"
name = "ingress-nginx"
create_namespace = true
namespace = "ingress-nginx"
values = [
<<-EOF
controller:
service:
type: LoadBalancer
EOF
]
repository = "https://kubernetes.github.io/ingress-nginx"
providers = {
helm = helm.helmk8s
}
depends_on = [data.azurerm_kubernetes_cluster.cluster, module.kubernetes]
}
module "argocd" {
source = "git::ssh://git@ssh.dev.azure.com/v3/////modules/helm/helm_release"
chart = "argo-cd"
name = "argocd"
create_namespace = true
namespace = "argocd"
values = [
<<-EOF
server:
service:
type: ClusterIP
configs:
params:
"server.insecure": "true"
admin:
username: admin
EOF
]
repository = "https://argoproj.github.io/argo-helm"
providers = {
helm = helm.helmk8s
}
depends_on = [data.azurerm_kubernetes_cluster.cluster, module.kubernetes]
}
در مرحله بعد، ما باید چند دستور را اجرا کنیم تا بتوانیم به سرور / CLI argoCD دسترسی پیدا کنیم
راهنمای راه اندازی و پیکربندی اولیه ArgoCD
1. بازیابی رمز عبور و بازیابی
# خرابی فرمان
# Reset the admin secret by clearing existing password data
kubectl patch secret argocd-secret -n argocd -p '{"data": {"admin.password": null, "admin.passwordMtime": null}}'
##### Restart ArgoCD server to generate new password
kubectl delete pods -n argocd -l app.kubernetes.io/name=argocd-server
##### Retrieve the initial admin password
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
بعداً از این رمز عبور استفاده خواهیم کرد
# این چه کاری انجام می دهد
- رمز عبور مدیریت موجود را پاک می کند
- ArgoCD را برای ایجاد رمز عبور جدید فعال می کند
- رمز عبور جدید را برای ورود استخراج می کند
2. پیکربندی RBAC (کنترل دسترسی مبتنی بر نقش).
# RBAC ConfigMap را ویرایش کنید
kubectl -n argocd edit configmap argocd-rbac-cm
# پیکربندی خط مشی RBAC
policy.csv: |
# Grant full admin access to all applications
p, role:admin, applications, *, *, *
# Set default role to admin
policy.default: role:admin
# توضیح خط مشی
-
p, role:admin, applications, *, *, *
: دسترسی کامل به همه برنامه ها را فراهم می کند -
policy.default: role:admin
: مدیر را به عنوان نقش پیش فرض برای همه کاربران تنظیم می کند
توجه: در مورد ما، ما role:admin را تنظیم می کنیم، زیرا تنها یک مدیر کلاستر وجود خواهد داشت که به سرور kubernetes و/یا argoCD دسترسی خواهد داشت.
3. سرور ArgoCD را مجددا راه اندازی کنید
# Restart ArgoCD to apply RBAC changes
kubectl -n argocd rollout restart deployment argocd-server
4. وارد ArgoCD شوید
از آنجایی که ما سرور argocd خود را به عنوان LoadBalancer یا Ingress نمایش نمی دهیم، باید با استفاده از پورت فورواردینگ به آن دسترسی داشته باشیم، این امنیت بیشتر را تضمین می کند.
# Forward port to access ArgoCD server locally
kubectl port-forward service/argocd-server -n argocd 8888:443
##### Login using admin credentials
argocd login 127.0.0.1:8888 --username admin --password
اکنون می توانید از argocd CLI و همچنین open استفاده کنید localhost:8888
در مرورگر و … Voila!
نکات مهم
- هشدار امنیتی: نقش مدیریت پیش فرض دسترسی کامل خوشه ای را فراهم می کند
- به طور منظم اعتبارنامه ها را بچرخانید
- از رمزهای عبور قوی و منحصر به فرد استفاده کنید
گردش کار GitOps
ArgoCD شکاف بین مخازن Git و خوشه های Kubernetes را پر می کند:
- تحویل مستمر اعلامی
- همگام سازی خودکار حالت های برنامه
- بازگشت آسان و نسخه سازی
- پشتیبانی از چندین استراتژی همگام سازی
پیکربندی برنامه ArgoCD
Application Repo
این مخزن حاوی کد برنامه میکروسرویس است، می تواند یک مخزن در هر میکروسرویس باشد یا می تواند یک مونورپو باشد که همه کدهای میکروسرویس را در خود جای دهد.
همچنین حاوی خطوط لوله است که تصاویر را می سازد و به رجیستری کانتینر می فرستد
./project
├── Azure-Pipelines
│ ├── azure-pipelines.yml
│ ├── azure-pipelines2.yml
│ └── azure-pipelines3.yml
├── Docker
│ ├── Dockerfile.1
│ ├── Dockerfile.2
│ ├── Dockerfile.3
│ └── nginx.conf
├── demo-app
│ ├── README.md
│ ├── angular.json
│ ├── package.json
│ ├── public
│ │ └── favicon.ico
│ ├── src
│ │ ├── app
│ │ │ ├── app.component.css
│ │ │ ├── app.component.html
│ │ │ ├── app.component.spec.ts
│ │ │ ├── app.component.ts
│ │ │ ├── app.config.server.ts
│ │ │ ├── app.config.ts
│ │ │ └── app.routes.ts
│ │ ├── index.html
│ │ ├── main.server.ts
│ │ ├── main.ts
│ │ ├── server.ts
│ │ └── styles.css
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ └── tsconfig.spec.json
├── demo-app2
│ ├── README.md
│ ├── angular.json
│ ├── package.json
│ ├── public
│ │ └── favicon.ico
│ ├── src
│ │ ├── app
│ │ │ ├── app.component.css
│ │ │ ├── app.component.html
│ │ │ ├── app.component.spec.ts
│ │ │ ├── app.component.ts
│ │ │ ├── app.config.server.ts
│ │ │ ├── app.config.ts
│ │ │ └── app.routes.ts
│ │ ├── index.html
│ │ ├── main.server.ts
│ │ ├── main.ts
│ │ ├── server.ts
│ │ └── styles.css
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ └── tsconfig.spec.json
└── demo-app3
├── README.md
├── angular.json
├── package.json
├── public
│ └── favicon.ico
├── src
│ ├── app
│ │ ├── app.component.css
│ │ ├── app.component.html
│ │ ├── app.component.spec.ts
│ │ ├── app.component.ts
│ │ ├── app.config.server.ts
│ │ ├── app.config.ts
│ │ └── app.routes.ts
│ ├── index.html
│ ├── main.server.ts
│ ├── main.ts
│ ├── server.ts
│ └── styles.css
├── tsconfig.app.json
├── tsconfig.json
└── tsconfig.spec.json
بیایید Azure Pipelines را برای هر 3 برنامه آزمایشی راهاندازی کنیم تا بتوان تصاویر را برای استقرار بعدی در ACR قرار داد.
مخزن GitOps
در مرحله بعد، GitOps Repo را داریم که با ArgoCD پیکربندی می شود تا نظارت شود
./demo-app-manifests
├── manifests
│ ├── argocd
│ │ ├── argocd-application-master
│ │ │ └── masterapp.yaml
│ │ └── argocd-applications
│ │ ├── demo-app-argoapp.yaml
│ │ ├── demo-app2-argoapp.yaml
│ │ └── demo-app3-argoapp.yaml
│ └── main
│ ├── demo-app
│ │ ├── deployment.yaml
│ │ └── service-ingress.yaml
│ ├── demo-app2
│ │ ├── deployment.yaml
│ │ └── service-ingress.yaml
│ └── demo-app3
│ ├── deployment.yaml
│ └── service-ingress.yaml
└── readmes
├── README.md
└── argoCD.md
پوشه manifests برای مدیریت استقرار و تنظیمات Kubernetes شما با استفاده از ArgoCD بسیار مهم است. در اینجا نگاهی دقیق به محتوای آن داریم:
argocd:
argocd-application-master/masterapp.yaml:
پیکربندی اصلی برنامه ArgoCD.
برنامه های argocd:
حاوی چندین پیکربندی برنامه ArgoCD (demo-app-argoapp.yaml، demo-app2-argoapp.yaml، demo-app3-argoapp.yaml)، به دنبال الگوی “App of Apps”.
این الگو به شما امکان می دهد چندین برنامه را تحت یک برنامه ArgoCD مدیریت کنید.
اصلی:
برنامه آزمایشی، برنامه آزمایشی 2، برنامه آزمایشی 3:
هر پوشه حاوی مانیفست های Kubernetes برای استقرار و افشای برنامه های frontend مربوطه است.
deployment.yaml:
پیکربندی استقرار را برای برنامه تعریف می کند.
service-ingress.yaml:
سرویس و ورودی را برای برنامه پیکربندی می کند.
دستورات مهم ArgoCLI را اجرا کنید
با استفاده از URL SSH، مخزن Azure DevOps را به ArgoCD اضافه کنید:
argocd repo add git@ssh.dev.azure.com:v3/myteo/Cloud/demo-app-manifests \
--ssh-private-key-path ~/.ssh/id_azure \
--upsert
یک پروژه ArgoCD جدید با نام demo-app-project ایجاد کنید:
argocd proj create demo-app-project \
--dest https://kubernetes.default.svc,* \
--description "demo app project" \
--src git@ssh.dev.azure.com:v3/myteo/Cloud/demo-app-manifests \
--upsert
اکنون به سادگی اجرا می کنیم:
kubectl apply -f ./manifests/argocd/argocd-application-master/masterapp.yaml
این برنامه اصلی را در نمونه argocd مستقر می کند، که اکنون همه argoapp های ارجاع شده در ./manifests/argocd/argocd-applications را مدیریت می کند.
این طرح، الگوی «برنامه برنامهها» نامیده میشود، شبیه به مفهوم گره master-slave
برنامه اصلی اکنون استقرار هر برنامه yamls پیکربندی شده در فهرست راهنمای argocd-applications را کنترل می کند.
GitOps تغییر فلسفی
GitOps نشان دهنده یک تغییر پارادایم در مدیریت زیرساخت و برنامه است:
اصول اصلی
- پیکربندی اعلامی: همه چیز به صورت کد تعریف شده است
- کنترل نسخه: گیت تنها منبع حقیقت می شود
- همگام سازی خودکار: آشتی مستمر حالات مطلوب و بالفعل
- زیرساخت تغییرناپذیر: محیط های قابل پیش بینی و تکرارپذیر
مزایای این رویکرد
برای تیم های زیرساخت
- کاهش مداخله دستی
- سازگاری بهبود یافته
- افزایش امنیت از طریق تغییرات کنترل شده
- بازیابی سریعتر از شکست
برای تیم های توسعه
- مدل استقرار سلف سرویس
- افزایش دید
- همکاری ساده شده
- زمان ورود سریعتر به بازار
برای سازمان ها
- پیچیدگی عملیاتی کمتر
- کاهش خطای انسانی
- انطباق و ممیزی بهتر
- مدیریت زیرساخت مقیاس پذیر
استراتژی پیاده سازی عملی
-
زیرساخت را با Terraform تعریف کنید
- تنظیمات خوشه Kubernetes را ایجاد کنید
- گروه های شبکه و امنیت را راه اندازی کنید
- استخرهای گره و تنظیمات خوشه را پیکربندی کنید
-
ArgoCD را روی Kubernetes نصب کنید
- ArgoCD را با استفاده از Terraform یا kubectl اجرا کنید
- اتصالات مخزن را پیکربندی کنید
- تنظیمات استقرار برنامه را تنظیم کنید
-
GitOps Workflow را پیاده سازی کنید
- تمام تنظیمات را در مخازن Git ذخیره کنید
- از درخواست های کششی برای مدیریت تغییر استفاده کنید
- از ArgoCD برای استقرار مداوم استفاده کنید
نتیجه گیری
هم افزایی اصول Terraform، Kubernetes، ArgoCD و GitOps یک رویکرد قوی و مقیاسپذیر برای مدیریت زیرساختها و برنامههای کاربردی مدرن ارائه میدهد. با پذیرش این فناوری ها، سازمان ها می توانند به سطوح بی سابقه ای از کارایی، قابلیت اطمینان و چابکی دست یابند.
ابزارها و منابع توصیه شده
- Terraform
- کوبرنتیس
- ArgoCD
- هلم
- GitHub/GitLab/Azure DevOps
- پرومتئوس
- گرافانا