+1

Local Kubernetes Cluster - Hướng dẫn chi tiết về việc sử dụng KFTray để tiếp cận dịch vụ

Bài viết này sẽ hướng dẫn bạn cách thiết lập một cụm Kubernetes nội bộ (local Kubernetes cluster) bằng cách sử dụng Kind, Terraform và Kftray. Chúng ta sẽ giữ tất cả các dịch vụ bên trong cụm, tránh việc sử dụng ingress controller hoặc expose service như NodePort hay LoadBalancer.

Tại sao nên giữ các dịch vụ bên trong cụm?

Việc expose service ra bên ngoài có thể làm tăng độ phức tạp và các rủi ro bảo mật tiềm ẩn. Đối với phát triển cục bộ hoặc môi trường bảo mật, việc giữ mọi thứ bên trong thường tốt hơn. Bằng cách sử dụng kubectl port-forward và tự động hóa nó bằng Kftray, chúng ta có thể truy cập các dịch vụ chạy bên trong cụm mà không cần expose chúng ra thế giới bên ngoài.

Chuẩn bị công cụ

Trước khi bắt đầu, hãy đảm bảo rằng bạn đã cài đặt những công cụ sau:

  • Docker
  • Terraform (v1.9.5)
  • Kftray (bạn có thể chọn giữa phiên bản GUI hoặc TUI)

Sao chép kho lưu trữ

Đầu tiên, hãy sao chép kho lưu trữ chứa mã Terraform:

git clone https://github.com/hcavarsan/kftray-k8s-tf-example
cd kftray-k8s-tf-example/terraform

Hiểu về mã Terraform

Mã Terraform trong kho lưu trữ này tự động hóa các tác vụ sau:

  • Tạo một cụm Kubernetes Kind.
  • Triển khai Helm chart cho Argo CD, Prometheus, Alertmanager, Grafana và Jaeger.
  • Thiết lập chú thích (annotation) dịch vụ cho Kftray để tự động import cấu hình port-forward.

Cấu trúc dự án

Dưới đây là cách tổ chức dự án:

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 Tệp này chỉ định các nhà cung cấp Terraform mà chúng ta sẽ sử dụng:

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
  }
}

Trong đó:

  • kind: Quản lý các cụm Kind.
  • kubernetes: Tương tác với cụm Kubernetes.
  • helm: Triển khai Helm chart.
  • template: Xử lý các tệp template.

variables.tf Xác định các biến được sử dụng trong cấu hình 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 Tạo cụm 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"
    }
  }
}

Trong đó:

  • name: Tên cụm.
  • node_image: Phiên bản Kubernetes.
  • kubeconfig_path: Nơi lưu trữ tệp kubeconfig.
  • wait_for_ready: Đợi cho đến khi cụm sẵn sàng.
  • kind_config: Cấu hình Kind tùy chỉnh.

locals.tf Xác định các biến cục bộ và cấu hình dịch vụ:

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
    })
  }
}

Trong đó:

  • services: Một map các dịch vụ để triển khai.
  • kftray: Cấu hình port-forward cho Kftray.
  • services_values: Xử lý các template giá trị Helm cho mỗi dịch vụ.

helm.tf Triển khai các dịch vụ bằng cách sử dụng 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]
  ]
}

Trong đó:

  • for_each: Lặp lại trên mỗi dịch vụ.
  • name: Tên bản phát hành.
  • namespace: Namespace Kubernetes.
  • repository: Kho lưu trữ Helm chart.
  • chart: Tên Helm chart.
  • version: Phiên bản chart.
  • values: Các giá trị tùy chỉnh cho Helm chart.

templates/ Chứa các template giá trị Helm cho mỗi dịch vụ (ví dụ: argocd-values.yaml.tpl). Các template này đưa các chú thích Kftray vào định nghĩa dịch vụ.

outputs.tf Xác định đầu ra cho lần chạy 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
}

Áp dụng cấu hình Terraform

Để áp dụng cấu hình Terraform và thiết lập cụm, hãy chạy:

make apply

Điều này sẽ:

  • Khởi tạo Terraform.
  • Tạo cụm Kind.
  • Triển khai các Helm chart.
  • Thiết lập các chú thích dịch vụ.

Cài đặt Kftray

Truy cập trang GitHub của Kftray trong đường link này: https://github.com/hcavarsan/kftray và làm theo hướng dẫn cài đặt cho hệ điều hành của bạn.

Nhập cấu hình Port-Forward vào Kftray

1. Sử dụng Kftray GUI

  • Mở Kftray và nhấp vào biểu tượng khay để mở cửa sổ chính.
  • Nhấp vào biểu tượng menu ở góc dưới bên trái.
  • Chọn "Auto Import".
  • Nhấp vào "Set kubeconfig" và chọn tệp kubeconfig được tạo bởi Terraform (thường là ~/.kube/kind-config-kftray-cluster).
  • Chọn context kftray-cluster từ menu dropdown.
  • Nhấp vào "Import" để tải cài đặt port-forward.

Sau khi import, bạn có thể bắt đầu port forwarding bằng cách bật công tắc bên cạnh mỗi dịch vụ hoặc bằng cách nhấp vào "Start All".

2. Sử dụng Kftui (Giao diện đầu cuối)

2.1 Đặt biến môi trường KUBECONFIG:

   export KUBECONFIG="~/.kube/kind-config-kftray-cluster"

2.2. Bắt đầu Kftui:

   kftui

2.3. Nhấn Tab để truy cập menu trên cùng và chọn "Auto Import".

2.4. Nhấn Ctrl+A để chọn tất cả cấu hình.

2.5. Nhấn F để bắt đầu tất cả port forward.

Truy cập các dịch vụ của bạn từ máy tính nội bộ

Với việc thiết lập port forwarding, bạn có thể truy cập các dịch vụ của mình trên máy tính nội bộ:

Cài đặt Kftray tùy chỉnh

1. Điều chỉnh cài đặt Port Forwarding của Kftray

Để tùy chỉnh cách Kftray chuyển tiếp cổng, hãy chỉnh sửa tệp locals.tf:

locals {
  services = {
    argocd = {
      kftray = {
        server = {
          alias       = "argocd"
          local_port  = "16080"
          target_port = "http"
        }
      }
    }
    # Other services...
  }
}

Trong đó:

  • alias: Tên được hiển thị trong Kftray.
  • local_port: Cổng trên máy của bạn để truy cập dịch vụ.
  • target_port: Cổng hoặc tên cổng của dịch vụ bên trong cụm.

2. Dọn dẹp

Nếu bạn muốn hủy cụm và xóa tất cả tài nguyên, hãy chạy:

make destroy

Điều này sẽ phá bỏ cụm và xóa tất cả các tài nguyên được tạo bởi Terraform.

Kết luận

Bằng cách giữ tất cả các dịch vụ bên trong cụm và sử dụng Kftray để chuyển tiếp cổng, chúng ta tạo ra một môi trường đơn giản và an toàn hơn. Thiết lập này hữu ích cho phát triển cục bộ và các tình huống mà bạn muốn tránh expose service ra bên ngoài.

Cảm ơn các bạn đã theo dõi.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí