New FAMILUG

The PyMiers

Saturday 25 May 2019

Để trở thành DevOps Engineer

DevOps là một từ khóa công nghệ cực hot trong khoảng 2015-2018, đánh dấu
sự thay đổi về quy trình phát triển phần mềm trên toàn Trái Đất. Tại thời điểm
viết bài (2019-05), vị trí này đã có mặt ở hầu hết các công ty công nghệ tại
Việt Nam.

Bài viết này giải thích các khái niệm liên quan tới DevOps, đưa ra một giáo
trình để trở thành DevOps Engineer.

## DevOps là gì

DevOps không có định nghĩa chính thức, cũng không có định nghĩa rõ ràng, nó
là một khái niệm mới tự dưng xuất hiện, chưa từng có trước đây.
Cách hiểu phổ biến nhất, đây là một "cách/quy trình phát triển và vận hành phần mềm".
Được sinh ra từ việc khắc nhập 2 chữ: DEVelopment (phát triển) - OPerationS (vận hành).

### Quy trình phát triển phần mềm truyền thống

Lập trình viên code, code xong chuyển qua cho SysAdmin cài đặt (deploy), QA sẽ
tham gia kiểm tra chất lượng, nếu OK, SysAdmins sẽ mang đi deploy trên hệ thống
chạy thật, nếu gặp lỗi / report bởi người dùng, SysAdmin sẽ chuyển lại cho
developer sửa. Vòng lặp quy trình này thường mất nhiều thời gian trong tất cả
các khâu, tối thiểu mỗi khâu mất 1 tuần.

Dev ---> SysAdmin deploy nội bộ ---> QA ---> Sysadmin deploy ----> Người dùng.
^-------------------------------------|--------------------------------|

Chú ý ở mô hình này, xảy ra một sự xung đột về lợi ích: Dev luôn muốn các tính
năng, code của mình được đưa tới người dùng nhanh nhất. SysAdmin luôn muốn
hệ thống ổn định nên sẽ không muốn mang code mới đi chạy (vì code mới luôn
có bug).

### Quy trình phát triển theo DevOps


Dev ---> DevOps --> QA ---> Người dùng
^----------|---------|----------|




Trong mô hình này, DevOps engineer thường thay thế SysAdmin truyền thống,
họ thường là các SysAdmin, nhưng có khả năng viết code tốt, sử dụng các phần mềm,
tích hợp chúng với hệ thống đã có để tự động hóa các quy trình.

Một chú ý quan trọng là: DevOps engineer thì phải biết code, nhưng không phải là
người code sản phẩm (không thay thế cho dev), mà code để tích hợp và tự động hóa
vận hành. Ở Việt Nam, nhiều công ty (lớn) học đòi làm DevOps,
cũng đăng tuyển DevOps
engineer, nhưng yêu cầu code sản phẩm, kiêm kèm vận hành, mong tuyển 1 làm 2,
trả lương 01.


## DevOps là làm những gì

Cần phân biệt rõ ràng, DevOps không phải là 1 chức danh, nó là một "quy trình",
một "cách thức". Kỹ sư thực hiện DevOps gọi là DevOps engineer.

Quy trình DevOps để phát triển 1 trang web thường bao gồm những thứ sau:
- Code phải được lưu trữ tập trung (sử dụng 1 VCS, ví dụ như Git, Mercurial), thường phổ
biến với việc dùng GitHub, GitLab, BitBucket. DevOps Engineer phải biết cách cài
đặt (GitLab), vận hành hay ít nhất là quản lý các công cụ này.
- Các thay đổi code cần được review - sử dụng GitLab Merge Request, GitHub Pull
Request, hay Gerrit CL
- Code sau khi review được merge vào, có một hệ thống sẽ chạy các chương trình
kiểm tra code mới / code cũ (test). Các chương trình này gọi là CI (continuous integration), phổ biến với các phần mềm như Jenkins, GitLab CI, TravisCI,
CircleCI, DroneCI... Đồng thời, việc phát triển phần mềm có thêm yêu cầu phải viết test
(unittest, integration test, end2end test...). Công đoạn này làm tăng tính đúng
đắn của code, giảm thiểu việc test phần mềm thủ công, QA... (giảm, chứ không
cắt hoàn toàn).
- Sau khi code đã được test, được đóng lại thành "sản phẩm" sẵn sàng để mang đi deploy. Sản phẩm này có thể đơn giản là code (như python) được đánh tag / version, hay các artifact thu được sau khi build (như Java).
- Sản phẩm được mang deploy trên một (hoặc 2 3) môi trường nội bộ, thường gọi là staging, hay QA environment, việc này cần làm liên tục, tự động ngay sau khi
các bước trước đã hoàn thành, nên thường sử dụng các phần mềm gọi là CD
(continuous delivery), như Spinnaker, GoCD, Jenkins... kết hợp với các Configuration
Management tool để cài đặt phần mềm/ quản lý file cấu hình như SaltStack, Chef, Puppet,
Ansible. Giai đoạn này thường là phức tạp nhất, đòi hỏi các chương trình test
kiểm tra phần mềm "như thật", sử dụng cả test thủ công, load test xem hiệu năng
có đảm bảo, etc... các hệ thống monitor/logging cũng được cài đặt trên hệ thống
này để theo dõi quy trình.
- Nếu giai đoạn trên thành công, sản phẩm sẽ được đưa tới công đoạn cuối cùng:
production deploy, tức tương tự như bước trên, nhưng thực hiện trên môi trường chạy thật. Giai đoạn này khá nhạy cảm, bởi dù
có chạy trăm, ngàn test, cũng không đảm bảo được rằng hệ thống sẽ không có bug
gì. Vậy nên quy trình này đòi hỏi: khả năng quay lại phiên bản cũ nếu có lỗi gì
(gọi là rollback), các chiến thuật deploy để chỉ ảnh hưởng tới một phần người dùng
(blue/green, canary). Hệ thống monitor và kỹ sư phải trực tiếp theo dõi, sử dụng
các công cụ nhận biết sự bất thường (abnormal detection), ví dụ lượng người dùng
giảm, lượng response code 500 tăng ... hay dùng mắt thường để theo dõi các đồ thị.
Hệ thống logging/alert/metric monitor đóng vai tròn quan trọng trong giai đoạn này
thường sử dụng các phần mềm như: Graylog2, ELK, TICK stack, Grafana, Prometheus,
... hay thậm chí là Nagios cổ xưa, gì cũng được, có còn hơn không.

Quy trình nói trên, rõ ràng không phải là một quy trình đơn giản, đòi hỏi phải
sử dụng các phần mềm chuyên dụng, viết các đoạn code tích hợp các phần mềm lại
với nhau thành một quy trình thống nhất, linh hoạt, đòi hỏi DevOps engineer
phải có nhiều kỹ năng không hề tầm thường (vậy nên lương thường rất cao).

### Big note

Quy trình nói trên, rõ ràng không thể chỉ do một (nhóm) người mà làm được,
nó đòi hỏi có sự hỗ trợ, thay đổi tư duy, văn hóa, quy trình ở toàn bộ phòng ban, thậm chí cả công ty.

### Các kỹ năng, tool cho DevOps engineer

- Kỹ năng cài đặt, bảo trì, cấu hình, vận hành phần mềm trên server (thường là Linux, vd Ubuntu).
Hay nói cách khác, DevOps engineer cần phải là một sysadmin trước.
HOẶC: nếu công ty nhiều tiền/startup được hỗ trợ thì đi dùng các dịch vụ có sẵn,
lúc đó giảm bớt được kỹ năng cài đặt,
chỉ còn phải cấu hình cho phù hợp với nhu cầu.
- Kỹ năng code (viết script): bash là yêu cầu tối thiểu phải có, thành thạo CLI,
tuyệt nhất là thành thạo thêm một ngôn ngữ như Python, Ruby hay Golang.
- Kỹ năng troubleshooting: mọi thứ không bao giờ hoạt động trơn chu như ta mong
muốn, luôn cần thành thạo các công cụ troubleshooting như đọc log, strace, lsof,
tcpdump hay wireshark... và khả năng biết Google tìm kiếm.
- Kỹ năng tự học/đọc tài liệu: với lượng công cụ khổng lồ nói trên, không ai có
thể đi học đâu đó rồi về mà làm ngay được, bạn cần phải có khả năng tự tìm hiểu, tự đọc tài liệu.
- Thành thạo một CM: SaltStack, Ansible, Chef hay Puppet
- Cài đặt cấu hình CI/CD: thành thạo 1 phần mềm như Jenkins hay GitLabCI
- Sử dụng 1 công cụ monitor log (Graylog2/ELK) và metric monitor (Grafana, Prometheus hay TICK)
- Sử dụng 1 public cloud (AWS, Google Cloud, Azure, Digital Ocean, Linode, etc...) một cách thủ công và tự động với tool (pulumi, terraform, cloudformation, salt-cloud,...) và tự viết script (gọi cloud API, boto3, azure API ...)

Trên đây là các yêu cầu cứng và dễ dàng biến đổi (VD công ty yêu cầu Ansible mà
thành thạo SaltStack hay Chef thì coi là tương đương, chỉ mất 1 2 tháng để chuyển
đổi), còn yêu cầu CỤ THỂ, thì tùy thuộc vào từng yêu cầu
của từng công ty (tốt nhất là nếu bạn thích làm ở công ty nào thì mở Job Description tuyển dụng của công ty đó ra mà xem).

Các yêu cầu như Terraform, CloudFormation, Kubernetes, Docker... là các yêu cầu mềm, có thì
tốt, không có thì vào học mất 1 2 tháng là làm okie.

### Làm sao để kiếm việc

Theo mô tả công việc ở trên, DevOps engineer sờ vào toàn bộ công đoạn phát triển phần mềm, chạm tới cả hệ thống sản phẩm mà khách hàng sử dụng - tức là tiền - tức là quan trọng - tức là đòi hỏi phải có kinh nghiệm chứ không ai dại đưa hệ thống kiếm tỷ đồng hàng ngày vào tay một người chưa biết gì, đang tập sự.

DevOps engineer không tự sinh ra, không tự mất đi, chỉ chuyển từ công ty này sang công ty khác, từ vị trí SysAdmin hay Backend Dev qua. Vì vậy để kiếm một vị trí này, bạn có thể nhắm tới các startup nhỏ, hệ thống chưa có gì, hoặc nhảy sang từ SysAdmin hay backend dev.

Hoặc nhiều khi do hên xui, cứ lấy JD muốn làm, nộp vào, phỏng vấn, không ai biết trước được chữ ngờ!

### Note cuối bài

DevOps không phải khái niệm được định nghĩa rõ ràng, đúng sai, vậy nên nhỡ công
ty bạn làm khác với công ty khác, không có nghĩa là bạn hơn hay kém, hay đúng
hay sai gì ở đây.

### Tham khảo

- https://martinfowler.com/bliki/DevOpsCulture.html
- https://aws.amazon.com/devops/what-is-devops/

Bài viết được viết để giải đáp thắc mắc của một học viên Python tại PyMi khóa HCM 1903.

Hết.
HVN at https://pymi.vn and https://www.familug.org.

4 comments: