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ộ:
- Argo CD: http://localhost:16080
- Prometheus: http://localhost:19090
- Alertmanager: http://localhost:19093
- Grafana: http://localhost:13080
- Jaeger: http://localhost:15090
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.