# Pod Disruption Budgets là gì?

Khi quản trị các workload của Kubernetes, việc hiểu và sử dụng hiệu quả pod disruption budgets (PDBs) là rất quan trọng. PDBs ít khi được sử dụng trong Kubernetes tuy nhiên nó có khả năng đảm bảo tính khả dụng cao của các ứng dụng trong thời gian gián đoạn tự nguyện (voluntary) và bắt buộc (involuntary).

Pod disruption budget giống như một API object có chức năng xác định số lương pod trong ứng dụng tối thiểu cần thiết phải họat động trơn tru trong suốt quá trình gián đoạn (disruption). Các quá trình gián đoạn có thể là tự nguyện ví dụ như các quá trình bảo trì hoặc scale node, hoặc gián đoạn bắt buộc ví dụ như lỗi phần cứng hay lỗi hệ thống.

Quá trình gián đoạn có thể ảnh hưởng lớn đến hiệu suất của ứng dụng và tính khả dụng nếu không được quản trị hợp lý. Đây là lúc ta cần đến pod disruption budgets.

> Khi định nghĩa một PDB, ta tạo một khoảng an toàn cho ứng dụng của mình, hạn chế downtime và đảm bảo tính liên tục của các dịch vụ. Trong bài viết này ta sẽ tìm hiểu cách tạo và sử dụng PDB cũng như các best practice và ứng dụng chúng vào thực tế.

### PDB là gì?

Việc tạo một pod disruption budget cần phải xem xét rất kĩ tới nhu cầu về tính khả dụng của ứng dụng. Trước tiên ta phải hiểu rõ số lượng cần thiết hoạt động tối thiểu trong quá trình gián đoạn để có được mức độ khả dụng hợp lý.

Selector đóng một vai trò quan trọng trong việc định hình pod disruption budget. Khi định nghĩa các selector một cách chính xác, ta có thể chọn các pod để apply PDB. Việc này sẽ đảm bảo rằng budget chỉ bảo vệ cho các pod cần thiết.

### 3 bước để tạo PDB:

#### 1\. Định nghĩa số lượng instance tối thiểu:

Xem xét nhu cầu của ứng dụng và đưa ra số lượng instance tối thiểu cần phải hoạt động trong quá trình gián đoạn.

#### 2\. Tạo một YAML file.

Ví dụ về YAML:

```yaml

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: my-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: my-app
```

Trong ví dụ này ta đặt ***minAvailable*** là 2 tức là có ít nhất 2 instance của các pod đã chỉ định cần phải khả dụng bất kì thời điểm nào. Selector sẽ định nghĩa các pod mục tiêu dự trên label app: my-app

#### 3\. Apply YAML file

Sử dụng kubectl apply để apply YAML file và tạo PDB trong cụm.

```plaintext
kubectl apply -f pdb.yaml
```

Nhớ đổi `pdb.yaml` thành YAML của bạn nhé.

### Khi nào thì sử dụng PDB?

Để sử dụng PDB hiệu quả ta cần biết cách kiểm tra trạng thái của PDB, giả lập gián đoạn (disruption simulation) và cập nhật hoặc xóa khi cần thiết.

#### 1\. Kiểm tra trạng thái PDB:

Sử dụng kubectl để kiểm tra trạng thái và thông tin về PDB:

```plaintext
kubectl describe pdb my-pdb
```

#### 2\. Simulate disruptions:

Ta cần kiểm tra PDB xem nó có hoạt động như mong muốn trong quá trình gián đoạn hay không. Ta có thể giả lập một gián đoạn bằng cách drain một node hoặc xóa một pod:

```plaintext
kubectl drain <node-name> --ignore-daemonsets
```

Command trên sẽ kiểm tra xem PDB có đáp ứng số pod cần khả dụng trong quá trình bảo trì node hay không.

#### 3\. Cập nhật hoặc xóa PDB.

Nếu cần phải chỉnh sửa ta có thể cập nhật PDB để điều chỉnh số lượng pod tối thiểu hoặc các tham số khác

* **Sử dụng kubectl apply để cập nhật:**
    

```plaintext
kubectl apply -f updated-pdb.yaml
```

* **Để xóa PDB:**
    

```plaintext
kubectl delete pdb my-pdb
```

### Best practices trong quá trình sử dụng PDB

Để sử dụng PDB hiệu quả ta cần áp dụng các best practice sau:

#### 1\. Hiểu ứng dụng của bạn:

Ta cần có một hiểu biết sâu về các yêu cầu trong ứng dụng từ đó mới có thể xác định số pod replica có thể mất mà không ảnh hưởng đến hoạt động của ứng dụng.

#### 2\. Sử dụng các selector hiệu quả:

Đảm bảo các selector trong PDB trỏ đến các pod cần bảo vệ.

#### 3\. Sử dụng giá trị theo phần trăm:

Thay vì sử dụng các con số cụ thể, ta nên sử dụng các giá trị dựa theo phần trăm cho minAvailable hoặc maxUnavailable. Điều này tăng tính linh hoạt khi ta scale ứng dụng.

#### 4\. Sử dụng PDB trên các object bậc cao:

Sử dụng PDB cùng các Deployment, ReplicaSet, StatefulSet.

#### 5\. Chú ý đến các gián đoạn bắt buộc:

PDB chỉ giới hạn các gián đoạn tự nguyện. Hãy đảm bảo cụm của bạn có đủ tài nguyên để xử lý các gián đoạn bắt buộc như lỗi phần cứng hay lỗi hệ thống mà không vi phạm giới hạn của PDB.

#### 6\. Quản lý các PDB:

Thường xuyên kiểm tra trạng thái và thông tin của các PDB và các pod liên quan. Sử dụng các command của Kubernetes hoặc một dashboard để có cái nhìn chi tiết về ảnh hưởng của các gián đoạn và đảm bảo các PDB đã được cấu hình hợp lý.

#### 7\. Review và revise:

Bạn nên review và revise PDB định kì dựa trên các thay đổi của ứng dụng, của cụm hoặc các yêu cầu của hệ thống.

**Các command thường dùng cho PDB:**

* **Describe một PDB:**
    

```plaintext
kubectl describe pdb my-pdb
```

* **Drain một node để theo dõi PDB trong quá trình đó:**
    

```plaintext
kubectl drain <node-name> --ignore-daemonsets
```

## Tổng kết

Sử dụng PDB là một phương pháp tuyệt vời để đảm bảo tính sẵn sàng và tính tin cậy của các ứng dụng trong cụm Kubernetes. Bằng cách thêm các PDB ta có thể điều khiển số lượng pod cần phải chạy trong quá trình gián đoạn để tránh downtime và đảm bảo các dịch vụ quan trọng luôn hoạt động như yêu cầu.
