Giai đoạn 8 - 13
Xin chào! Cuối cùng thì sau rất nhiều nỗ lực sắp xếp thời gian thì mình đã có mặt ở đây để có thể làm những điều mình thích rồi - viết lách.
Và cũng do không có nhiều thời gian nên mình sẽ không viết chuyên sâu vào những chủ đề còn lại - thay vào đó mình sẽ tổng hợp những nội dung chính của những chủ đề này và để lại cho các bạn tự tìm hiểu thêm.
Rồi, mình bắt đầu những chặng đường cuối cùng nhé!
Mời mọi người chuyển sang các thẻ khác nhau để theo dõi hành trình này.
Giai đoạn 8 - Kubernetes
Section titled “Giai đoạn 8 - Kubernetes”Kubernetes nói một cách đơn giản, chính là bản nâng cấp của Docker. Nếu so về độ mở rộng thì Kubernetes có phần nhỉnh hơn Docker một chút - đặc biệt là tính tự động mở rộng khi tăng/giảm tải người dùng.
Kubernetes có thể sắp xếp các container thành các cụm (cluster) theo trạng thái mong muốn. Đây là một đặc trưng của Điều phối container - thuật ngữ chỉ việc quản lý và tự động hóa việc triển khai, mở rộng và vận hành vòng đời các ứng dụng container.
Tất nhiên, điều phối container có thể dùng nhiều hơn một công cụ: Chúng ta có cả Docker Swarm, Apache Mesos, HashiCorp Nomad, nhưng Kubernetes là công cụ phổ biến nhất hiện nay. Trang web chính thức thức của Kubernetes tại đây là một trong những nơi tốt nhất để tìm hiểu về Kubernetes.
Kubernetes (K8s) là gì?
Section titled “Kubernetes (K8s) là gì?”Kubernetes là một nền tảng mã nguồn mở, di động, có thể mở rộng để quản lý khối lượng công việc và dịch vụ được chạy trên container, hỗ trợ cả cấu hình khai báo và tự động hóa. Nó có một hệ sinh thái lớn, phát triển nhanh chóng. Các dịch vụ, hỗ trợ và công cụ Kubernetes được phổ biến rộng rãi.
Kubernetes là một dự án mã nguồn mở được Google phát triển và hiện đang được Cloud Native Computing Foundation (CNCF) duy trì. Kubernetes cung cấp các tính năng sau đây như một dạng của Điều phối containers.
- Phát hiện dịch vụ và cân bằng tải: K8s có thể mở truy cập một container bằng cách sử dụng DNS hoặc địa chỉ IP của chúng. Nếu lưu lượng truy cập vào container cao, K8s có thể cân bằng tải và điều phối lưu lượng mạng để quá trình triển khai được ổn định.
- Điều phối lưu trữ: K8s cho phép bạn tự động gắn hệ thống lưu trữ mà bạn chọn, chẳng hạn như lưu trữ cục bộ hoặc các dịch vụ lưu trữ sử dụng điện toán đám mây công cộng,…
- Tự động triển khai: Bạn có thể mô tả trạng thái mong muốn cho các containers đã triển khai của mình bằng K8s và nó có thể thay đổi trạng thái với tốc độ được kiểm soát. Ví dụ, bạn có thể tự động hoá K8s để tạo container mới cho quá trình triển khai của mình, xoá container hiện có và sử dụng tất cả các tài nguyên của chúng ta cho container mới được tạo.
- Đóng gói tự động: Bạn cung cấp cho K8 một cụm gồm nhiều nút (nodes) mà nó có thể sử dụng để chạy các tác vụ được đóng gói trong các containers. Bạn cho K8s biết lượng CPU và bộ nhớ (RAM) mà mỗi container cần. K8s có thể sắp xếp các containers và các nodes của bạn để có thể tận dụng các tài nguyên một cách tốt nhất.
- Tự phục hồi: K8s khởi động lại các container bị lỗi, thay thế các container, xoá bỏ các container không phản hồi các bài kiểm tra do người dùng quy định và không sử dụng các container cho các yêu cầu từ người dùng cho đến khi chúng ở trạng thái sẵn sàng.
- Quản lý cấu hình và khóa bí mật: K8s cho phép bạn lưu trữ và quản lý thông tin nhạy cảm, chẳng hạn như mật khẩu, OAuth tokens hoặc khóa SSH. Bạn có thể triển khai và cập nhật các giá trị bí mật cũng như cấu hình ứng dụng mà không cần xây dựng lại bản ảnh container cũng như không để lộ các giá trị đó trong cấu hình hệ thống của bạn.
K8s giúp triển khai các ứng dụng theo dạng phân tán và có thể mở rộng một cách tốt nhất.
Cấu trúc của Kubernetes
Section titled “Cấu trúc của Kubernetes”K8s phân lập các thành phần của máy chủ thành những phần nhỏ hơn, mỗi phần có một chức năng riêng biệt.
Cụm (Cluster)
Section titled “Cụm (Cluster)”Bao gồm các nút khác nhau, mỗi nút có thể là một máy chủ thật/ảo. Mỗi cụm sẽ có một Control Plane với những thành phần nhỏ như sau.
Các thành phần con của Control Plane
Section titled “Các thành phần con của Control Plane”Máy chủ Kube API
Section titled “Máy chủ Kube API”Máy chủ Kubernetes API xác thực và định cấu hình dữ liệu cho các đối tượng API bao gồm các hạt, các dịch vụ, các bộ xử lý tạo lập và các đối tượng khác. Máy chủ API phụ vụ các tác vụ REST (đọc/ghi) và cung cấp giao diện người dùng cho các trạng thái được chia sẻ của cụm qua đó tất cả các thành phần khác có thể tương tác. Đại loại như một cổng API để các nút khác trong cụm có thể giao tiếp với nhau.
Để tương tác với API này, thường người ta sẽ sử dụng kubectl.
Bộ lập lịch
Section titled “Bộ lập lịch”Một quy trình của control plane lập lịch các hạt cho các nút. Bộ lập lịch sẽ xác định nút nào là vị trí thích hợp cho từng hạt trong hàng đợi lập lịch theo các ràng buộc và tài nguyên sẵn có. Sau đó, sẽ xếp hạng từng nút hợp lệ theo thứ tự ưu tiên để gắn hạt vào một nút thích hợp. Nói đơn giản thì đây là nơi xác định vị trí các hạt chứa mã nguồn ứng dụng trong cụm.
Controller Manager
Section titled “Controller Manager”Là một trình chạy nền có các vòng điều khiển lõi được cài đặt cùng với Kubernetes. Trong các ứng dụng của người máy hoặc tự động hoá, vòng điểu khiển là một vòng lặp không kết thúc để điều chỉnh trạng thái của hệ thống. Trong K8s, bộ điều khiển là một vòng điều khiển theo dõi trạng thái được chia sẽ của cụm thông qua máy chủ API và thực hiện các thay đổi nhằm chuyển trạng thái hiện tại sang trạng thái mong muốn.
Kho lưu trữ dạng cặp khóa-giá trị có tính nhất quán và độ sẵn sàng cao được sử dụng để lưu trữ toàn bộ cấu hình, trạng thái của cụm K8s.
Nút (Node)
Section titled “Nút (Node)”Có hai loại nút chính trong K8s.
- Control Plane (tầng điều khiển): Là nút điều khiển, nơi mà các thành phần của K8s chạy. Control Plane có thể chạy trên một hoặc nhiều máy chủ. Control Plane đưa ra quyết định về việc triển khai, lập lịch và theo dõi cụm K8s.
- Worker Node (tầng làm việc): Là nút làm việc, nơi mà các ứng dụng chạy. Worker Node có thể chạy trên một hoặc nhiều máy chủ (thật hoặc ảo). Mỗi nút có thể chứa nhiều hạt (pod) và được quản lý bởi Control Plane.
Các thành phần con của Nút
Section titled “Các thành phần con của Nút”kubelet
Section titled “kubelet”Một agent chạy trên mọi nút trong cụm. Nó đảm bảo rằng các containers đang được chạy trong hạt. Kubelet nhận một bộ PodSpecs được cung cấp thông qua các cơ chế khác nhau và đảm bảo rằng các vùng chứa được mô tả trong các PodSpec đó đang chạy và hoạt động tốt.
Kubelet không quản lý các containers không được tạo bởi K8s.
kube-proxy
Section titled “kube-proxy”Là một mạng ảo mạng chạy trên mỗi nút trong cụm, triển khai một phần của khái niệm Dịch vụ K8s. kube-proxy duy trì các quy tắc mạng trên các nút. Các quy tắc mạng này cho phép giao tiếp mạng với các hạt từ các phiên bên trong hoặc bên ngoài cụm.
kube-proxy sử dụng lớp lọc gói tin của hệ điều hành nếu có thể. Nếu không, kube-proxy tự chuyển tiếp lưu lượng mạng.
Runtime
Section titled “Runtime”Là phần mềm chịu trách nhiệm chạy các containers. K8s hỗ trợ một số container runtimes Docker, containerd, CRI-O và Kubernetes CRI (Container Runtime Interface).
Hạt (Pod)
Section titled “Hạt (Pod)”Hạt là đơn vị triển khai nhỏ nhất trong K8s. Một hạt có thể chứa một hoặc nhiều containers, các hạt có thể chia sẻ các tài nguyên như IP, cổng, bộ nhớ và tệp hệ thống. Hạt có thể được triển khai trên một hoặc nhiều nút trong cụm. Hạt mang tính tạm thời, có thể được tạo ra theo chiều ngang bởi ReplicaSet (tập mở rộng) hoặc bị xóa bất cứ lúc nào khi gặp lỗi, và các hạt chia sẻ chung không gian tên mạng.
K8s sử dụng nhãn (cặp khóa - giá trị) để xác định các hạt và các đối tượng khác trong cụm.
Mỗi hạt có thể xử lý bộ nhớ, giá trị biến môi trường, cổng và các thông số khác nhau. Các hạt giống nhau chạy cùng mã nguồn container trên các nút làm việc (worker node) trong cụm.
Các thành phần liên quan của Hạt
Section titled “Các thành phần liên quan của Hạt”Deployments (Tệp triển khai)
Section titled “Deployments (Tệp triển khai)”Mỗi hạt đều có một tệp triển khai, tệp này chứa các thông tin cho phép hạt chạy liên tục và tự khởi động lại khi gặp lỗi.
ReplicaSet (Tập mở rộng)
Section titled “ReplicaSet (Tập mở rộng)”Mỗi tệp triển khai có thể cho ra một tập mở rộng, giúp xác định số hạt mong muốn.
StatefulSets (Tập trạng thái)
Section titled “StatefulSets (Tập trạng thái)”Cho phép lưu giữ trạng thái ứng dụng - chẳng hạn như Cơ sở dữ liệu. Mỗi tập sẽ có một mã định danh duy nhất để hệ thống quản lý duy trì trong mỗi lần lập lịch đưa hạt vào nút.
DaemonSets (Tập Daemon)
Section titled “DaemonSets (Tập Daemon)”Sử dụng cho các tiến trình liên tục như giám sát hay thu thập nhật trình. Mỗi hạt thuộc dạng này cũng có một mã định danh duy nhất để hệ thống quản lý duy trì trong mỗi lần lập lịch đưa hạt vào nút.
Mỗi tập Daemon sẽ tạo ra chỉ một hạt trên mỗi nút trong cụm. Nếu có thêm một nút mới được thêm vào cụm, K8s sẽ tự động tạo một hạt mới cho tập Daemon trên nút đó.
Dịch vụ (Service)
Section titled “Dịch vụ (Service)”Là một điểm đến duy nhất để truy cập các hạt, đây là một cách thống nhất để định tuyến lưu lượng truy cập đến một cụm và cuối cùng là các hạt. Bằng cách sử dụng tính năng này, các hạt có thể được bật/tắt mà không ảnh hưởng đến bất cứ dịch vụ khác.
Vẫn sẽ còn đó rất nhiều những thành phần khác trong K8s như ConfigMap, Secret, Ingress, Volume,… nhưng đây là những điều cơ bản nhất mà bạn cần biết về K8s. Nếu bạn muốn tìm hiểu sâu hơn về K8s, hãy tham khảo tài liệu chính thức tại phần dưới đây nhé.
Còn bây giờ thì xin hẹn gặp lại các bạn trong các bài viết sau! 👋
Giai đoạn 9 - Cơ sở hạ tầng dưới dạng mã (IaC)
Section titled “Giai đoạn 9 - Cơ sở hạ tầng dưới dạng mã (IaC)”Lỗi sai lớn nhất mà mình đã mắc phải trong cuộc đời là làm mọi thứ bằng tay, khi xung quanh có những công cụ tự động hóa. Sai sót do con người tạo ra, đôi khi là những lỗi rất nhỏ nhưng lại có thể dẫn đến những hậu quả rất lớn, nhất là về yếu tố tiền bạc.
Cơ sở hạ tầng dưới dạng mã (IaC) là cách tốt nhất giúp chúng ta triển khai các hạ tầng hệ thống một cách tự động, giảm thiểu những sai lệch không đáng có.
Ồ, thế hóa ra mọi thứ đều có thể viết mã nguồn được à?
Bài viết dưới đây sẽ giúp bạn có cái nhìn tổng quan về IaC, cũng như những công cụ phổ biến nhất hiện nay, trong đó có Terraform.
Tính thân thiện với con người
Section titled “Tính thân thiện với con người”Đây là một quy trình thực hiện các tác vụ khởi tạo liên quan đến máy chủ.
- Triển khai máy ảo. Trước khi có công nghệ ảo hóa thì sẽ là các máy chủ vật lý và cài đặt hệ điều hành
- Cài đặt, cấu hình mạng
- Cài đặt, cấu hình bảng định tuyến
- Cài đặt các phần mềm, thư viện cần thiết và cập nhật chúng
- Cấu hình phần mềm
- Cài đặt cơ sở dữ liệu
Trước đây, một kỹ sư hệ thống sẽ phải thực hiện tất cả các bước trên bằng tay. Điều này dẫn đến việc có thể xảy ra những sai sót trong quá trình thực hiện, và nếu có nhiều máy chủ thì việc này sẽ rất tốn thời gian. Hơn nữa, việc thực hiện thủ công không đảm bảo tính nhất quán giữa các máy chủ, dẫn đến khó khăn trong việc quản lý và bảo trì.
Cụ thể những tác vụ sau đây sẽ được thực hiện bằng tay trong quá trình bảo trì.
- Cập nhật các phiên bản mới
- Triển khai các phiên bản mới này
- Quản lý dữ liệu
- Khôi phục ứng dụng nếu có sự cố
- Loại bỏ, thêm/bớt và mở rộng các máy chủ, tài nguyên phần cứng trong trường hợp cần thiết
- Cấu hình mạng
Nếu những việc này lặp đi lặp lại cho nhiều môi trường khác nhau thì sẽ là một cơn ác mộng.
Cơ sở hạ tầng dưới dạng mã (IaC) là một giải pháp giúp tự động hóa các tác vụ này. Chúng ta có thể viết mã nguồn và chả cần phải quan tâm đến việc triển khai nó như thế nào, dịch vụ có tên là gì. Cứ theo đúng mã nguồn mà chạy thôi.
IaC được sử dụng ở hầu hết mọi nền tảng, công nghệ ảo hóa, công nghệ điện toán đám mấy và công nghệ ứng dụng khai thác lợi ích của điện toán đám mây (Cloud Native) như Kubernetes hay containers.
Khởi tạo hạ tầng
Section titled “Khởi tạo hạ tầng”Trên thực tế, có rất nhiều công cụ khác nhau để thực hiện IaC. Một số công cụ phổ biến nhất hiện nay là Terraform, Ansible, Chef, Puppet,… Các công cụ này sẽ có thể thực hiện những tác vụ như sau.
- Khởi tạo máy chủ mới
- Cấu hình mạng máy tính
- Cấu hình bộ cân bằng tải ứng dụng
- Cấu hình ở mức hạ tầng: Bao gồm việc cài đặt các ứng dụng, phần mềm theo yêu cầu lên máy chủ (các phần mềm để chạy được ứng dụng, Ví dụ: Python, Go…) và chuẩn bị hàng loạt máy chủ để triển khai ứng dụng (lặp lại các bước trên trên rất nhiều máy chủ).
Triển khai phần mềm
Section titled “Triển khai phần mềm”Sau khi bốn bước trên được thực hiện, chúng ta sẽ có một hạ tầng hoàn chỉnh để triển khai ứng dụng. Các ứng dụng sẽ được triển khai theo quy trình sau.
- Triển khai, quản lý ứng dụng (bao gồm ứng dụng, thư viện hỗ trợ)
- Bảo trì ứng dụng
- Cập nhật phần mềm (cũng có thể là các thư viện phụ thuộc)
- Xác định lại cấu hình trong trường hợp cần thiết
Phân loại các công cụ IaC
Section titled “Phân loại các công cụ IaC”Có thể phân loại các công cụ IaC thành hai loại chính như sau.
- Công cụ IaC theo dạng Khai báo (Declarative IaC): Là những công cụ mà bạn chỉ cần khai báo trạng thái mong muốn của hạ tầng, và công cụ sẽ tự động thực hiện các bước cần thiết để đạt được trạng thái đó. Ví dụ: Terraform, CloudFormation.
- Công cụ IaC theo dạng Trình tự (Procedual IaC): Là những công cụ mà bạn cần chỉ định từng bước cụ thể để đạt được trạng thái mong muốn. Ví dụ: Ansible, Chef, Puppet.
Các công cụ này có thể tạo ra các tệp cấu hình cho các tài nguyên hạ tầng khác nhau, những tài nguyên có thể có những yếu tố sau.
- Tính khả biến: Có thể thay đổi cấu hình, thêm bớt tài nguyên. Vòng đời lâu dài.
- Tính bất biến: Không thay đổi cấu hình, không thể thay đổi tài nguyên, chỉ có xóa bỏ/tạo mới. Vòng đời ngắn.
Ví dụ điển hình là xô S3 của AWS. Chúng ta có thể tạo ra một xô S3 với tên là bucket-1
, không thể thay đổi tên
của nó, nhưng có thể thay đổi nhãn (tag) của nó. Còn nếu so với bản ảnh container, chúng ta chỉ có thể thay mới
bản ảnh sau khi cập nhật mã nguồn.
Không có công cụ nào là tốt nhất, mà chỉ có công cụ phù hợp nhất với nhu cầu của bạn.
Nếu bạn muốn khởi đầu với IaC, hãy bắt đầu với Terraform. Đây là một công cụ mã nguồn mở, dễ sử dụng và có cộng đồng lớn. Có rất nhiều tài liệu và hướng dẫn ở đường dẫn phía dưới để bạn có thể tham khảo. Tất nhiên chúng ta sẽ không thể đi sâu vào Terraform vì thời gian không cho phép. Nhưng hy vọng bạn sẽ tìm thấy những thông tin hữu ích trong bài viết này.
Tài liệu tham khảo 📚
Section titled “Tài liệu tham khảo 📚”Mời mọi người chuyển sang trang này để theo dõi tất cả tài liệu liên quan trong giai đoạn 8-13, để giúp bản thân có được những tài liệu hữu ích về các chủ đề khác nhau trong làm việc với DevOps.
Giai đoạn 8-13 - Tham khảoĐây cũng là phần kết cho series này - tuy không dài nhưng hy vọng mọi người cũng đã thưởng thức phần nào series. Sẽ còn đó rất nhiều những nội dung hấp dẫn khác, mời mọi người cũng đón chờ nhé. Tạm biệt mọi người!!! 🚀