Không cần phải nói, Kubernetes đang là một “thế lực” ngày càng lớn mạnh. Hãy xem trong 5 “chiêu” ẩn này, bạn đã biết được bao nhiêu cái rồi nhé. Dù chúng ta có tạo bao nhiêu file YAML, quản lý bao nhiêu deployment, hay dùng Kubernetes nhiều đến đâu đi chăng nữa, thì vẫn luôn có thứ để học hỏi từ “con quái vật” này nhờ vào những đóng góp cực kỳ đỉnh cao của cộng đồng mã nguồn mở.
Kubernetes đối với việc triển khai ứng dụng cũng như Apple đối với smartphone vậy một “kẻ thay đổi cuộc chơi” đã định nghĩa lại toàn bộ “sân chơi”.
1. Dùng initContainers
cho các tác vụ phức tạp trước khi khởi động
Hầu hết người dùng Kubernetes đều quen thuộc với initContainers
cho các tác vụ thiết lập đơn giản như chờ một service sẵn sàng.
Tuy nhiên, initContainers
có thể làm được nhiều hơn thế. Ví dụ, bạn có thể dùng chúng để lấy secret từ một nguồn bên ngoài, thiết lập biến môi trường, hoặc thậm chí chạy các migration cơ sở dữ liệu trước khi main container của bạn khởi động.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
initContainers:
- name: init-migration
image: my-migration-image
command: ['sh', '-c', 'python migrate.py']
volumeMounts:
- name: migration-scripts
mountPath: /scripts
containers:
- name: app-container
image: my-app-image
volumeMounts:
- name: migration-scripts
mountPath: /app/scripts
volumes:
- name: migration-scripts
emptyDir: {}
2. Tận dụng Custom Resource Definitions (CRDs) và Operators
CRDs cho phép bạn mở rộng Kubernetes với các kiểu API riêng của mình, và Operators sử dụng các CRD này để quản lý các ứng dụng phức tạp.
Mặc dù nhiều người biết về CRDs, nhưng ít ai tận dụng hết tiềm năng của chúng.
apiVersion: myoperator.example.com/v1
kind: MyDB
metadata:
name: mydatabase
spec:
replicas: 3
storageGB: 10
Người quản trị Kube sẽ tự động tạo và quản lý một stateful set, services, và persistent volumes dựa trên resource tùy chỉnh này.
3. Dùng Pod Presets cho các cấu hình mặc định
Pod Presets là một tính năng ít được biết đến cho phép bạn “inject” (chèn) các cấu hình mặc định, biến môi trường, hoặc volume vào các pod mà không cần sửa đổi các file YAML của chúng.
Điều này đặc biệt hữu ích cho việc thiết lập các secret hoặc cấu hình cần được áp dụng trên toàn cluster.
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: default-env-vars
spec:
selector:
matchLabels:
env: production
env:
- name: LOG_LEVEL
value: info
volumes:
- name: secret-volume
secret:
secretName: my-secret
4. Network Policies nâng cao để kiểm soát chi tiết
Network Policies là một cách mạnh mẽ để kiểm soát luồng traffic giữa các pod, nhưng nhiều người dùng chỉ mới “gãi đúng bề mặt” của những gì chúng có thể làm.
Bạn có thể dùng chúng để áp dụng các thực hành bảo mật tốt nhất, như nguyên tắc đặc quyền tối thiểu (principle of least privilege).
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-only-internal-services
spec:
podSelector:
matchLabels:
app: my-app
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: internal-service
ports:
- protocol: TCP
port: 80
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 443
5. Garbage Collection và Resource Quotas để quản lý Cluster hiệu quả
Garbage collection (thu gom rác) và resource quotas (hạn ngạch tài nguyên) thường bị bỏ qua, nhưng chúng rất quan trọng để duy trì một cluster khỏe mạnh.
Bằng cách đặt resource quotas và hiểu các chính sách garbage collection, bạn có thể ngăn chặn việc cạn kiệt tài nguyên và đảm bảo cluster hoạt động trơn tru.
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "2"
requests.memory: 4Gi
limits.cpu: "4"
limits.memory: 8Gi
Quota này giới hạn tổng số yêu cầu (requests) và giới hạn (limits) CPU và bộ nhớ cho một namespace, ngăn không cho bất kỳ pod đơn lẻ nào tiêu thụ quá nhiều tài nguyên.