spinny:~/writing $ vim introduction-to-kubernetes.md
1~2Nế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õ.3~4## Trước Kubernetes: Một Chút Lịch Sử5~6Để 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.7~81. **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.92. **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.103. **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.11~12Container 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?13~14Đây là lúc **Kubernetes** xuất hiện.15~16## Kubernetes Là Gì?17~18Kubernetes (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.19~20## Kiến Trúc Của Kubernetes Cluster21~22Mô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.23~24```mermaid25graph TD26 subgraph "Control Plane (Master)"27 A["API Server"]28 B["etcd"]29 C["Scheduler"]30 D["Controller Manager"]31 end32~33 subgraph "Worker Node 1"34 E["Kubelet"] --- F["Container Runtime"]35 G["Kube-proxy"]36 F --- H["Pod"]37 F --- I["Pod"]38 end39~40 subgraph "Worker Node 2"41 J["Kubelet"] --- K["Container Runtime"]42 L["Kube-proxy"]43 K --- M["Pod"]44 end45~46 A -- "Communicates with" --> E47 A -- "Communicates with" --> J48 User -- "kubectl" --> A49 C -- "Assigns Pods to Nodes" --> E50 D -- "Maintains state" --> A51 A -- "Saves/Reads state" --> B52```53~54### Control Plane55~56Control 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à:57~58- **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 (qua `kubectl`), các thành phần cluster và công cụ bên ngoài để giao tiếp.59- **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.60- **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.61- **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 Controller` quản lý nodes, trong khi `Replication Controller` đảm bảo số lượng Pods đúng đang chạy.62~63### Worker Node64~65Worker 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:66~67- **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.68- **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.69- **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ư `containerd` và `CRI-O`.70~71## Các Object Cơ Bản Của Kubernetes72~73Trong 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.74~75Đây là những object quan trọng nhất:76~77### Pod78~79**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ữ.80~81Thô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.82~83Bạ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.84~85### Deployment86~87**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:88~89- 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).90- **Mở rộng** số lượng Pods lên hoặc xuống.91- 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.92~93Đây là ví dụ file YAML cho Deployment chạy 3 bản sao server NGINX:94~95```yaml96# nginx-deployment.yaml97apiVersion: apps/v198kind: Deployment99metadata:100 name: nginx-deployment101spec:102 replicas: 3103 selector:104 matchLabels:105 app: nginx106 template:107 metadata:108 labels:109 app: nginx110 spec:111 containers:112 - name: nginx113 image: nginx:1.14.2114 ports:115 - containerPort: 80116```117~118### Service119~120Pods 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?121~122Bằ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.123~124```mermaid125graph TD126 subgraph "Service (nginx-service)"127 A["ClusterIP: 10.96.0.10"]128 end129~130 subgraph "Pods"131 B("Pod 1 - IP: 192.168.1.2")132 C("Pod 2 - IP: 192.168.1.3")133 D("Pod 3 - IP: 192.168.1.4")134 end135~136 A -- "Selector: app=nginx" --> B137 A -- "Selector: app=nginx" --> C138 A -- "Selector: app=nginx" --> D139~140 Client -- "Request to nginx-service" --> A141```142~143Service sử dụng `selector` dựa trên `labels` để tìm Pods cần chuyển tiếp traffic.144~145Cách tạo Service cho NGINX Deployment:146~147```yaml148# nginx-service.yaml149apiVersion: v1150kind: Service151metadata:152 name: nginx-service153spec:154 selector:155 app: nginx156 ports:157 - protocol: TCP158 port: 80159 targetPort: 80160 type: ClusterIP # Default - exposes the service only within the cluster161```162~163Có nhiều loại Services:164- `ClusterIP`: Expose service trên IP nội bộ cluster (mặc định).165- `NodePort`: Expose service trên port tĩnh trên mỗi Worker Node.166- `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.167~168### Ingress169~170Service `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**.171~172Ingress 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`).173~174```mermaid175graph LR176 User -- "mysite.com/api" --> Ingress177 User -- "mysite.com/ui" --> Ingress178~179 subgraph "Cluster"180 Ingress -- "/api" --> ServiceA("api-service")181 Ingress -- "/ui" --> ServiceB("ui-service")182~183 ServiceA --> PodA1("API Pod 1")184 ServiceA --> PodA2("API Pod 2")185~186 ServiceB --> PodB1("UI Pod 1")187 ServiceB --> PodB2("UI Pod 2")188 end189```190~191Ví dụ về Ingress:192```yaml193# example-ingress.yaml194apiVersion: networking.k8s.io/v1195kind: Ingress196metadata:197 name: example-ingress198spec:199 rules:200 - host: mysite.com201 http:202 paths:203 - path: /api204 pathType: Prefix205 backend:206 service:207 name: api-service208 port:209 number: 8080210 - path: /ui211 pathType: Prefix212 backend:213 service:214 name: ui-service215 port:216 number: 3000217```218~219### Các Object Hữu Ích Khác220~221- **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.222- **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.223- **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.224- **PersistentVolume (PV) và PersistentVolumeClaim (PVC)**: Quản lý lưu trữ bền vững trong cluster.225~226## Kết Luận227~228Kubernetes 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.229~230**Bây giờ làm gì?**231- **Thử nghiệm cục bộ**: Cài đặt [Minikube](https://minikube.sigs.k8s.io/docs/start/) hoặc [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/) để tạo Kubernetes cluster trên máy tính của bạn.232- **Sử dụng `kubectl`**: Làm quen với lệnh `kubectl`, 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.233- **Khám phá hướng dẫn chính thức**: [Tài liệu Kubernetes](https://kubernetes.io/docs/tutorials/) là nguồn tài nguyên tuyệt vời đầy ví dụ.234~235Đ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ẻ!236~
NORMAL · introduction-to-kubernetes.md [readonly]236 lines · :q to close