(+84) 236.3827111 ex. 402

Bắt đầu với Docker – Phần 10: Docker trong thực tế doanh nghiệp & mở rộng với Kubernetes


Ở phần trước, chúng ta đã tìm hiểu cách Docker hỗ trợ xây dựng kiến trúc Microservices. Tuy nhiên, khi hệ thống được đưa vào môi trường doanh nghiệp, vấn đề không còn đơn giản là chạy được một vài container. Doanh nghiệp cần quan tâm đến khả năng mở rộng, bảo mật, giám sát, tính sẵn sàng cao và tự động khôi phục khi xảy ra sự cố.

Đây cũng là thời điểm Kubernetes thường được sử dụng để mở rộng hệ thống container.

1. Docker được sử dụng như thế nào trong doanh nghiệp?

Trong doanh nghiệp, Docker thường được tích hợp vào toàn bộ quy trình phát triển và vận hành phần mềm:

Phát triển ứng dụng

Mỗi lập trình viên có thể chạy ứng dụng trong cùng một môi trường container. Điều này giúp hạn chế tình trạng ứng dụng chạy tốt trên máy phát triển nhưng gặp lỗi khi triển khai lên máy chủ.

Xây dựng và quản lý Image

Mỗi phiên bản ứng dụng được đóng gói thành Docker Image và lưu tại registry như Docker Hub hoặc registry nội bộ. Image nên được gắn thẻ phiên bản rõ ràng thay vì chỉ sử dụng thẻ latest.

Ví dụ:

docker build -t company/web-api:1.2.0 .
docker push company/web-api:1.2.0

Tích hợp CI/CD

Khi mã nguồn được cập nhật, hệ thống CI/CD có thể tự động kiểm thử, xây dựng Image, quét lỗi và đẩy Image lên registry. Docker cung cấp các thành phần chính thức để tích hợp quá trình build và push Image với những nền tảng CI/CD như GitHub Actions.

Quy trình phổ biến:

Developer → Git Repository → CI/CD → Docker Registry → Server

Quản lý cấu hình và thông tin nhạy cảm

Mật khẩu cơ sở dữ liệu, API key và token không nên được ghi trực tiếp trong Dockerfile hoặc mã nguồn. Docker Compose cho phép cấp secret riêng cho từng service và đưa secret vào container dưới dạng tệp trong thư mục /run/secrets.

Giám sát và ghi log

Log của container thường được tập trung về các hệ thống như Elasticsearch, Loki, Prometheus hoặc Grafana. Nhờ đó, quản trị viên có thể theo dõi trạng thái của nhiều ứng dụng từ một vị trí duy nhất.

Ngoài ra, doanh nghiệp cần đặt giới hạn CPU và RAM cho container để tránh một dịch vụ sử dụng toàn bộ tài nguyên máy chủ.

2. Khi nào Docker Compose chưa đủ?

Docker Compose phù hợp cho:

  • Môi trường phát triển và kiểm thử.

  • Ứng dụng nhỏ chạy trên một máy chủ.

  • Hệ thống có số lượng container không quá lớn.

  • Mô hình lab hoặc Proof of Concept.

Tuy nhiên, khi ứng dụng chạy trên nhiều máy chủ, doanh nghiệp sẽ gặp những câu hỏi phức tạp hơn:

  • Container bị lỗi thì ai sẽ khởi động lại?

  • Máy chủ vật lý gặp sự cố thì ứng dụng được chuyển sang đâu?

  • Làm thế nào tăng số lượng container khi lưu lượng truy cập tăng?

  • Làm thế nào cập nhật phiên bản mới mà không làm gián đoạn dịch vụ?

  • Làm thế nào cân bằng tải giữa các container?

  • Làm thế nào quản lý hàng trăm container trong cùng hệ thống?

Để giải quyết các vấn đề này, doanh nghiệp cần một nền tảng điều phối container, hay còn gọi là Container Orchestration.

Docker Swarm là một lựa chọn tương đối đơn giản và được tích hợp trong Docker Engine. Swarm cung cấp khả năng quản lý cluster, triển khai service và duy trì tính sẵn sàng của ứng dụng.

Tuy nhiên, với những hệ thống lớn và có yêu cầu mở rộng cao, Kubernetes là nền tảng thường được lựa chọn.

3. Kubernetes là gì?

Kubernetes, thường viết tắt là K8s, là nền tảng điều phối container giúp tự động hóa quá trình triển khai, mở rộng và quản lý ứng dụng.

Một Kubernetes cluster gồm hai thành phần chính:

  • Control Plane: Quản lý trạng thái và điều phối toàn bộ cluster.

  • Worker Node: Chạy các workload của ứng dụng.

Kubernetes không trực tiếp thay thế Dockerfile hay Docker Image. Lập trình viên vẫn đóng gói ứng dụng thành container image, sau đó Kubernetes chịu trách nhiệm triển khai và vận hành các container đó trên cluster. Một Kubernetes cluster bao gồm control plane và một hoặc nhiều worker node.

4. Một số thành phần cơ bản của Kubernetes

Pod

Pod là đơn vị triển khai nhỏ nhất trong Kubernetes. Một Pod thường chứa một container chính, nhưng cũng có thể chứa nhiều container cần hoạt động gần nhau.

Deployment

Deployment mô tả cách ứng dụng được triển khai, bao gồm Image, số lượng Pod và chiến lược cập nhật.

Khi một Pod gặp lỗi, Deployment có thể tạo Pod mới để duy trì số lượng bản sao mong muốn.

Service

Pod có thể bị thay thế và thay đổi địa chỉ IP. Service cung cấp một điểm truy cập ổn định để các ứng dụng khác kết nối tới nhóm Pod phía sau.

Ingress

Ingress quản lý truy cập HTTP hoặc HTTPS từ bên ngoài cluster đến các Service. Nó có thể định tuyến yêu cầu dựa trên tên miền hoặc đường dẫn URL.

ConfigMap và Secret

ConfigMap được sử dụng cho dữ liệu cấu hình thông thường, trong khi Secret dùng để lưu những dữ liệu nhạy cảm như mật khẩu, token hoặc khóa truy cập.

5. Ví dụ triển khai ứng dụng trên Kubernetes

Giả sử chúng ta có Image:

company/web-api:1.2.0

Có thể tạo một Deployment đơn giản như sau:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-api
  template:
    metadata:
      labels:
        app: web-api
    spec:
      containers:
        - name: web-api
          image: company/web-api:1.2.0
          ports:
            - containerPort: 8080

Triển khai bằng lệnh:

kubectl apply -f deployment.yaml

Kubernetes sẽ duy trì ba Pod chạy ứng dụng. Nếu một Pod bị lỗi, hệ thống sẽ tự động tạo Pod khác để thay thế.

Để cung cấp điểm truy cập cho ứng dụng, chúng ta có thể tạo Service:

apiVersion: v1
kind: Service
metadata:
  name: web-api-service
spec:
  selector:
    app: web-api
  ports:
    - port: 80
      targetPort: 8080

6. Mở rộng ứng dụng tự động

Kubernetes hỗ trợ Horizontal Pod Autoscaler, giúp tự động điều chỉnh số lượng Pod dựa trên mức sử dụng CPU, RAM hoặc các chỉ số khác. Khi tải tăng, hệ thống tạo thêm Pod; khi tải giảm, số lượng Pod có thể được thu hẹp để tiết kiệm tài nguyên.

Ví dụ:

kubectl autoscale deployment web-api \
  --cpu-percent=70 \
  --min=3 \
  --max=10

Trong trường hợp này, ứng dụng duy trì ít nhất ba Pod và có thể mở rộng tối đa mười Pod.

7. Mô hình triển khai trong doanh nghiệp

Một quy trình triển khai container hoàn chỉnh có thể được tổ chức như sau:

Developer
    ↓
Git Repository
    ↓
CI/CD Pipeline
    ↓
Build và kiểm tra Docker Image
    ↓
Container Registry
    ↓
Kubernetes Cluster
    ↓
Service hoặc Ingress
    ↓
Người dùng

Bên cạnh đó, hệ thống thường được tích hợp thêm:

  • Công cụ giám sát và cảnh báo.

  • Hệ thống thu thập log tập trung.

  • Quản lý Secret tập trung.

  • Kiểm tra lỗ hổng của Image.

  • Sao lưu dữ liệu và kế hoạch khôi phục.

  • Phân quyền truy cập theo vai trò.

  • Chính sách bảo mật cho Pod và lưu lượng mạng.

Kubernetes định nghĩa các mức Pod Security Standards gồm Privileged, BaselineRestricted, giúp doanh nghiệp xây dựng chính sách bảo mật phù hợp cho từng môi trường.

8. Có phải hệ thống nào cũng cần Kubernetes?

Kubernetes mang lại nhiều tính năng nhưng cũng làm tăng độ phức tạp trong triển khai và vận hành.

Không nhất thiết phải sử dụng Kubernetes khi:

  • Ứng dụng chỉ chạy trên một máy chủ.

  • Lưu lượng truy cập thấp và ổn định.

  • Hệ thống chỉ có vài container.

  • Đội ngũ chưa có kinh nghiệm vận hành cluster.

  • Docker Compose đã đáp ứng đầy đủ yêu cầu.

Kubernetes phù hợp hơn khi:

  • Ứng dụng gồm nhiều service.

  • Cần triển khai trên nhiều máy chủ.

  • Yêu cầu tính sẵn sàng cao.

  • Cần tự động mở rộng theo lưu lượng.

  • Thường xuyên cập nhật phiên bản ứng dụng.

  • Có đội ngũ DevOps hoặc vận hành chuyên trách.

Doanh nghiệp nên lựa chọn công nghệ dựa trên quy mô và yêu cầu thực tế, thay vì sử dụng Kubernetes chỉ vì đây là một nền tảng phổ biến.

Kết luận

Docker giúp chuẩn hóa cách đóng gói và phân phối ứng dụng, trong khi Kubernetes mở rộng khả năng quản lý container trên nhiều máy chủ.

Có thể hiểu đơn giản:

Docker: Đóng gói và chạy container
Kubernetes: Điều phối và vận hành nhiều container

Trong môi trường doanh nghiệp, Docker thường là nền tảng khởi đầu cho quá trình container hóa. Khi hệ thống phát triển về quy mô, số lượng dịch vụ và yêu cầu tính sẵn sàng, Kubernetes trở thành bước mở rộng phù hợp.

Qua 10 phần của chuỗi bài, chúng ta đã đi từ những khái niệm Docker cơ bản đến Dockerfile, Docker Hub, Docker Compose, CI/CD, Microservices và cuối cùng là cách vận hành container trong môi trường doanh nghiệp.