Giới thiệu
Trong thế giới phát triển phần mềm hiện đại, Kubernetes đã trở thành một công cụ không thể thiếu cho việc triển khai và quản lý container. Tuy nhiên, khi quyết định giữa việc triển khai Kubernetes trên đám mây hay trên phần cứng vật lý (bare metal), nhiều nhà phát triển gặp phải những thách thức và hiểu lầm. Bài viết này sẽ đi sâu vào những điểm khác biệt giữa hai phương pháp triển khai này và cung cấp những thực tiễn tốt nhất để bạn có thể lựa chọn phương án phù hợp nhất cho dự án của mình.
Cuộc tranh luận về LoadBalancer
Mọi chuyện bắt đầu khi tôi và một người bạn, Govind, đang gỡ lỗi thiết lập Kubernetes của mình. Anh ấy đã nói một câu khiến tôi phải suy nghĩ: "LoadBalancer của tôi được cung cấp bởi Digital Ocean, không phải là dịch vụ LoadBalancer của K8s."
Tôi đã ngạc nhiên. Thực tế, cả hai chúng tôi đều đúng và đều sai. Chúng tôi đã khám phá ra rằng khái niệm "Cloud Native" có thể là một trong những trò lừa đảo lớn nhất trong ngành công nghệ.
Chứng minh của Govind
bash
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP
ingress-nginx-controller LoadBalancer 10.109.16.98 152.42.156.235
Khẳng định của tôi
"Đây là dịch vụ K8s."
Khẳng định của anh ấy
"Đây là Load Balancer của Digital Ocean."
Sự thật
Chúng tôi đang có những cuộc đối thoại khác nhau. Vấn đề của chúng tôi không chỉ đơn thuần là kỹ thuật mà còn liên quan đến cách thức mà Kubernetes tương tác với các nhà cung cấp đám mây.
Khám Phá Thực Tế
Sau một thời gian tranh luận, tôi quyết định kiểm tra bằng cách triển khai một cụm Kubernetes tương tự trên một máy chủ bare metal.
bash
# Trên Digital Ocean - Cài đặt của Govind
$ kubectl apply -f ingress-service.yaml
$ kubectl get svc
NAME TYPE EXTERNAL-IP
ingress-nginx-controller LoadBalancer 152.42.156.235 ✅
# Trên máy chủ bare metal - Sự thật gây sốc
$ kubectl apply -f ingress-service.yaml # YAML Y HỆT NHƯ NHAU
$ kubectl get svc
NAME TYPE EXTERNAL-IP
ingress-nginx-controller LoadBalancer <pending> ❌
Một giờ trôi qua, vẫn là <pending>. Điều này đã làm tôi nhận ra rằng LoadBalancer thực sự là một dịch vụ K8s, nhưng nó cũng cung cấp một Load Balancer từ Digital Ocean.
Kiến Trúc Lừa Dối: Kubernetes trên Đám Mây vs Bare Metal
Điều mà không ai nói với bạn về type: LoadBalancer trong Kubernetes là nó không tạo ra một Load Balancer. Nó chỉ yêu cầu ai đó tạo một cái cho bạn.
yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer # <- Đây chỉ là một lời cầu nguyện tới các vị thần đám mây
ports:
- port: 80
Trên AWS, YAML này gửi tín hiệu đến Cloud Controller Manager của AWS, gọi API AWS, từ đó tạo ra một Elastic Load Balancer. Ngược lại, trên bare metal, YAML này chỉ gửi tín hiệu vào khoảng không, không ai lắng nghe.
Cách Kubernetes Thực Sự Hoạt Động trên Đám Mây
Khi bạn triển khai Kubernetes trên AWS, GCP hay Azure, có một thành phần ẩn đang làm tất cả công việc nặng nhọc: Cloud Controller Manager. Nó giống như có một người chú giàu có đang âm thầm trả tiền cho mọi thứ trong khi bạn giả vờ độc lập.
Cách Kubernetes "Hoạt Động" trên Bare Metal
Trên bare metal, YAML đó trở thành một danh sách mong muốn mà không có ông già Noel:
bash
Your YAML → K8s API → ??? → Nothing happens → <pending> → Sadness
Để làm cho nó hoạt động, bạn cần cài đặt một số công cụ mở rộng cho Kubernetes:
- MetalLB: Giả vờ là một Load Balancer đám mây
- Longhorn/OpenEBS: Giả vờ là lưu trữ đám mây
- Cluster API: Giả vờ là tính toán đám mây
- Cert-Manager: Bởi vì đám mây đã cho bạn SSL miễn phí
- External-DNS: Bởi vì đám mây đã quản lý DNS
So Sánh Chi Phí Thực Tế
Kubernetes trên Đám Mây:
bash
# Thời gian triển khai: 10 phút
# Chi phí hàng tháng: $500-2000
# Tâm lý: Khỏe mạnh
# Những gì bạn thực sự đang trả tiền:
- EKS/GKE/AKS Control Plane: $75/tháng
- Load Balancers: $20 mỗi cái
- NAT Gateways: $45 mỗi cái
- Chi phí dữ liệu: $0.09/GB
- Persistent Volumes: $0.10/GB/tháng
Kubernetes trên Bare Metal:
bash
# Thời gian triển khai: 3 ngày đến 3 tuần
# Chi phí hàng tháng: $100-500 (phần cứng/colocation)
# Tâm lý: Không có tâm lý
# Những chi phí ẩn mà không ai đề cập:
- Thời gian của bạn: 40-80 giờ thiết lập
- Bảo trì liên tục: 10-20 giờ/tháng
- Cuộc gọi lúc 3 giờ sáng khi nút chết
- Nhà thầu bạn sẽ thuê: $150/giờ
- Thay thế bàn phím bạn đã đập trong cơn giận dữ
Giải Pháp Khó Khăn
Tùy chọn 1: Chấp Nhận Sự Ràng Buộc
bash
$ kubectl apply -f application.yaml
$ aws eks update-kubeconfig --name my-cluster
$ kubectl get svc # Mọi thứ đều có IP!
Chỉ cần sử dụng EKS/GKE/AKS và chấp nhận rằng bạn đang trả "thuế cho việc muốn ngủ ngon vào ban đêm". Với nhiều công ty, chi phí $500-2000/tháng còn rẻ hơn thời gian kỹ thuật bạn sẽ phải dành cho việc chiến đấu với bare metal.
Tùy chọn 2: Con Đường Chiến Binh Bare Metal
bash
$ # Cài đặt Ubuntu
$ # Cài đặt Kubernetes
$ # Cài đặt MetalLB
$ # Cấu hình IP pools
$ # Cài đặt Longhorn
$ # Gỡ lỗi mạng trong 6 giờ
$ # Đặt câu hỏi về sự lựa chọn cuộc sống
Con đường này hợp lý nếu:
- Bạn có đội ngũ ops dành riêng cho việc này
- Bạn đang ở quy mô mà chi phí đám mây vượt quá lương kỹ sư
- Bạn có yêu cầu tuân thủ cấm sử dụng đám mây
Tùy chọn 3: Giải Pháp Trung Lập Hợp Lý
Sử dụng k3s, k0s hoặc MicroK8s. Những phân phối này đi kèm với mọi thứ cần thiết:
bash
$ curl -sfL https://get.k3s.io | sh -
Khi Kubernetes trên Đám Mây Thực Sự Có Ý Nghĩa
Kubernetes trên đám mây không phải lúc nào cũng xấu. Đối với nhiều trường hợp, đây là lựa chọn đúng:
Khi Đám Mây Thắng Lợi:
- Bạn cần mở rộng từ 10 đến 10,000 pods dựa trên lưu lượng truy cập
- Bạn có đội ngũ 5 người quản lý hạ tầng cho 500 nhà phát triển
- Yêu cầu tuân thủ của bạn yêu cầu "tính khả dụng cao"
Khi Bare Metal Thắng Lợi:
- Bạn đang chạy một khối lượng công việc nhất quán 24/7
- Bạn có yêu cầu phần cứng rất cụ thể
- Bạn đang ở quy mô lớn như Facebook/Google
Khuyến Nghị Thực Tế
Đối với Các Startup (< 10 dịch vụ)
bash
$ docker-compose up -d
Đối với Các Công Ty Đang Tăng Trưởng (10-100 dịch vụ)
bash
$ eksctl create cluster --name my-cluster
Đối với Các Doanh Nghiệp Lớn (100+ dịch vụ)
bash
$ # Thuê một đội ngũ nền tảng
Đối với Việc Học Hỏi
bash
$ kind create cluster
Kết Luận
Sau tất cả những điều này, lựa chọn giữa Kubernetes trên đám mây và bare metal không chỉ dựa vào chi phí mà còn phụ thuộc vào nhu cầu của dự án. Sử dụng Kubernetes trên đám mây nếu bạn:
- Đánh giá cao tốc độ hơn chi phí
- Có khối lượng công việc biến đổi
- Muốn tập trung vào sản phẩm của bạn
Sử dụng Kubernetes trên bare metal nếu bạn:
- Có khối lượng công việc nhất quán
- Có đội ngũ ops dành riêng
- Đang ở quy mô lớn
Cuối cùng, sự thật là "Cloud Native" không phải là một lời dối trá – chỉ là một cái tên không phù hợp. Đôi khi, việc trả tiền cho AWS để xử lý sự phức tạp là quyết định kinh doanh thông minh nhất mà bạn có thể thực hiện.