Các tasks DevOps dưới đây anh em làm để nâng kỹ năng hoặc anh em nào mới chưa biết task thực hành thì làm nhé. Mình xếp theo cấp độ. Tuy nhiên, năm kinh nghiệm chỉ phản án được phần nào của trình độ thật sự dựa theo trải nghiệm của anh em. Chắc chắn là có những bạn có năm kinh nghiệm được tính bằng Junior nhưng thực lực thật sự sự có thể hơn rất nhiều. Nên anh em làm task để lấy giá trị cốt lõi nhé.
Các Tasks mình có gợi ý để ở cuối bài viết, anh em nên lab thử trước xong xem cách gợi ý nhé, vì gợi ý là của cá nhân nên biết đâu anh em có nhiều cách hay khác. Nếu anh em xem nhiều và hữu ích thì mình chia sẻ thêm “nhiều task nữa”. Bình tĩnh, tự tin, khiêm tốn :D
1. K8s StatefulSet Deployment (Junior)
Tình huống
Một công ty đang triển khai hệ thống web sử dụng Redis làm cache cho ứng dụng. Redis cần được triển khai đúng theo chuẩn Production với khả năng lưu trữ dữ liệu ổn định và có thể mở rộng. Hãy hoàn thành tệp YAML mẫu tại: /home/devops/mrzero-task1/special-definition.yml
.
Yêu cầu
- Tạo một namespace mới tên là mrzero.
- Triển khai Redis từ DockerHub, sử dụng image
redis:buster
, dưới dạng StatefulSet tên là cache-db, trong namespace mrzero. - Cấu hình StatefulSet với 2 replicas, mỗi pod có volume riêng.
- Mỗi pod Redis mở cổng 6379 để nhận kết nối.
- Tạo kèm một Headless Service để các pod có thể giao tiếp với nhau nếu cần (DNS theo kiểu
cache-db-0.cache-db.mrzero.svc.cluster.local
). - Sử dụng PersistentVolumeClaim để đảm bảo Redis có dữ liệu ổn định.
Ghi chú
- Giải pháp phải được viết trong tệp
/home/devops/mrzero/special-definition.yml
. -
Tất cả thao tác sẽ được kiểm tra thông qua một lệnh duy nhất:
sudo execute
được chạy từ thư mục
/home/devops/mrzero-task1/
. - Có quyền
sudo
nếu cần thiết.
Dưới đây là bản dịch tiếng Việt chuẩn + phần đánh giá mức độ thực tế và độ khó của bài toán Linux Automation:
2. Linux Automation (Junior/Middle)
Tình huống
Hãy hoàn thiện file script mẫu nằm tại: task2/runscript.sh
bằng cách viết một hoặc nhiều lệnh shell.
Yêu cầu
- Giải nén tập tin nén có sẵn tại đường dẫn
/task2/backup.tar.gz
. - Gán quyền truy cập 0664 cho tất cả các tệp vừa được giải nén.
- Gán quyền truy cập 0775 cho tất cả các thư mục vừa được giải nén.
- Thay đổi chủ sở hữu thành
anonymous
và nhóm thànhno-team
cho toàn bộ file và thư mục đã giải nén. - Tạo lại một bản nén mới có tên là
/tmp/fixed-archive.tar.gz
chứa toàn bộ nội dung sau khi đã chỉnh sửa quyền và chủ sở hữu.
Ghi chú
- Mọi thao tác phải được thực hiện bên trong thư mục
/task2
. - Việc chấm bài sẽ được thực hiện trong một môi trường mới hoàn toàn, do đó mọi thứ cần được thực hiện đúng từ
/task2
. - Tất cả các tác vụ cần được thực hiện chỉ bằng một lệnh
sudo activate
, được chạy từ thư mục câu hỏi (tức là/task2
). (Gợi ý: dùng alias hoặc shell script) - Bạn có quyền
sudo
nếu cần.
3. Cải tiến Kubernetes (Junior/Mid)
Tình huống
Trong quá trình cải tiến cụm Kubernetes, bạn cần thiết lập một tác vụ định kỳ (recurring task) để gọi đến một API từ xa. Câu hỏi đặt ra là:
Lệnh nào sau đây là đúng để thực hiện tác vụ đó?
kubectl run cronjob task --image=toolbox --schedule="*/1 * * * *" -- curl -s https://api.cyber-widget.com/refresh
kubecmd create periodic-task --image=toolbox --timing="/1 * * * *" -- curl -s https://api.cyber-widget.com/refresh
kubecmd run periodic task --image=toolbox --timing="*/1 * * * *" -- curl -s https://api.cyber-widget.com/refresh
kubectl create cronjob task --image=toolbox --schedule="*/1 * * * *" -- curl -s https://api.cyber-widget.com/refresh
Ghi chú
- Đáp án đúng sẽ được đánh giá dựa trên khả năng thiết lập đúng cronjob để thực hiện tác vụ định kỳ gọi API như mô tả.
4. CI/CD Pipeline với GitHub Actions (Junior)
Tình huống
Bạn đang chịu trách nhiệm thiết lập quy trình CI/CD cho một ứng dụng web viết bằng Python + Flask. Mã nguồn của ứng dụng đang được lưu trữ trên GitHub.
Mục tiêu
Tạo một workflow GitHub Actions đáp ứng các yêu cầu sau:
-
Kích hoạt workflow khi:
- Có
push
lên nhánhmain
- Có
pull request
nhằm vào nhánhmain
- Có
- Sử dụng môi trường Python 3.x
- Cài đặt các package được định nghĩa trong file
requirements.txt
- Chạy unit test nằm trong thư mục
tests/
- Nếu unit test thành công và workflow được kích hoạt bởi push lên nhánh main, thì tiến hành triển khai ứng dụng lên một máy chủ cloud (AWS, Azure, v.v.)
Ghi chú
- Chỉ sử dụng một file YAML duy nhất để cấu hình workflow GitHub Actions
- Giả định rằng bạn đã có đầy đủ thông tin xác thực (credentials) để triển khai lên cloud
5. GitOps với ArgoCD (Junior/Middle)
Tình huống
Team đang chuyển sang triển khai ứng dụng Kubernetes theo mô hình GitOps với ArgoCD. Nhiệm vụ của bạn là thiết lập pipeline GitOps đầu tiên để triển khai một ứng dụng mẫu từ Git vào cụm Kubernetes.
Mục tiêu
Thiết lập toàn bộ luồng GitOps với ArgoCD:
- Fork một repository ứng dụng mẫu (giả định là ứng dụng Nginx đơn giản chạy qua Deployment + Service).
- Cài đặt ArgoCD lên Kubernetes cluster (có thể dùng Minikube hoặc Rancher Desktop).
- Tạo ArgoCD Application để triển khai ứng dụng từ repo bạn vừa fork.
- Thực hiện thay đổi trong mã nguồn (hoặc YAML), push lên Git, xác nhận rằng ArgoCD tự động cập nhật deployment.
- Cấu hình chiến lược rollback, đảm bảo có thể quay lại version trước nếu cần.
6. Triển khai Kubernetes Cluster bằng Terraform (Upper-Middle)
Tình huống
Công ty đang trong quá trình di chuyển các ứng dụng sang Kubernetes và sử dụng Terraform để quản lý hạ tầng. Nhiệm vụ của bạn là triển khai một cụm Kubernetes cùng với các tài nguyên thiết yếu bằng Terraform.
Yêu cầu
- Khởi tạo một dự án Terraform mới trong repository Git của bạn.
- Sử dụng module Terraform để tạo một cụm Kubernetes trên một nhà cung cấp cloud bất kỳ (AWS, GCP hoặc Azure).
-
Sau khi cụm được khởi tạo, tiếp tục dùng Terraform để triển khai các tài nguyên Kubernetes sau:
- Một Namespace tên là
rocket-app
- Một Deployment chạy image Nginx trong namespace
rocket-app
- Một Service kiểu
LoadBalancer
để public deployment Nginx
- Một Namespace tên là
- Xuất ra địa chỉ IP hoặc tên miền của LoadBalancer sau khi Terraform chạy xong.
- Viết file
README.md
mô tả tất cả các bước để chạy mã Terraform, khởi tạo cụm Kubernetes, và cách xoá bỏ toàn bộ tài nguyên khi cần.
Ràng buộc bổ sung
- Mã Terraform phải idempotent (chạy nhiều lần không sinh lỗi hoặc drift).
- Có bình luận trong code Terraform để giải thích các quyết định kỹ thuật.
Tiêu chí đánh giá
- Tạo cụm Kubernetes thành công.
- Deploy đủ các tài nguyên Kubernetes được yêu cầu.
- Đảm bảo tính idempotent.
- Chất lượng và tổ chức mã nguồn tốt.
README.md
đầy đủ, rõ ràng, giúp người khác hiểu cách chạy mã và huỷ tài nguyên.
7. Triển khai Istio trên Kubernetes (Junior/Middle)
Tình huống
Bạn cần tạo một dự án đơn giản sử dụng Istio để triển khai hai microservice trên một cụm Kubernetes. Mục tiêu là dùng Istio để quản lý lưu lượng truy cập giữa các dịch vụ này.
Yêu cầu trước khi bắt đầu
- Cụm Kubernetes đã hoạt động
- Đã cài đặt Istio vào cụm đó
Các file cần thiết
- service-a-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-a
spec:
replicas: 1
selector:
matchLabels:
app: service-a
template:
metadata:
labels:
app: service-a
spec:
containers:
- name: service-a
image: nginx
ports:
- containerPort: 80
- service-b-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-b
spec:
replicas: 1
selector:
matchLabels:
app: service-b
template:
metadata:
labels:
app: service-b
spec:
containers:
- name: service-b
image: nginx
ports:
- containerPort: 80
Mục tiêu
- Viết các quy tắc định tuyến bằng Istio để điều hướng traffic giữa hai service.
- Kiểm tra việc định tuyến bằng cách truy cập endpoint nhiều lần và quan sát việc phân phối lưu lượng theo tỷ lệ (weight) bạn đã cấu hình trong VirtualService.
8. Kỹ thuật Chaos Engineering (Upper-Middle)
Tình huống
Bạn là kỹ sư chính chịu trách nhiệm về tính ổn định và khả năng phục hồi (resilience) của một hệ thống microservice được triển khai trên AWS. Để đảm bảo rằng hệ thống có thể xử lý lỗi một cách duyên dáng (gracefully), bạn quyết định chủ động tạo ra sự cố (chaos) trong hệ thống bằng cách sử dụng công cụ Chaos Monkey.
Mục tiêu
- Cài đặt và cấu hình Chaos Monkey trên một EC2 instance.
- Sử dụng Chaos Monkey để tự động ngắt (terminate) các instance thuộc một Auto Scaling Group (ASG) cụ thể.
- Giám sát hành vi của hệ thống khi xảy ra ngắt máy bằng AWS CloudWatch.
Ràng buộc
- Giả định bạn có toàn quyền truy cập AWS (full access).
- Có thể dùng bất kỳ ngôn ngữ lập trình hoặc script nào bạn quen thuộc.
Các gợi ý nhanh
1
Gợi ý:
- Sử dụng Redis với StatefulSet, PersistentVolumeClaim, và Headless Service, tất cả trong namespace mrzero.
- Tạo alias cho execute
2
Gợi ý:
- Dùng
tar -xzf
để giải nén - Dùng
find . -type f -exec chmod 0664 {}
cho file - Dùng
find . -type d -exec chmod 0775 {}
cho thư mục - Dùng
chown -R anonymous:no-team .
để thay đổi chủ sở hữu - Dùng
tar -czf /tmp/fixed-archive.tar.gz *
để nén lại
3
Gợi ý:
- Nếu chưa quen với kubectl create cronjob, hãy thử chạy:
kubectl create cronjob --help
- Anh em chưa biết có thể search keyword: “kubernetes create cronjob from command line”
4
Gợi ý
-
Bạn nên chia file YAML thành 2 job:
- build-and-test: chạy trên mọi push/PR
- deploy: chỉ chạy khi
github.event_name == 'push'
vàgithub.ref == 'refs/heads/main'
-
Sử dụng thư viện
pytest
hoặc framework test có sẵn của project. -
Việc triển khai có thể dùng:
scp
để copy source code lên EC2ssh
để remote và restart service- Hoặc triển khai qua
Elastic Beanstalk CLI
,Heroku CLI
,Azure CLI
, v.v.
Gợi ý học tập thêm:
- Tìm hiểu
job.if
,needs
,env
,secrets
,matrix
trong GitHub Actions - Tìm hiểu kỹ các biến môi trường tự động mà GitHub cung cấp trong mỗi run
-
Nếu dùng AWS:
- Sử dụng AWS IAM user để tạo key
- Gán
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
vào GitHub Secrets
5
Gợi ý
-
Bắt đầu từ đâu?
- => Trước tiên, xác định cụ thể bạn sẽ triển khai ứng dụng mẫu từ repo nào. Nếu không có repo mẫu của công ty, bạn có thể tự tạo repo với một
deployment.yaml
đơn giản cho Nginx.
- => Trước tiên, xác định cụ thể bạn sẽ triển khai ứng dụng mẫu từ repo nào. Nếu không có repo mẫu của công ty, bạn có thể tự tạo repo với một
-
Cài đặt ArgoCD như thế nào?
- => Gợi ý: ArgoCD có manifest chính thức cài đặt bằng
kubectl apply -n argocd ...
, nhưng bạn cũng có thể dùng Helm nếu quen thuộc. Hãy đọc tài liệu chính thức tại argo-cd.readthedocs.io.
- => Gợi ý: ArgoCD có manifest chính thức cài đặt bằng
-
Tạo ArgoCD Application bằng cách nào?
-
=> Có 2 cách phổ biến:
-
Tạo YAML
Application
và apply bằngkubectl apply
. -
Hoặc truy cập giao diện Web UI của ArgoCD và khai báo ứng dụng qua đó.
-
-
Thay đổi gì để kiểm tra tự động deploy?
- => Thử sửa tên
Deployment
, đổi image tag, thêm label, hoặc update nội dung fileindex.html
(nếu dùng ConfigMap/volume). - => Theo dõi ArgoCD Web UI hoặc dùng
argocd app get <app-name>
để kiểm tra cập nhật.
- => Thử sửa tên
-
Rollback hoạt động như thế nào?
- => Gợi ý: ArgoCD có thể giữ các version trước của ứng dụng để rollback bằng nút bấm (UI) hoặc CLI (`argocd app rollback
`). - => Hãy thử cập nhật image lên version sai, rồi rollback lại để kiểm tra.
- => Gợi ý: ArgoCD có thể giữ các version trước của ứng dụng để rollback bằng nút bấm (UI) hoặc CLI (`argocd app rollback
-
Phần tài liệu cần chuẩn bị
Viết một tài liệu ngắn hoặc README.md
bao gồm:
-
Từng bước bạn đã thực hiện để cài đặt ArgoCD và deploy ứng dụng.
-
Các file YAML bạn đã viết hoặc sửa.
-
Cách bạn xác thực ArgoCD đã tự động deploy khi bạn push code.
-
Cách bạn thực hiện rollback.
-
Các vấn đề phát sinh (nếu có) và cách bạn giải quyết.
-
Bonus
-
Thử kết nối ArgoCD với GitHub repo dùng Webhook hoặc ArgoCD Polling, so sánh ưu nhược điểm.
-
Cấu hình ArgoCD RBAC hoặc SSO (nếu bạn muốn thử thách cao hơn).
6
Gợi ý
1. Khởi tạo Terraform project
- Dùng
terraform init
,terraform fmt
,terraform validate
để kiểm tra cấu trúc và định dạng. - Chia rõ file:
provider.tf
,main.tf
,outputs.tf
,variables.tf
cho dễ bảo trì.
2. Chọn cloud provider
- Nếu mới bắt đầu: chọn AWS với EKS vì Terraform hỗ trợ tốt module EKS chính chủ (terraform-aws-eks).
- Đừng cố tự viết từng resource EKS thủ công => dùng module sẽ dễ hơn rất nhiều.
3. Viết module deploy app
- Sau khi cụm K8s lên rồi, sử dụng
kubernetes
provider trong Terraform (đừng quay lại viết YAML). - Viết resource
kubernetes_namespace
,kubernetes_deployment
,kubernetes_service
.
Gợi ý: Phải dùng
kubernetes
provider đúngkubeconfig
của cluster vừa tạo (dùnglocal_file
,aws_eks_cluster_auth
, etc.).
4. Output thông tin
- Dùng output block để in ra IP hoặc DNS name từ Service kiểu LoadBalancer.
5. Đảm bảo idempotent
- Luôn test lại bằng
terraform plan
2-3 lần để xem có bị drift hoặctainted
không. - Tránh hardcode => dùng variable, locals, output rõ ràng.
6. README.md rõ ràng
-
Gợi ý nội dung:
- Giới thiệu bài toán.
- Cách cấu hình cloud credential.
- Cách chạy
terraform apply
, validate. - Cách destroy cụm (
terraform destroy
). - Liệt kê output mong đợi.
7
Gợi ý
-
Cài đặt Istio
- Gợi ý: Sử dụng Istioctl hoặc Helm để cài.
- Ghi nhớ: Đảm bảo namespace
istio-system
có đầy đủ Pod chạy ổn định.
-
Triển khai hai service
- Dùng file
service-a-deployment.yaml
vàservice-b-deployment.yaml
như đã cho. - Gợi ý thêm: Cần tạo thêm
Service
object cho từng deployment.
- Dùng file
-
Thêm sidecar injection
- Cân nhắc: Có bật chế độ tự động inject Envoy sidecar vào các Pod không?
- Gợi ý: Label namespace để Istio inject sidecar nếu cần.
-
Tạo Gateway, VirtualService và DestinationRule
- Mục tiêu: Định tuyến một lượng traffic đến
service-a
, phần còn lại đếnservice-b
. - Gợi ý: Có thể bắt đầu với
match
theo URI hoặc gửi toàn bộ đến một host cụ thể và chia đều traffic.
- Mục tiêu: Định tuyến một lượng traffic đến
-
Kiểm tra
- Dùng curl hoặc một Pod tạm để gửi request nhiều lần.
- Quan sát: Có sự thay đổi phản hồi từ service khác nhau không?
8
Gợi ý
Bước 1: Tìm hiểu và cài đặt Chaos Monkey
- Gợi ý: Chaos Monkey gốc là phần của Netflix Simian Army, nhưng nó đã ngừng phát triển.
-
Hướng thay thế: Dùng chaos-engineering tools hiện đại như:
- Gremlin
- LitmusChaos
- AWS Fault Injection Simulator (FIS) – có thể dùng thay thế vì tích hợp sẵn trong AWS.
Bước 2: Cấu hình Chaos Monkey để terminate instance trong ASG
-
Gợi ý:
- Xác định đúng tên Auto Scaling Group
- Đảm bảo Chaos Monkey (hoặc công cụ tương đương) có quyền gọi API
TerminateInstanceInAutoScalingGroup
- Tạo một IAM Role với quyền đủ mạnh, đính vào EC2 đang chạy Chaos Monkey
Bước 3: Cấu hình CloudWatch để giám sát
-
Gợi ý:
- Tạo Alarm theo CPUUtilization, UnhealthyInstanceCount, NumberOfInstances
- Gắn tag cho các alert để dễ lọc theo môi trường thử nghiệm
- Có thể dùng AWS SNS để gửi alert về Slack hoặc Email
Bước 4: Ghi chú lại các quan sát khi thử nghiệm chaos
-
Cần trả lời các câu hỏi sau:
- Hệ thống có tự phục hồi đúng như kỳ vọng không?
- Có downtime hay lỗi dịch vụ nào không?
- Các cảnh báo có được kích hoạt đúng lúc?