Cài đặt kubernetes bằng terraform với 1 câu lệnh
Lời đầu tiên xin chúc tất cả bạn đọc và gia đình năm mới mạnh khỏe, an khang thịnh vượng 🤩
Chúc các bạn đạt được nhiều mục tiêu đề ra và dành được nhiều thành công trong năm mới 2024 này.
Giới thiệu
Cũng khá lâu rồi mình mới viết bài trở lại. Và bài viết này sẽ là một món quà nhỏ nhỏ cho các bạn đọc quan tâm tới chủ đề Kubernetes mà mình thường chia sẻ.
Hôm nay mình sẽ giới thiệu với các bạn cách mà mình dùng để dựng một cụm Kubernetes trên máy chủ Cloud (EC2 của AWS) chỉ trong một nốt nhạc với terraform và argocd . Cụm Kubernetes này sẽ được cài đặt sẵn một số công cụ hữu ích, ví dụ như:
- Cấu hình auto-complete và alias khi sử dụng
kubectl
trênmaster-node
để các bạn có thể thao tác với kubectl thuận tiện hơn nhiều - Cài đặt một số thành phần cơ bản cần có trên k8s như:
- Argocd: Công cụ quản lý triển khai trong luồng gitops. Nó sẽ giúp bạn tự động hóa được việc cài đặt các ứng dụng khác
- Ingress-Controller: để expose ứng dụng ra ngoài theo domain
- Storage-class: Sử dụng EBS Volume của AWS phục vụ các bài học cần tạo Persistence Volume
- Metric-server: Để theo dõi thông tin performance của hệ thống
- Cert-Manager: Để quản lý certificate cho ứng dụng trên k8s
- Kubernetes-dashboard: Công cụ nhỏ gọn và trực quan để quản lý các resource trên k8s
- Một số công cụ phổ biến khác mình sẽ update dần:
- Monitoring với Prometheus, Grafana và Alert Manager. Có thể mở rộng với Thanos để lưu trữ metric longterm hơn
- Logging với PLG: Promtail - Loki - Grafana
- Logging với ELK: ElasticSearch - Logstash - Kibana
- Istio
- ...
Vì cách dựng lab khá đơn giản chỉ với cài câu lệnh nên mình tập trung giải thích về mô hình, nguyên lý hoạt động và phần quản lý chi phí khi sử dụng dịch vụ của Cloud vì nhiều bạn sẽ concern vấn này hơn.
Cụm kubernetes này có những gì
- Bạn sẽ có một cụm single-master kubernetes trong đó có 1 master-node và N worker-node (tùy bạn cấu hình số lượng worker-node)
- Ingress Controller được cài đặt tự động trên k8s và expose ra dưới dạng nodeport
- Cài và cấu hình tự động haproxy trên chính master-node để cho phép kết nối tới ứng dụng thông qua domain (sử dụng với ingress). Haproxy cấu hình sẵn với SSL cho domain
*.viettq.com
. - Ngay sau khi dựng lab (khoảng vài phút) bạn có thể truy cập tới argocd bằng domain
argocd.viettq.com
và tới kubernetes-dashboard bằng domaindashboard.viettq.com
(với điều kiện các bạn khai host trên máy cá nhân trỏ các domain kia về public IP củamaster-node
của các bạn) - Trên master-node đã cấu hình sẵn auto-complete cho kubectl và setup sẵn một số lệnh rút gọn cho kubectl
- Trên master-node cài đặt và cấu hình sẵn 2 công cụ là
kubectx
vàkubens
giúp bạn dễ dàng làm việc với multi-cluster hoặc với các namespace khác nhau
Note:
Để login vào argocd thì các bạn sử dụng user là admin
và password lấy từ lệnh sau chạy trên master-node
:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d;echo
Để lấy token login vào kubernetes-dashboard
các bạn thực hiện lệnh sau:
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d;echo
Môi trường cài đặt
Đầu tiên là môi trường cài đặt lab thì mình sử dụng hạ tầng của AWS. Chắc sẽ có nhiều bạn hỏi tại sao lại là AWS mà ko phải Cloud Provider khác hay không phải là hướng dẫn trên onprem thì có một số lý do chính như sau:
- Mình quen làm việc với AWS hơn và quan trọng nhất là kiếm dc nhiều Voucher để dùng ko mất tiền
- Sử dụng dịch vụ Cloud sẽ giúp nhiều bạn có thể tiếp cận được hơn so với hướng dẫn tự dựng lab trên PC vì không phải bạn nào cũng có máy tính cấu hình đủ tốt để dựng lab hoàn chỉnh. Trong khi đăng ký tài khoản Cloud bjo khá đơn giản và có các cộng đồng hỗ trợ rất mạnh.
- Môi trường trên Cloud sẽ dễ đồng nhất, từ phiên bản hệ điều hành, cấu hình máy chủ, cấu hình bảo mật.. nên có issue thì mình có thể dễ dàng hỗ trợ các bạn hơn với các bạn tự cài trên onprem với cấu hình mỗi người một khác.
- Tính di động rất cao: Khi dựng lab trên Cloud các bạn có thể truy cập vào lab bất cứ lúc nào, bất cứ đâu miễn là có kết nối internet.
- Chi phí Cloud KHÔNG QUÁ ĐẮT. Ngoài ra AWS thường có các event mà các bạn có thể tham gia và kiếm được các Voucher $25 hay thậm chí $100 thì coi như thoải mái để dựng lab rồi.
- Tại sao dùng AWS rồi mà ko dùng luôn EKS: Đơn giản vì mục tiêu là dựng lab để học tập về Kubernetes thì chúng ta cần một hệ thống self-host chứ ko cần dùng managed-service vì khi đó đâu có mấy việc cho chúng ta làm nữa
Mô hình hệ thống
Mình sử dụng các máy chủ EC2 để cài đặt kubernetes sử dụng kubeadm. Các máy chủ EC2 sẽ được đặt trong một public-subnet trong VPC mặc định của region.
Lưu ý rằng, trong mỗi regions đều đã có sẵn VPC mặc định với các public subnet và Internet Gateway gắn với VPC đó. Nghĩa là về cơ bản bạn có thể provision được ngay một máy chủ EC2 trong một public subnet thì máy chủ đó sẽ có kết nối Internet để cài đặt các gói phần mềm. Trong trường hợp bạn có thể thực hành gì đó mà xóa mất default VPC thì việc tạo lại cũng vô cùng đơn giản mà mình sẽ hướng dẫn chi tiết ở phần sau nhé!
Theo đó, các máy chủ EC2 giao tiếp với nhau qua Private IP trong VPC. Còn kết nối từ Client (máy các nhân của các bạn) tới EC2 sẽ thông qua Public IP và lưu ý rằng hiện tại AWS có tính phí cho Public IP nhé!
Ý tưởng triển khai đó là dựng một EC2 làm master-node
, cài đặt và init cluster trên master-node
đó bằng kubeadm. Như vậy ta sẽ có một cụm kubernete single-master.
Tiếp đó, ta sẽ dựng tiếp các EC2 tiếp theo làm các worker-node
và sẽ join vào cụm K8S mà ta init trên master-node
.
Chi phí cloud (AWS)
Đây là sẽ vấn đề nhiều bạn quan tâm vì nó liên quan trực tiếp tới ví tiền của bạn. Đương nhiên dùng Cloud nhiều cái lợi thì như thế thì bạn cũng phải trả một cái giá cho sự tiện lợi đó. May mắn là cái giá đó cũng khá dễ chịu (với điều kiện các bạn kiểm soát tốt tài nguyên).
Các chi phí bạn phải trả gồm:
- Chi phí của EC2: Dùng bao nhiêu trả tiền bấy nhiêu (theo cấu hình EC2, theo số giờ sử dụng). Ví dụ dựng lab với 2 máy chủ cấu hình t3.small (2CPU + 2GB RAM) và dùng khoảng 60h thì chi phí ~3$
- Chi phí Public IP gán cho EC2: Từ 2024 thì AWS có tính tiền Public IP khoảng 0.005$/h ~ 3.65$/tháng
- Chi phí sử dụng EBS Volume khi lab các bài cần tạo PersistenVolume. Giả sử bạn dùng 50GB dung lượng trong 60h thực hành thì chi phí ~ 0.5$
Các bạn có thể tham khảo cách tính phí chi tiết cho từng service của AWS ở đây: https://calculator.aws/#/
Do đó về cơ bản dùng nhiều thì trả tiền nhiều, và khi không dùng thì phải stop/destroy resource để không bị tính thêm phí.
Có 2 phương án các bạn có thể tham khảo khi dựng lab:
- PA1: Khi nào cần thực hành thì dựng lab, dùng xong thì xóa luôn => Phương án này sẽ mất công hơn chút mỗi khi dựng/xóa lab nhưng an toàn và tiết kiệm chi phí hơn.
- PA2: Dựng lab một lần, khi nào sử dụng thì bật các EC2, dùng xong thì chỉ STOP các EC2. => Phương án này giúp bạn đỡ mất công hơn và các ứng dụng cài trên K8S sẽ không phải cài lại (vì bạn chỉ stop chứ ko xóa các EC2). Tuy nhiên khi stop EC2 thì bạn sẽ vẫn bị tính phí Public IP và phí sử dụng lưu trữ trên EBS Volume.
Vẫn giả sử cấu hình và thời gian sử dụng như trên (60h/tháng) thì 2 phương án sẽ có chi phí ước tính như sau:
Hướng dẫn cài đặt
Yêu cầu
Để thực hiện cài lab thì yêu cầu đầu tiên và bắt buộc là bạn phải có tài khoản AWS. Tiếp theo là bạn phải đảm bảo trong AWS region mà bạn lựa chọn để cài lab phải đang có sẵn VPC mặc định nếu ko thì bạn sẽ phải thực hiện tạo lại VPC mặc định trước khi dựng lab kubernetes.
Tổng quan các bước thực hiện
Các bước cần thực hiện gồm:
- Bước 1: Tạo
aws access-key
để kết nối tới tài khoản aws của bạn từ máy cá nhân (thông qua aws-cli) - Bước 2: Tạo
aws key-pair
dùng để SSH vào các máy chủ EC2 - Bước 3: Cài đặt
terraform
vàaws-cli
trên máy cá nhân của bạn và cấu hình aws-cli theoaws access-key
tạo bên trên - Bước 4: Clone repo chứa code terraform về máy và điều chỉnh cấu hình theo nhu cầu của bạn
- Bước 5: Chạy terraform để tạo hạ tầng trên AWS và chạy các script cài đặt cluster tự động
- Bước 6: Enjoy thành quả
Trong số các bước trên chỉ cần thực hiện một lần duy nhất, trừ bước 5 thì mỗi lần muốn dựng cluster bạn sẽ chạy lại bước đó bằng 1 lệnh duy nhất để dựng lab. Khi muốn xóa resource cũng chạy 1 lệnh duy nhất.
Do đó việc dựng lab kubernetes có thể gói gọn trong 1 câu lệnh!
Hướng dẫn chi tiết
Trước tiên các bạn cần lựa chọn aws region, vì hầu hết các service sử dụng trong lab này sẽ thuộc region chứ ko phải global. Giả sử mình chọn region Singparore (ap-south-east1).
Setup trên AWS
Tạo AWS access-key
Khi đăng nhập vào web-console của AWS thì ấn vào tên account của bạn ở góc trên bên phải -> Security credentials
Phía bên dưới sẽ có mục Access keys. Các bạn ấn vào Create access key để tạo một access-key mới, kết quả sẽ down về một file .csv chứa access-key-id
và secret-key
. Nó sẽ được sử dụng ở bước sau.
Tạo VPC mặc định
Khi đăng nhập vào web-console của AWS thì các bạn tìm dịch vụ VPC
Chọn vào Your VPCs và các bạn sẽ thấy có một VPC mặc định (cột Default VPC có giá trị Yes) sử dụng CIDR là 172.31.0.0/16
.
Trường hợp chưa có default VPC thì các bạn tạo mới bằng cách chọn Actions -> Create default VPC -> Create default VPC là bạn sẽ tạo được một VPC mặc định có sẵn các public subnet ở các AZ và gắn với một Internet Gateway:
Tạo key pair
Tại giao diện web-console của AWS thì các bạn tìm dịch vụ EC2 vào tìm key-pair ở menu bên trái để tạo mới key-pair:
Chọn vào Create key pair: Điền tên key pair
, chọn type là RSA và format là .pem.
Kết quả bạn sẽ down load một file .pem
về máy cá nhân, nó sẽ là private-key để sau này dùng để SSH vào các máy ảo EC2.
Cài đặt trên máy cá nhân
Cài đặt terraform và aws-cli:
Các bạn cài theo link của trang chủ của hashicorp và lựa chọn theo OS mà bạn đang sử dụng
Tương tự, cài đặt AWS cli theo link của trang chủ và lựa chọn theo OS của bạn.
Kiểm tra phiên bản của terraform và aws-cli để xác nhận kết quả cài đặt thành công:
$ terraform.exe -v
Terraform v1.7.3
on windows_386
$ aws --version
aws-cli/2.15.19 Python/3.11.6 Windows/10 exe/AMD64 prompt/off
Cấu hình aws-cli
Bước này để cấu hình cho aws-cli có thể kết nối tới account aws của bạn. Chạy lệnh aws configure
và điền thông tin access-key và secret-key đã tạo ở bước trên, sau đó chọn đúng region mà bạn muốn thực hiện cài lab. Ở đây mình sử dụng region ap-southeast-1
:
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-southeast-1
Default output format [None]: json
Tải repo terraform để dựng lab
Các bạn clone repo này về máy:
git clone https://github.com/rockman88v/kubernetes-terraform.git
Cấu hình thông số cluster mà bạn muốn tạo bằng cách sửa nội dung file kubernetes/terraform.tfvars
:
cluster_prefix = "viettq"
keypair_name = "viettq-key"
master_instance_type = "t3.small"
worker_instance_type = "t3.small"
master_instance_name = "master"
worker_instance_name = "worker"
region = "ap-southeast-1"
number_of_workers = "2"
included_components = ["haproxy", "argocd", "ingress-controller", "ebs-storageclass", "platform-app"]
# haproxy : Install haproxy on master node and setup rule to kubernete ingress backend
# argocd : Install argocd on installed kubernetes cluster using helm-chart
# ingress-controller: Install ingress-controller on installed kubernetes cluster using helm-chart
# ebs-storageclass : Install storageclass using ebs volume on installed kubernetes cluster
# platform-app : Install platform app by create argocd app and sync to kubernetes cluster.
Trong đó:
- cluster_prefix => Dùng làm prefix cho các resource tạo trên AWS cho cluster này, tránh conflict khi tạo nhiều cụm cluster
- keypair_name => Tên key pair sử dụng cho các EC2
- master_instance_type => Chọn instance type cho master node. Với mục đích học tập và làm lab thì dùng t3.small (2CPU + 2GB RAM) là đủ
- worker_instance_type => Chọn instance type cho worker node. Bạn cần chạy càng nhiều workload thì có thể tăng cấu hình của worker node lên
- master_instance_name => Set tên cho các ec2 master trên web console
- worker_instance_name => Set tên cho các ec2 worker trên web console
- region => Lựa chọn aws region để cài lab
- number_of_workers => Lựa chọn số lượng worker node muốn tạo cho cluster này. Các worker có cùng cấu hình được set ở tham số
worker_instance_type
bên trên - included_components => Cho phép bạn lựa chọn các thành phần sẽ được cài đặt kèm khi cài kubernetes
Cài đặt kubernetes
Sau khi đã điều chỉnh các tham số theo đúng nhu cầu, các bạn cần thực hiện khởi tạo các module của terraform bằng lệnh:
cd kubernetes-terraform/kubernetes
terraform init
Sau đó có thể kiểm tra các resource sẽ được tạo bằng lệnh:
terraform plan
Và cuối cùng là cài đặt kubernetes và các thành phần khác:
terraform apply --auto-approve
Kết quả sau bước này bạn sẽ có một cụm Kubernetes và một số thành phần khác như argocd, ingress-controller... Khi học/thực hành xong với lab các bạn có thể xóa nó đi (ĐỂ TIẾT KIỆM CHI PHÍ CLOUD) bằng cách chạy lệnh:
cd kubernetes-terraform/kubernetes
terraform destroy --auto-approve
Lúc này toàn bộ các resource sẽ bị xóa và bạn sẽ không bị tính bất cứ phí gì của Cloud cả.
Tổng kết
Bài viết khá dài nhưng tóm tắt lại các bước thực hiện thì khá đơn giản. Vì mình cũng chỉ tranh thủ mấy ngày Tết được nghỉ để dựng lab này nên có thể còn nhiều issue mình chưa test được hết các trường hợp. Vì vậy cũng mong nhận được sự thông cảm và góp ý của mọi người để công cụ hoàn thiện hơn nữa.
Cảm ơn mọi người đã dành thời gian đọc tới đây. Nếu thấy bài viết hữu ích thì cho mình xin 1 upvote cho bài viết để tiếp tục ra nhiều nội dung mới nhé!
All rights reserved