برنامه نویسی

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

فهرست مطالب

  • مروری بر فناوری‌های بومی ابری
  • Terraform، Kubernetes، ArgoCD یکپارچه سازی
  • مشکلات مدیریت دستی
  • پیچیدگی های استقرار
  • زیرساخت به عنوان کد
  • اصول GitOps
  • پیکربندی خوشه
  • راه اندازی شبکه
  • مدیریت منابع
  • راه اندازی اولیه
  • پیکربندی RBAC
  • مراحل ورود

ساختارهای مخزن

  • مخزن برنامه
  • مخزن GitOps
  • مدیریت مانیفست

استراتژی های پیاده سازی

  • پیکربندی مخزن
  • دستورات ArgoCD CLI
  • الگوی “برنامه برنامه ها”.

مفاهیم اصلی

  • پیکربندی اعلامی
  • کنترل نسخه
  • همگام سازی خودکار

مزایای سازمانی

  • مزایای تیم زیرساخت
  • بهبودهای تیم توسعه
  • بهره وری عملیاتی
  • تعریف زیرساخت
  • استقرار ArgoCD
  • گردش کار یکپارچه سازی مداوم
  • هم افزایی فناوری
  • مقیاس پذیری و چابکی
  • ابزارهای زیرساخت
  • راه حل های نظارتی
  • پلتفرم های کنترل نسخه

مقدمه

در چشم‌انداز سریع در حال تحول فناوری‌های بومی ابری، سازمان‌ها به‌طور مداوم به دنبال استراتژی‌هایی برای ساده‌سازی زیرساخت‌ها، افزایش قابلیت اطمینان استقرار و بهبود همکاری تیمی هستند.

ترکیبی از اصول Terraform، Kubernetes، ArgoCD و GitOps راه حلی قدرتمند برای این چالش ها ارائه می دهد.

چالش زیرساخت های سنتی

به طور سنتی، مدیریت زیرساخت و استقرار برنامه ها فرآیندهای دستی و مستعد خطا بودند:

  • محیط های ناسازگار
  • رانش پیکربندی
  • دید محدود به تغییرات
  • رویه های پیچیده بازگشت
  • استقرار آهسته و پرخطر

استقرار Infra سنتی برای K8s


زیرساخت رویکرد مدرن را به عنوان کد و GitOps وارد کنید

روش های استقرار ArgoCD

تدارک زیرساخت 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!

صفحه ورود به سیستم ArgoCD

نکات مهم

  • هشدار امنیتی: نقش مدیریت پیش فرض دسترسی کامل خوشه ای را فراهم می کند
  • به طور منظم اعتبارنامه ها را بچرخانید
  • از رمزهای عبور قوی و منحصر به فرد استفاده کنید

گردش کار 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 قرار داد.

اسکرین شات Azure DevOps


مخزن 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 را کنترل می کند.

داشبورد ArgoCD نمای کلی را نشان می دهد


GitOps تغییر فلسفی

GitOps نشان دهنده یک تغییر پارادایم در مدیریت زیرساخت و برنامه است:

اصول اصلی

  1. پیکربندی اعلامی: همه چیز به صورت کد تعریف شده است
  2. کنترل نسخه: گیت تنها منبع حقیقت می شود
  3. همگام سازی خودکار: آشتی مستمر حالات مطلوب و بالفعل
  4. زیرساخت تغییرناپذیر: محیط های قابل پیش بینی و تکرارپذیر

مزایای این رویکرد

برای تیم های زیرساخت

  • کاهش مداخله دستی
  • سازگاری بهبود یافته
  • افزایش امنیت از طریق تغییرات کنترل شده
  • بازیابی سریعتر از شکست

برای تیم های توسعه

  • مدل استقرار سلف سرویس
  • افزایش دید
  • همکاری ساده شده
  • زمان ورود سریعتر به بازار

برای سازمان ها

  • پیچیدگی عملیاتی کمتر
  • کاهش خطای انسانی
  • انطباق و ممیزی بهتر
  • مدیریت زیرساخت مقیاس پذیر

استراتژی پیاده سازی عملی

  1. زیرساخت را با Terraform تعریف کنید

    • تنظیمات خوشه Kubernetes را ایجاد کنید
    • گروه های شبکه و امنیت را راه اندازی کنید
    • استخرهای گره و تنظیمات خوشه را پیکربندی کنید
  2. ArgoCD را روی Kubernetes نصب کنید

    • ArgoCD را با استفاده از Terraform یا kubectl اجرا کنید
    • اتصالات مخزن را پیکربندی کنید
    • تنظیمات استقرار برنامه را تنظیم کنید
  3. GitOps Workflow را پیاده سازی کنید

    • تمام تنظیمات را در مخازن Git ذخیره کنید
    • از درخواست های کششی برای مدیریت تغییر استفاده کنید
    • از ArgoCD برای استقرار مداوم استفاده کنید

نتیجه گیری

هم افزایی اصول Terraform، Kubernetes، ArgoCD و GitOps یک رویکرد قوی و مقیاس‌پذیر برای مدیریت زیرساخت‌ها و برنامه‌های کاربردی مدرن ارائه می‌دهد. با پذیرش این فناوری ها، سازمان ها می توانند به سطوح بی سابقه ای از کارایی، قابلیت اطمینان و چابکی دست یابند.

ابزارها و منابع توصیه شده

  • Terraform
  • کوبرنتیس
  • ArgoCD
  • هلم
  • GitHub/GitLab/Azure DevOps
  • پرومتئوس
  • گرافانا

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا