Nếu bạn làm việc trong lĩnh vực phát triển phần mềm, chắc hẳn bạn đã nghe về Kubernetes. Nhưng chính xác nó là gì, và tại sao nó trở thành tiêu chuẩn thực tế để quản lý các ứng dụng container hóa? Hướng dẫn này sẽ đưa bạn từ những kiến thức cơ bản đến các khái niệm nền tảng, với các ví dụ thực tế và sơ đồ giúp bạn hiểu rõ.
Trước Kubernetes: Một Chút Lịch Sử
Để hiểu tại sao Kubernetes mang tính cách mạng đến vậy, hãy nhìn lại phía sau.
- Triển khai truyền thống: Ban đầu, các ứng dụng chạy trên máy chủ vật lý. Cách tiếp cận này tốn kém, khó mở rộng và dễ xảy ra xung đột tài nguyên.
- Triển khai ảo hóa: Sau đó xuất hiện Máy ảo (VM). VM cho phép chạy nhiều ứng dụng cách ly trên cùng phần cứng, cải thiện việc sử dụng tài nguyên và bảo mật. Tuy nhiên, mỗi VM chạy một hệ điều hành hoàn chỉnh, tiêu tốn nhiều tài nguyên.
- Triển khai container hóa: Container (như Docker) là bước tiến hóa tiếp theo. Chúng chia sẻ cùng hệ điều hành host nhưng chạy các tiến trình cách ly. Chúng nhẹ, khởi động nhanh và có tính di động.
Container giải quyết vấn đề di động nhưng tạo ra một vấn đề khác: làm thế nào để quản lý hàng trăm (hoặc hàng nghìn) container trong môi trường production? Làm thế nào để đảm bảo chúng luôn chạy, có thể giao tiếp với nhau và mở rộng theo tải?
Đây là lúc Kubernetes xuất hiện.
Kubernetes Là Gì?
Kubernetes (thường viết tắt là K8s) là nền tảng mã nguồn mở cho điều phối container. Nói đơn giản, nó tự động hóa việc triển khai, mở rộng và quản lý các ứng dụng container hóa. Được tạo bởi Google và hiện được duy trì bởi Cloud Native Computing Foundation (CNCF), Kubernetes đã trở thành công cụ không thể thiếu cho bất kỳ ai làm việc với microservices ở quy mô lớn.
Kiến Trúc Của Kubernetes Cluster
Môi trường Kubernetes được gọi là cluster. Một cluster bao gồm tập hợp các máy, gọi là nodes, chạy các ứng dụng của chúng ta. Kiến trúc được chia thành hai phần chính: Control Plane và Worker Nodes.
Control Plane
Control Plane là "bộ não" của cluster. Nó đưa ra quyết định toàn cục (như lập lịch) và phát hiện, phản hồi các sự kiện cluster. Các thành phần chính là:
- API Server (
kube-apiserver): Cổng vào cluster. Nó cung cấp Kubernetes API, được sử dụng bởi người dùng (quakubectl), các thành phần cluster và công cụ bên ngoài để giao tiếp. - etcd: Cơ sở dữ liệu key-value nhất quán và có tính sẵn sàng cao. Lưu trữ tất cả dữ liệu cluster, đại diện cho trạng thái mong muốn và hiện tại của hệ thống.
- Scheduler (
kube-scheduler): Gán các Pods mới tạo cho Worker Node khả dụng, tính đến yêu cầu tài nguyên, chính sách và các ràng buộc khác. - Controller Manager (
kube-controller-manager): Chạy các controller, là các vòng lặp điều khiển giám sát trạng thái cluster và làm việc để đưa nó về trạng thái mong muốn. Ví dụ,Node Controllerquản lý nodes, trong khiReplication Controllerđảm bảo số lượng Pods đúng đang chạy.
Worker Node
Worker Nodes là các máy (vật lý hoặc ảo) nơi ứng dụng thực sự chạy. Mỗi node được quản lý bởi Control Plane và chứa các thành phần sau:
- Kubelet: Agent chạy trên mỗi node. Đảm bảo các container được mô tả trong Pods đang chạy và khỏe mạnh.
- Kube-proxy: Proxy mạng quản lý các quy tắc mạng trên nodes. Cho phép giao tiếp mạng tới Pods từ các phiên mạng bên trong hoặc bên ngoài cluster.
- Container Runtime: Phần mềm chịu trách nhiệm chạy container. Docker nổi tiếng nhất, nhưng Kubernetes cũng hỗ trợ các runtime khác như
containerdvàCRI-O.
Các Object Cơ Bản Của Kubernetes
Trong Kubernetes, mọi thứ được biểu diễn bằng objects. Các object này là "bản ghi ý định": khi bạn tạo object, Kubernetes liên tục làm việc để đảm bảo nó tồn tại và khớp với trạng thái mong muốn.
Đây là những object quan trọng nhất:
Pod
Pod là đơn vị thực thi nhỏ nhất trong Kubernetes. Nó đại diện cho một hoặc nhiều container chạy cùng nhau trên cùng node, chia sẻ tài nguyên như mạng và lưu trữ.
Thông thường, bạn chỉ chạy một container mỗi Pod, nhưng trong các kịch bản nâng cao (như "sidecar containers" cho logging hoặc monitoring), bạn có thể có nhiều hơn.
Bạn hầu như không bao giờ tạo Pods trực tiếp. Bạn sử dụng các abstraction cấp cao hơn như Deployments.
Deployment
Deployment là object bạn sẽ sử dụng nhiều nhất. Nó mô tả trạng thái mong muốn cho một nhóm Pods giống hệt nhau. Controller Deployment chịu trách nhiệm:
- Tạo và quản lý ReplicaSet (object khác đảm bảo số lượng bản sao cụ thể của Pod luôn chạy).
- Mở rộng số lượng Pods lên hoặc xuống.
- Quản lý cập nhật ứng dụng một cách có kiểm soát (ví dụ, Rolling Update), không có downtime.
Đây là ví dụ file YAML cho Deployment chạy 3 bản sao server NGINX:
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
Service
Pods trong Kubernetes là tạm thời: chúng có thể được tạo và hủy bất cứ lúc nào. Mỗi Pod có địa chỉ IP riêng, nhưng IP này không ổn định. Vậy làm sao để expose ứng dụng một cách đáng tin cậy?
Bằng Service. Service là abstraction định nghĩa một tập hợp logic các Pods và chính sách truy cập chúng. Nó cung cấp điểm truy cập ổn định (địa chỉ IP ảo và tên DNS) cho một nhóm Pods.
Service sử dụng selector dựa trên labels để tìm Pods cần chuyển tiếp traffic.
Cách tạo Service cho NGINX Deployment:
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP # Default - exposes the service only within the cluster
Có nhiều loại Services:
ClusterIP: Expose service trên IP nội bộ cluster (mặc định).NodePort: Expose service trên port tĩnh trên mỗi Worker Node.LoadBalancer: Tạo load balancer bên ngoài trong cloud provider (ví dụ, AWS, GCP) và gán IP công cộng cho service.
Ingress
Service LoadBalancer rất tốt, nhưng tạo một cho mỗi service có thể tốn kém. Để expose nhiều service HTTP/HTTPS ra bên ngoài, bạn sử dụng Ingress.
Ingress hoạt động như "bộ định tuyến thông minh" cho traffic bên ngoài. Nó cho phép bạn định nghĩa quy tắc routing dựa trên host (ví dụ, api.mysite.com) hoặc path (ví dụ, mysite.com/api).
Ví dụ về Ingress:
# example-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: mysite.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 - path: /ui pathType: Prefix backend: service: name: ui-service port: number: 3000
Các Object Hữu Ích Khác
- Namespace: Cho phép tạo "cluster ảo" bên trong cluster vật lý. Hữu ích để cách ly môi trường (ví dụ,
development,staging,production) hoặc đội nhóm. - ConfigMap và Secret: Quản lý dữ liệu cấu hình và bí mật (như mật khẩu hoặc API key) tách biệt khỏi container image.
- StatefulSet: Tương tự Deployment, nhưng dành riêng cho ứng dụng có trạng thái (như cơ sở dữ liệu) cần danh tính mạng ổn định và lưu trữ bền vững.
- PersistentVolume (PV) và PersistentVolumeClaim (PVC): Quản lý lưu trữ bền vững trong cluster.
Kết Luận
Kubernetes là công cụ cực kỳ mạnh mẽ, nhưng đường cong học tập có thể dốc. Hướng dẫn này chỉ mới chạm bề mặt, nhưng hy vọng đã mang lại cho bạn hiểu biết vững chắc về các khái niệm cơ bản.
Bây giờ làm gì?
- Thử nghiệm cục bộ: Cài đặt Minikube hoặc Kind để tạo Kubernetes cluster trên máy tính của bạn.
- Sử dụng
kubectl: Làm quen với lệnhkubectl, công cụ chính để tương tác với cluster. Thử tạo NGINX Deployment và Service từ bài viết này. - Khám phá hướng dẫn chính thức: Tài liệu Kubernetes là nguồn tài nguyên tuyệt vời đầy ví dụ.
Điều phối container là kỹ năng nền tảng trong thế giới cloud-native, và thành thạo Kubernetes sẽ mở ra một thế giới đầy khả năng. Chúc bạn vui vẻ!