Những điều bạn cần biết để trở thành DevOps Engineer
Bài đăng này đã không được cập nhật trong 3 năm
Getting Started
Một vài năm về trước, công việc của 1 DevOps khá đơn giản, ta có thể hiểu là họ chỉ cần cấu hình các package cần thiết trên server. Nhưng giờ đây nó trở nên phức tạp hơn với sự phát triển mạnh mẽ của công nghệ container, DevOps engineer có xu hướng phải bắt tay vào code nhiều hơn.
Lộ trình (roadmap) để trở thành một DevOps engineer, người có khả năng làm việc và vận hành được ở trong một công ty lớn đòi hỏi sự hiểu biết sâu rộng về nhiều công cụ (tools) cũng như công nghệ:
- Basic: kiến thức cơ bản về hệ điều hành (Operating System), Scripting, Networking, Security
- Source Control (Git, SVN, Mercury, GitHub)
- Continuous Integration (Jenkins, CircleCI, TeamCity, Travis CI, Drone )
- Cloud Provider (AWS, Azure, GoogleCloud, Heroku, Digital Ocean)
- Web Server (Apache, Nginx, IIS, Tomcat, etc )
- Infrastructure as Code (Docker, Ansible, Kubernetes, Terraform, etc)
- Log Management (ELK Stack, Graylog, Splunk, Papertrail, etc)
- Monitoring (Nagios, Icinga, Datadog, Zabbit, Monit)
Trách nhiệm của một DevOps engineer không chỉ xoay quanh việc thực thi automation pipelines, tối ưu computing architecture, để ý system test để bảo mật, quản lý cloud platforms, monitor hệ thống mà còn cộng tác với cả đội phát triển,...
Khoảng 20 đến 30 năm về trước, công việc của system administrator và developer là độc lập. Nhưng ngày nay khi developer có những servers chạy trên chính máy cá nhân của họ trong docker container hoặc máy ảo (virtual machine) thì việc setup servers trở nên dần quen thuộc đối với developer.
Muốn trở thành một fullstack developer, bạn không nhất thiết phải theo tất cả các bước ở phía trên, bạn hãy chọn một phần nhỏ trong các công cụ phía trên để quản lý lúc đầu và dần quen sẽ trau dồi kiến thức dần.
Hosting (Ubuntu)
Có khá nhiều dịch vụ hosting hiện nay cho bạn lựa chọn: shared hosting, virtual private server (VPS), dedicated hosting, application hosting, ...
Bạn cũng có thể dùng platform as a services (PaaS) như Heroku, Now.sh, Netlify để build, chạy và quản lý ứng dụng của mình mà không cần quan tâm đến những thao tác build phức tạp và maintain kiến trúc hạ tầng (infrastructure) đặc thù.
Cá nhân tôi (tác giả) thì thích sử dụng VPS hơn, bởi vì tôi muốn tự mình kiểm soát mọi thứ trên server và tối ưu chi phí. PaaS thì sẽ tiết kiệm thời gian cho bạn hơn nhưng sẽ phát sinh nhiều chi phí hơn khi scaling app hay những thứ nhỏ nhặt khác.
Một server operating system (server OS) là một dạng của hệ điều hành nó được thiết kế để cài đặt và sử dụng trên 1 server computer. Nó là một dạng advanced version của 1 OS, có đầy đủ tính năng và khả năng thiết yếu trong phạm vi 1 client - server architecture hoặc tương tự enterprise computing environment.
Một vài ví dụ phổ biến về server OS gồm CentOS, Fedora, Ubuntu, Debian, FreeBSD, CoreOS hoặc Windows Server. Ubuntu được biết đến phổ biến nhất cho hệ điều hành Linux và nó cũng là hệ điều hành mà tôi yêu thích, nó có nhiều packages hơn những distributions khác. Nó cũng là một sự lựa chọn theo chủ quan vì tôi đã có kinh nghiệm làm việc với Ubuntu desktop trước đó.
Bạn sẽ không thể tìm thấy một DevOps nào mà lại không biết viết Bash script. Đó là điều bắt buộc cần phải có. Đó là điều cơ bản của OS level programming. Dựa vào nó bạn có thể làm được nhiều thứ ở OS và sẽ là một sức mạnh khôn lường cho những ai biết cách dùng nó.
Security is important. Đây là điều bắt buộc, bạn phải tuân thủ theo security checklist trong việc config server như: root user, basic firewall, SSH authentication, security update,... Attacker sẽ thường xuyên tìm ra những lỗ hổng bảo mật (unpatched flaws) hoặc thử access những tài khoản mặc định, unused pages, unprotected files,... để tìm cách truy cập hoặc tìm hiểu về hệ thống của bạn.
Web Server (Nginx)
Web server sẽ lưu trữ và deliver content cho 1 website như text, images, video, và dữ liệu của ứng dụng tới clients. Loại client phổ biến nhất đó chính là trình duyệt web (web browser), nơi mà người dùng dùng để request dữ liệu từ web site khi mà họ click vào 1 link hoặc download 1 tài liệu trong page đang hiển thị trên browser.
Một web server giao tiếp với 1 web browser thông qua giao thức HTTP. Nội dùng của hầu hết các web pages được encode trong HTML. Nội dung có thể là tĩnh như text, images hoặc động như là tính giá cả hoặc list items mà khách hàng chọn để mua. Để deliver dynamic content, hầu hết web server đều hỗ trợ server-side scripting languages để encode business logic trong việc giao tiếp. Các ngôn ngữ được hộ trợ bao gồm ASP, Javascript, PHP, Python, Ruby.
Nginx và Apache là 2 web server phổ biến. Sự khác nhau chính giữa Apache và Nginx nằm ở design architect của chúng. Apache sử dụng process-drivent approach và tạo một thread cho mỗi request. Trái lại thì Nginx sử dụng event-driven architecture cho việc xử lý nhiều request trong 1 thread.
Nginx là một open-source web server, vì nó thành công trong việc đóng vai trò như là một web server như hiện tại nhưng nó còn có thể dùng là 1 reverse proxy, HTTP cache và load balancer.
Nginx có một kiến trúc lightweight và nhanh hơn so với Apache, trang bị tốt hơn cho serve static content và nó dùng module ngoài để xử lý dynamic content.
CI/CD (CircleCI)
Microserviecs architecture đã đẩy DevOps lên phía trước. Mọi thứ trước đây hầu hết là sức cơm. Hiện tại thì containeriation đã nâng tầm DevOps lên và họ có khả năng deploy nhanh chóng. Bạn có thể tự động hóa được khá nhiều tasks và khiến mọi thứ trở nên dễ dàng hơn trước.
Team bạn thường xuyên tranh luận về vấn đề làm sao để đưa sản phẩm tới tay của khách hàng bởi vì thiếu sự đồng nhất và sự kết hợp bằng cơm. Continuos integration (CI) và continuos delivery (CD) giúp cho việc này trở nên nhanh chóng, an toàn và đáng tin hơn.
Continuos Integration (CI) là một development practice, nó yêu cầu developer cần phải tích hợp code trong 1 shared repository thường xuyên. Mỗi lần checkin sau đó sẽ được verify thông qua một bản build tự động cho phép team bạn có thể phát hiện vấn đề sớm hơn. Bằng việc tích hợp đều đặn, bạn có thể phát hiện lỗi sớm hơn và tìm ra chúng dễ dàng hơn.
Continuos Delivery (CD) đã được biết đến khá nhiều và nó đã giải quyết được việc dễ dàng tự động khá nhiều trong bước deployment. Rất nhiều application landscape được thay thế với những platform tự động. DevOps đã chuyển dần từ khó định nghĩa một phương pháp sang 1 programmatic application.
CI/CD Pipeline là xương sống (backbone) của 1 môi trường DevOps hiện nay. Nó là cầu nối giữa development và operation team bằng việc tự động build, test và deploy app.
Một CI/CD tool được chọn, bạn phải chắc chắn rằng tất cả các biến môi trường được config phía bên ngoài ứng dụng. CI/CD tools cho phép setting những variable, masking chúng như password và account kyé và config chúng trong quá trình deployment cho môi trường cụ thể.
Jenkins, CircleCI, Travis CI là những tool phổ biến và chúng có những điểm mạnh và điểm yếu riêng. Vậy thì bạn nên chọn cái nào ? Nó phụ thuộc vào nhu cầu của bạn và kế hoạch sử dụng chúng.
Jenkins khá là phổ biến cho doanh nghiệp (enterprise) với sự đa dạng plugin nhưng hơi quá so với cá nhân và một team nhỏ vì nó yêu cầu 1 dedicated server và một khoảng thời gian cần thiết để configuration. Jenkins phù hợp cho những dự án lớn, dự án mà bạn cần customize nhiều.
Travis CI phù hợp cho những project open-source, nơi mà cần được test trên những môi trường khác nhau.
CircleCI là một cloud-based system và bạn không cần phải quản trị nó. Tuy nhiên, nó cũng offer premium cho phép bạn sử dụng trong 1 private cloud hoặc data center.
Containerization (Docker)
Containerization bao gồm việc bundle một ứng dụng với tất cả những file config, lib và dependencies cần thiết để có thể chạy hiệu quả và ko có bugs trên nhiều môi trường computing khác nhau. Nó đang là xu hướng hiện nay và sẽ còn phát triển mạnh.
Thay vì việc virtualizing ở tầng hardware như cách tiếp cận của máy ảo (virtual machine), containers virtualize ở tầng OS, với nhiều container chạy trực tiếp ở OS kernel. Điều này đem lại nhiều lợi ichs:
- Consistent Environment Container cho phép developer tạo một môi trường được định nghĩa, biết trước và độc lập khỏi các ứng dụng khác. Container có thể bao gồm các software dependencies cần thiết, ví dụ version của ngôn ngữ lập trình và các thư viện cần thiết.
- Run Anywhere Containers có khả năng chạy ở mọi hệ điều hành và dễ dàng để phát triển cũng như là deployment: Linux, Windows, và Mac OS. Ở máy ảo (virtual machines), máy local của developer hoặc ở data centers on-premises, public cloud.
- Isolation Containers ảo hóa CPU, bộ nhớ, storage, và network resources ở tầng OS, cho phép developer có cái nhìn tổng quan về OS độc lập theo từng ứng dụng.
Docker chắc chắn đang đón nhận được nhiều sự chú ý từ cộng đồng nhưng không chỉ có nó tiếp cận theo hướng container. Một vài container runtime khác như CoreOS rkt, Mesos, lxc,... đang phát triển khá mạnh
Docker compose là tool dùng để chỉ định, định nghĩa việc chạy nhiều container Docker app. Với Compose, bạn sử dụng một file YAML để config các service cho ứng dụng. Nó khá là phù hợp cho những ứng dụng vừa và nhỏ vì việc quản lý đơn giản hơn.
Kubernetes giúp cho các việc liên quan tới deploy và quản lý ứng dụng dễ dàng hơn. Kubernetes tự động rollout và rollback, quản lý status của service để ngăn chặn những rollout trước khi nó trở nên tồi tệ hơn. Kubernetes phức tạp hơn Docker Compose nhưng là cần thiết để quản lý số lượng lớn những cluster của ứng dụng cho việc scale và HA (high availibility.
References
All rights reserved