خوشه محلی 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
- Kftray را باز کرده و روی نماد سینی کلیک کنید تا پنجره اصلی باز شود.
- روی نماد منو در گوشه سمت چپ پایین کلیک کنید.
- “واردات خودکار” را انتخاب کنید.
- روی “تنظیم kubeconfig” کلیک کنید و فایل kubeconfig ایجاد شده توسط Terraform را انتخاب کنید (معمولا
~/.kube/kind-config-kftray-cluster
). - زمینه را انتخاب کنید
kftray-cluster
از منوی کشویی - برای بارگیری تنظیمات پورت فوروارد روی “وارد کردن” کلیک کنید.
پس از وارد کردن، میتوانید با جابهجایی سوئیچ کنار هر سرویس یا با کلیک کردن روی «شروع همه»، انتقال پورت را شروع کنید.
استفاده از Kftui (رابط ترمینال)
- را تنظیم کنید
KUBECONFIG
متغیر محیطی:
export KUBECONFIG="~/.kube/kind-config-kftray-cluster"
- Kftui را شروع کنید:
kftui
- را فشار دهید
Tab
برای دسترسی به منوی بالا و انتخاب «وارد کردن خودکار» - را فشار دهید
Ctrl+A
برای انتخاب تمام تنظیمات - را فشار دهید
F
برای شروع تمام پورت فوروارد.
دسترسی به خدمات خود به صورت محلی
با راه اندازی پورت فورواردینگ، می توانید به خدمات خود در دستگاه محلی خود دسترسی داشته باشید:
تنظیمات سفارشی 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 در تماس باشید.