برنامه نویسی

خوشه محلی Kubernetes – ترافیک خارجی بدون ورود با استفاده از Kftray

سلام. در این پست، من به شما نشان خواهم داد که چگونه یک خوشه محلی Kubernetes را با استفاده از Kind، Terraform و Kftray راه اندازی کنید. ما همه سرویس‌ها را در داخل خوشه نگه می‌داریم، بدون نیاز به کنترل‌کننده‌های ورودی یا افشای سرویس‌هایی مانند NodePort یا LoadBalancer. من همچنین شما را از طریق کد Terraform استفاده شده در این تنظیمات راهنمایی خواهم کرد.

کد Terraform استفاده شده در این پست وبلاگ: https://github.com/hcavarsan/kftray-k8s-tf-example

چرا خدمات را در داخل خوشه نگه دارید؟

ارائه خدمات به صورت خارجی می تواند پیچیدگی و خطرات امنیتی بالقوه را اضافه کند. برای توسعه محلی یا محیط های امن، اغلب بهتر است همه چیز را داخلی نگه دارید. با استفاده از kubectl port-forward و با خودکارسازی آن با Kftray، می‌توانیم به سرویس‌هایی که در داخل خوشه اجرا می‌شوند دسترسی داشته باشیم، بدون اینکه آنها را در معرض دنیای خارج قرار دهیم.

ابزارهایی که نیاز دارید

قبل از شروع، مطمئن شوید که موارد زیر را نصب کرده اید:

شبیه سازی مخزن

ابتدا مخزن حاوی کد Terraform را کلون کنید:

git clone https://github.com/hcavarsan/kftray-k8s-tf-example
cd kftray-k8s-tf-example/terraform
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آشنایی با کد Terraform

کد Terraform در این مخزن موارد زیر را خودکار می کند:

  • یک خوشه Kind Kubernetes ایجاد می کند.
  • نمودارهای Helm را برای Argo CD، Prometheus، Alertmanager، Grafana و Jaeger به کار می برد.
  • حاشیه نویسی های سرویس را برای Kftray تنظیم می کند تا تنظیمات پورت فوروارد را به صورت خودکار وارد کند.

ساختار پروژه

در اینجا نحوه سازماندهی پروژه آمده است:

kftray-k8s-tf-example
├── terraform
│   ├── helm.tf
│   ├── outputs.tf
│   ├── locals.tf
│   ├── providers.tf
│   ├── variables.tf
│   ├── templates
│   │   ├── argocd-values.yaml.tpl
│   │   ├── grafana-values.yaml.tpl
│   │   ├── jaeger-values.yaml.tpl
│   │   └── prometheus-values.yaml.tpl
│   └── kind.tf
├── Makefile
├── docs
│   ├── kftray.gif
│   └── kftui.gif
└── README.md
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

providers.tf

این فایل ارائه دهندگان Terraform را که ما استفاده خواهیم کرد را مشخص می کند:

terraform {
  required_version = ">= 1.0.0"

  required_providers {
    kind = {
      source  = "tehcyx/kind"
      version = "0.4.0"
    }
    helm = {
      source  = "hashicorp/helm"
      version = ">= 2.0.0"
    }
    kubernetes = {
      source  = "hashicorp/kubernetes"
      version = ">= 2.0.0"
    }
    template = {
      source  = "hashicorp/template"
      version = ">= 2.0.0"
    }
  }
}

provider "kind" {
}

provider "kubernetes" {
  config_path = kind_cluster.default.kubeconfig_path
}

provider "helm" {
  kubernetes {
    config_path = kind_cluster.default.kubeconfig_path
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • مهربان: خوشه های Kind را مدیریت می کند.
  • کوبرنتس: با خوشه Kubernetes تعامل دارد.
  • سکان: نمودارهای Helm را مستقر می کند.
  • قالب: فایل های قالب را پردازش می کند.

متغیرها.tf

متغیرهای مورد استفاده در پیکربندی Terraform را تعریف می کند:

variable "cluster_name" {
  description = "Name of the Kind cluster"
  type        = string
  default     = "kftray-cluster"
}

variable "kubernetes_version" {
  description = "Version of the Kind node image"
  type        = string
  default     = "v1.30.4"
}

variable "kubeconfig_dir" {
  description = "Directory to store the kubeconfig file"
  type        = string
  default     = "~/.kube"
}

# Chart versions
variable "argocd_chart_version" {
  description = "Version of the Argo CD Helm chart"
  type        = string
  default     = "5.19.12"
}

variable "prometheus_chart_version" {
  description = "The version of the Prometheus chart to deploy."
  type        = string
  default     = "25.27.0"
}

variable "grafana_chart_version" {
  description = "The version of the Grafana chart to deploy."
  type        = string
  default     = "8.5.0"
}

variable "jaeger_chart_version" {
  description = "The version of the Jaeger chart to deploy."
  type        = string
  default     = "3.3.1"
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

kind.tf

خوشه Kind را ایجاد می کند:

resource "kind_cluster" "default" {
  name            = var.cluster_name
  node_image      = "kindest/node:${var.kubernetes_version}"
  kubeconfig_path = pathexpand("${var.kubeconfig_dir}/kind-config-${var.cluster_name}")
  wait_for_ready  = true

  kind_config {
    kind        = "Cluster"
    api_version = "kind.x-k8s.io/v1alpha4"

    node {
      role = "control-plane"

      extra_port_mappings {
        container_port = 80
        host_port      = 80
        protocol       = "TCP"
      }
    }

    node {
      role = "worker"
    }
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • نام: نام خوشه.
  • node_image: نسخه Kubernetes.
  • kubeconfig_path: محل ذخیره فایل kubeconfig.
  • منتظر_برای_آماده: صبر کنید تا خوشه آماده شود.
  • kind_config: پیکربندی نوع سفارشی.

locals.tf

متغیرهای محلی و تنظیمات سرویس را تعریف می کند:

locals {
  services = {
    argocd = {
      namespace  = "argocd"
      repository = "https://argoproj.github.io/argo-helm"
      chart      = "argo-cd"
      version    = var.argocd_chart_version
      kftray = {
        server = {
          alias       = "argocd"
          local_port  = "16080"
          target_port = "http"
        }
      }
    }
    # ... other services ...
  }

  services_values = {
    for service_name, service in local.services :
    service_name => templatefile("${path.module}/templates/${service_name}-values.yaml.tpl", {
      kftray = service.kftray
    })
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • خدمات: نقشه ای از خدمات برای استقرار.
  • كفتراي: تنظیمات پورت فوروارد برای Kftray.
  • خدمات_ارزش ها: الگوهای مقادیر Helm را برای هر سرویس پردازش می کند.

helm.tf

خدمات را با استفاده از Helm مستقر می کند:

resource "helm_release" "services" {
  depends_on = [kind_cluster.default]
  for_each         = local.services
  name             = each.key
  namespace        = each.value.namespace
  create_namespace = true
  repository       = each.value.repository
  chart            = each.value.chart
  version          = each.value.version

  values = [
    local.services_values[each.key]
  ]
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • برای_هر کدام: روی هر سرویس تکرار می شود.
  • نام: نام انتشار.
  • فضای نام: فضای نام Kubernetes.
  • مخزن: مخزن نمودار هلم.
  • نمودار: نام نمودار هلم.
  • نسخه: نسخه نمودار.
  • ارزش ها: مقادیر سفارشی برای نمودار Helm.

قالب ها/

حاوی الگوهای مقادیر Helm برای هر سرویس (به عنوان مثال، argocd-values.yaml.tpl). این قالب ها حاشیه نویسی Kftray را به تعاریف سرویس تزریق می کنند.

خروجی ها.tf

خروجی ها را برای اجرای Terraform تعریف می کند:

output "endpoint" {
  description = "API endpoint for the Kind cluster."
  value       = kind_cluster.default.endpoint
}

output "kubeconfig" {
  description = "Kubeconfig file for the Kind cluster."
  value       = kind_cluster.default.kubeconfig
  sensitive   = true
}

output "credentials" {
  description = "Credentials for authenticating with the Kind cluster."
  value = {
    client_certificate     = kind_cluster.default.client_certificate
    client_key             = kind_cluster.default.client_key
    cluster_ca_certificate = kind_cluster.default.cluster_ca_certificate
  }
  sensitive = true
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اعمال پیکربندی Terraform

برای اعمال پیکربندی Terraform و راه اندازی کلاستر، اجرا کنید:

make apply
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این خواهد شد:

  • Terraform را راه اندازی کنید.
  • خوشه Kind را ایجاد کنید.
  • نمودارهای Helm را مستقر کنید.
  • حاشیه نویسی سرویس را تنظیم کنید.

نصب کفترای

به صفحه Kftray GitHub بروید و دستورالعمل های نصب سیستم عامل خود را دنبال کنید.

وارد کردن تنظیمات Port-Forward به Kftray

با استفاده از Kftray GUI

  1. Kftray را باز کرده و روی نماد سینی کلیک کنید تا پنجره اصلی باز شود.
  2. روی نماد منو در گوشه سمت چپ پایین کلیک کنید.
  3. “واردات خودکار” را انتخاب کنید.
  4. روی “تنظیم kubeconfig” کلیک کنید و فایل kubeconfig ایجاد شده توسط Terraform را انتخاب کنید (معمولا ~/.kube/kind-config-kftray-cluster).
  5. زمینه را انتخاب کنید kftray-cluster از منوی کشویی
  6. برای بارگیری تنظیمات پورت فوروارد روی “وارد کردن” کلیک کنید.

بنر کفتری

پس از وارد کردن، می‌توانید با جابه‌جایی سوئیچ کنار هر سرویس یا با کلیک کردن روی «شروع همه»، انتقال پورت را شروع کنید.

استفاده از Kftui (رابط ترمینال)

  1. را تنظیم کنید KUBECONFIG متغیر محیطی:
   export KUBECONFIG="~/.kube/kind-config-kftray-cluster"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. Kftui را شروع کنید:
   kftui
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. را فشار دهید Tab برای دسترسی به منوی بالا و انتخاب «وارد کردن خودکار»
  2. را فشار دهید Ctrl+A برای انتخاب تمام تنظیمات
  3. را فشار دهید F برای شروع تمام پورت فوروارد.

kftui

دسترسی به خدمات خود به صورت محلی

با راه اندازی پورت فورواردینگ، می توانید به خدمات خود در دستگاه محلی خود دسترسی داشته باشید:

تنظیمات سفارشی Kftray

تنظیم تنظیمات حمل و نقل پورت Kftray

برای سفارشی کردن نحوه ارسال پورت های Kftray، آن را ویرایش کنید locals.tf فایل:

locals {
  services = {
    argocd = {
      kftray = {
        server = {
          alias       = "argocd"
          local_port  = "16080"
          target_port = "http"
        }
      }
    }
    # Other services...
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • نام مستعار: نام نمایش داده شده در کفتری.
  • local_port: پورت دستگاه شما برای دسترسی به سرویس.
  • target_port: پورت یا نام پورت سرویس در داخل خوشه.

تمیز کردن

اگر می خواهید خوشه را از بین ببرید و همه منابع را حذف کنید، اجرا کنید:

make destroy
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کار باعث از بین رفتن خوشه و حذف تمام منابع ایجاد شده توسط Terraform می شود.

نتیجه گیری

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

به راحتی می توانید کد Terraform را مطابق با نیازهای خود کاوش و تغییر دهید. اگر سوالی دارید یا نیاز به کمک دارید، در تماس باشید.

با تشکر برای خواندن. می‌توانید کارهای بیشتری از من پیدا کنید یا در GitHub در تماس باشید.

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

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

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

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