[Day 2] Một số kiến thức căn bản - Phần 2

Hiểu biết về hệ điều hành, đặc biệt là Linux:

Bạn sẽ cần hiểu được một số command Linux cơ bản, Linux filesystem,…

Một số tài nguyên học Linux:

Introduction to Linux:https://www.edx.org/course/introduction-to-linux

Introduction to Linux – Full Course for Beginners:https://www.youtube.com/watch?v=sWbUDq4S6Y8

Linux Server Course – System Configuration and Operation:https://www.youtube.com/watch?v=WMy3OzvBWc0

Networking căn bản

Network giống như chất keo kết nối mọi thứ lại với nhau trong thế giới máy tính. Hiểu biết về mạng là một lợi thế khi bạn tiếp cận với Cloud computing.

Một số tài nguyên tham khảo:

Computer Networking Full Course – OSI Model Deep Dive with Real Life Examples:https://www.youtube.com/watch?v=IPvYjXCsTg8

Networking Fundamentals:https://www.youtube.com/playlist?list=PLIFyRwBY_4bRLmKfP1KnZA6rZbRHtxmXi

How does the internet work? (Full Course):https://www.youtube.com/watch?v=zN8YNNHcaZc

Full HTTP Networking Course – Fetch and REST APIs in JavaScript:https://www.youtube.com/watch?v=2JYT5f2isg4

CCNA 200 – 301:https://www.youtube.com/watch?v=zNEpPOiGbuo&list=PLnaGQB5hLTI6nQP8MqlTCCJE3wc4g1Q0B&index=7

Free CCNA 200-301:https://www.youtube.com/watch?v=H8W9oMNSuwo&list=PLxbwE86jKRgMpuZuLBivzlM8s2Dk5lXBQ

Computer Networking Course:https://www.youtube.com/watch?v=qiQR5rTSshw

Series tổng quan về BGP – Thầy Lê Đức Phương:

Phần 1: https://www.youtube.com/watch?v=BZfd-TIr9Qc

Phần 2: https://www.youtube.com/watch?v=tnoC-cKwIu8

Phần 3: https://www.youtube.com/watch?v=cqy9MLjl9oY

Phần 4: https://www.youtube.com/watch?v=HWg8W5AylDg

Phần 5: https://www.youtube.com/watch?v=69WXLJYlg5U

Phần 6: https://www.youtube.com/watch?v=czZEvaPQ6ZY

Phần 7: https://www.youtube.com/watch?v=7_XAsvP-BKE

Phần 8: https://www.youtube.com/watch?v=0I0VAZjkDLo

Phần 9: https://www.youtube.com/watch?v=P-L9CNhjrUI

Phần 10: https://www.youtube.com/watch?v=oL456kn2NOc

Phần 11: https://www.youtube.com/watch?v=1aj3afDOYig

Phần 12: https://www.youtube.com/watch?v=MTEubb4cMto

Kiến thức về ảo hóa (virtualization, containerization):

Virtualization:

Là một công nghệ cho phép chạy nhiều hệ điều hành trên cùng một máy vật lý. Điều này có thể được thực hiện bằng cách sử dụng một phần mềm đặc biệt gọi là hypervisor. Hypervisor là một chương trình phần mềm chạy trên phần cứng của máy và phân bổ tài nguyên của máy cho các máy ảo (VM).

Mỗi VM là một máy tính độc lập, có hệ điều hành, ứng dụng và dữ liệu của riêng mình. Các VM có thể được chạy đồng thời trên cùng một máy vật lý, điều này cho phép bạn sử dụng hiệu quả tài nguyên của máy. Ví dụ: bạn có thể chạy một VM cho máy tính để bàn Windows, một VM cho máy chủ Linux và một VM cho máy chủ web Apache.

Phân loại ảo hóa:

Ảo hóa phần cứng

Dạng ảo hóa này cho phép tạo nhiều máy ảo trên môt máy chủ vật lý. Mỗi máy ảo chạy hệ điều hành riêng và được cấp phát các tài nguyên phần cứng như số xung nhịp CPU, ổ cứng và bộ nhớ… . Các tài nguyên của máy chủ có thể được cấp phát động một cách linh động tùy theo nhu cầu của từng máy ảo. Giải pháp này cho phép hợp nhất các hệ thống máy chủ cồng kềnh thành một máy chủ duy nhất và các máy chủ trước đây bây giờ đóng vai trò là máy ảo ứng dụng chạy trên nó.

Ảo hóa phần mềm

Ảo hóa mềm thực chất chỉ là sao chép bản sao của một hệ điều hành chính làm nhiều hệ điều hành con và cho phép các máy ảo ứng dụng có thể chạy trên nó. Như vậy, nếu hệ điều hành chủ là Linux thì cách ảo hoá này sẽ cho phép tạo thêm nhiều bản Linux làm việc trên cùng máy. Cách này có ưu điểm là chỉ cần một bản quyền cho một hệ điều hành và có thể sử dụng cho các máy ảo còn lại. Nhược điểm của nó là không thể sử dụng nhiều hệ điều hành khác nhau trên cùng một máy chủ.

Ảo hóa bằng cách huy động tài nguyên tạo ra tài nguyên lớn

Khi trong hệ thống IT có nhiều thiết bị vật lý riêng rẽ, độc lập với nhau về mặt vật lý (ví dụ các card mạng khác nhau, các máy chủ khác nhau, các tủ lưu trữ khác nhau), áp dụng ảo hóa sẽ cho ứng dụng nhìn thấy một nguồn tài nguyên chung, duy nhất được hợp thành từ những thiết bị độc lập. Không những chỉ nhìn thấy, ứng dụng còn được trao cho khả năng chia sẻ theo ý muốn nguồn tài nguyên hợp nhất đó mà không cần quan tâm đến vị trí vật lý thật sự của nguồn tài nguyên.

Ảo hóa bằng cách tách tài nguyên lớn thành các tài nguyên nhỏ

Trong môi trường làm việc (như các ứng dụng, hệ điều hành) được cài đặt về mặt vật lý tại các máy chủ lớn. Áp dụng các công nghệ ảo hóa, người sử dụng đầu cuối có thể dùng các ứng dụng trên máy trạm/laptop cá nhân giống như khi các ứng dụng được cài đặt ngay tại máy của họ. Nói cách khác, ảo hóa đã làm cho người sử dụng “nhìn thấy” rằng các ứng dụng đang được cài đặt và hoạt động trên máy cá nhân của họ, trong khi thực chất chúng được cài đặt trên các máy chủ tại trung tâm dữ liệu hay phòng máy chủ.

Chúng ta còn có một số cách phân loại ảo hóa khác, tùy thuộc vào phạm vi ảo hóa và mức độ tương tác giữa các tài nguyên ảo và vật lý:

  1. Ảo hóa máy chủ (Server virtualization):
    Ảo hóa máy chủ là quá trình tạo ra nhiều máy ảo trên một máy chủ vật lý duy nhất. Mỗi máy ảo sẽ có một hệ điều hành và các tài nguyên ảo riêng, giúp tận dụng tối đa khả năng sử dụng của máy chủ. Các máy ảo này hoạt động độc lập và có thể chạy các ứng dụng và hệ điều hành riêng biệt. Ví dụ: VMware ESXi, Microsoft Hyper-V.

  2. Ảo hóa ứng dụng (Application virtualization):
    Ảo hóa ứng dụng tách riêng ứng dụng từ hệ điều hành và môi trường máy chủ, cho phép chạy các ứng dụng trên nhiều hệ điều hành và máy chủ vật lý khác nhau mà không cần cài đặt lại ứng dụng. Các ứng dụng được đóng gói trong các container hoặc ảo hóa ứng dụng và có thể chạy độc lập với hệ điều hành chủ. Ví dụ: Docker, Kubernetes.

  3. Ảo hóa mạng (Network virtualization):
    Ảo hóa mạng tạo ra một mạng ảo trên cơ sở hạ tầng mạng vật lý. Nó cho phép phân chia, cô lập và quản lý các mạng ảo riêng biệt trên một mạng vật lý duy nhất. Ảo hóa mạng giúp cải thiện hiệu suất, bảo mật và quản lý mạng. Ví dụ: VMware NSX, Cisco ACI.

  4. Ảo hóa lưu trữ (Storage virtualization):
    Ảo hóa lưu trữ tạo ra một lớp trừu tượng hóa giữa các tài nguyên lưu trữ vật lý và các ứng dụng sử dụng chúng. Nó cho phép quản lý, phân phối và cấp phát tài nguyên lưu trữ dễ dàng và linh hoạt hơn. Ảo hóa lưu trữ cung cấp tính năng như đàn hồi, sao lưu, khôi phục và di chuyển dữ liệu giữa các hệ thống lưu trữ. Ví dụ: VMware vSAN, Microsoft Storage Spaces.

  5. Ảo hóa máy tính để bàn (Desktop virtualization):
    Ảo hóa máy tính để bàn cho phép tạo ra các máy tính ảo trên một máy tính cá nhân hoặc máy chủ trung tâm dữ liệu. Người dùng có thể truy cập vào các máy tính ảo này từ xa thông qua mạng và làm việc như trên một máy tính thực sự. Ảo hóa máy tính để bàn giúp tăng cường an ninh, quản lý dễ dàng và tăng tính linhhoạt của người dùng. Ví dụ: VMware Horizon, Citrix Virtual Apps and Desktops.

Hoặc:

  • Ảo hóa toàn phần (full virtualization): Ảo hóa toàn phần tạo ra một máy ảo hoàn chỉnh, bao gồm hệ điều hành, bộ nhớ, bộ xử lý và các tài nguyên khác của riêng nó. Các máy ảo toàn phần có thể chạy bất kỳ hệ điều hành nào, giống như chúng đang chạy trên phần cứng vật lý.

  • Ảo hóa phân vùng (hypervisor-based virtualization): Ảo hóa phân vùng chia nhỏ tài nguyên của máy chủ vật lý thành các phân vùng, mỗi phân vùng có thể chạy một hệ điều hành riêng. Các máy ảo phân vùng không độc lập như các máy ảo toàn phần, nhưng chúng hiệu quả hơn và có thể chạy nhiều máy ảo hơn trên cùng một máy chủ vật lý.

Dưới đây là bảng tóm tắt sự khác biệt chính giữa ảo hóa toàn phần và ảo hóa phân vùng:

Tính năngẢo hóa toàn phầnẢo hóa phân vùng
Độ độc lậpĐộc lậpKhông độc lập
Hệ điều hànhCó thể chạy bất kỳ hệ điều hành nàoCó thể chạy hệ điều hành tương thích với hypervisor
Hiệu suấtKhông hiệu quảHiệu quả
Số lượng máy ảoCó thể chạy một số máy ảo hạn chếCó thể chạy nhiều máy ảo

Lựa chọn loại ảo hóa phụ thuộc vào nhu cầu cụ thể của bạn. Nếu bạn cần chạy các hệ điều hành khác nhau, thì ảo hóa toàn phần là lựa chọn tốt hơn. Nếu bạn cần chạy nhiều máy ảo trên cùng một máy chủ vật lý, thì ảo hóa phân vùng là lựa chọn tốt hơn.

Virtualization có nhiều lợi ích, bao gồm:

  • Tăng hiệu quả sử dụng tài nguyên: Virtualization cho phép bạn chạy nhiều hệ điều hành trên cùng một máy vật lý, điều này giúp bạn sử dụng hiệu quả tài nguyên của máy.

  • Tăng tính linh hoạt: Virtualization cho phép bạn chạy các hệ điều hành khác nhau trên cùng một máy vật lý, điều này giúp bạn linh hoạt hơn trong việc lựa chọn hệ điều hành phù hợp với nhu cầu của mình.

  • Tăng tính bảo mật: Virtualization có thể giúp bạn tăng cường bảo mật cho hệ thống của mình bằng cách tách biệt các VM với nhau. Điều này giúp ngăn chặn các cuộc tấn công từ một VM lây lan sang các VM khác.

  • Giảm chi phí: Virtualization có thể giúp bạn giảm chi phí bằng cách cho phép bạn chạy nhiều hệ điều hành trên cùng một máy vật lý. Điều này giúp bạn tiết kiệm chi phí mua sắm phần cứng và chi phí vận hành.

Virtualization là một công nghệ quan trọng trong thế giới máy tính hiện đại. Nó cho phép bạn sử dụng hiệu quả tài nguyên của máy, tăng cường tính linh hoạt và bảo mật cho hệ thống của mình, và giảm chi phí.

Hypervisor: là phần mềm cho phép bạn chạy nhiều hệ điều hành trên cùng một máy vật lý. Hypervisor sẽ cung cấp một lớp ảo hóa cho phần cứng của máy vật lý, và sau đó tạo ra các máy ảo (VM) dựa trên lớp ảo hóa này. Mỗi VM sẽ có hệ điều hành, ứng dụng và dữ liệu riêng biệt. Các VM có thể được chạy đồng thời trên cùng một máy vật lý, điều này cho phép bạn sử dụng hiệu quả tài nguyên của máy.

2 loại hypervisor chính:

  • Hypervisor loại 1 (còn được gọi là hypervisor bare-metal) chạy trực tiếp trên phần cứng vật lý của máy chủ lưu trữ. Chúng là loại hypervisor hiệu quả nhất, nhưng chúng cũng yêu cầu phần cứng mạnh nhất. Ví dụ: VMware ESXi, Microsoft Hyper-V, Citrix XenServer.

  • Hypervisor loại 2 chạy trên một hệ điều hành hiện có. Chúng kém hiệu quả hơn hypervisor loại 1, nhưng chúng yêu cầu phần cứng kém mạnh mẽ hơn. Ví dụ: VMware Workstation, VirtualBox, Parallels Desktop.

Ngoài hypervisor loại 1 và loại 2, còn có một số hypervisor lai kết hợp các tính năng của cả hai loại. Ví dụ: VMware vSphere là một hypervisor lai có thể chạy như một hypervisor loại 1 hoặc một hypervisor loại 2.

Máy ảo (VM) và container là hai công nghệ ảo hóa khác nhau. Cả hai đều cho phép bạn chạy nhiều hệ điều hành trên cùng một máy vật lý, nhưng có những điểm khác biệt chính giữa chúng.

VM là những máy tính ảo hoàn chỉnh, có hệ điều hành, bộ nhớ, bộ xử lý và tài nguyên khác của riêng chúng. Chúng được tạo ra bằng cách chia nhỏ phần cứng vật lý của máy chủ thành các máy ảo riêng biệt. Mỗi máy ảo có thể chạy hệ điều hành và ứng dụng của riêng nó, và chúng có thể được truy cập và quản lý độc lập.

Container, mặt khác, không phải là những máy tính ảo hoàn chỉnh. Thay vào đó, chúng là những gói nhỏ gọn của mã và các phụ thuộc của nó, được đóng gói trong một tập tin duy nhất. Các container chia sẻ cùng một hệ điều hành với máy chủ vật lý, nhưng chúng có bộ nhớ và tài nguyên riêng. Điều này làm cho chúng nhẹ hơn và hiệu quả hơn VM.

Dưới đây là bảng tóm tắt sự khác biệt chính giữa VM và container:

Tính năngMáy ảoContainer
Độ độc lậpĐộc lậpKhông độc lập
Hệ điều hànhCó hệ điều hành riêngChia sẻ hệ điều hành với máy chủ vật lý
Bộ nhớBộ nhớ riêngChia sẻ bộ nhớ với máy chủ vật lý
Tài nguyênCó tài nguyên riêngChia sẻ tài nguyên với máy chủ vật lý
Kích thướcKhá lớnKhá nhỏ
Hiệu suấtKhông hiệu quảHiệu quả
Quản lýKhó quản lýDễ quản lý

Hãy cùng xem xét một số ưu và nhược điểm của VM và container:

Ưu điểm của VM:
– Độ độc lập cao: Các VM là những máy tính ảo hoàn chỉnh, có hệ điều hành, bộ nhớ, bộ xử lý và tài nguyên khác của riêng chúng. Điều này làm cho chúng rất linh hoạt và có thể được sử dụng để chạy nhiều hệ điều hành và ứng dụng khác nhau trên cùng một máy vật lý.
– Bảo mật cao: Các VM có thể được cô lập với nhau, điều này làm cho chúng trở thành một lựa chọn tốt cho việc chạy các ứng dụng nhạy cảm.
– Khả năng mở rộng cao: Các VM có thể được mở rộng dễ dàng bằng cách thêm tài nguyên cho máy chủ vật lý.

Nhược điểm của VM:
– Tốn kém: Các VM có thể tốn kém hơn container vì chúng đòi hỏi nhiều tài nguyên phần cứng hơn.
– Khó quản lý: Các VM có thể khó quản lý hơn container vì chúng là những hệ thống phức tạp hơn.

Ưu điểm của container:
– Hiệu quả: Các container rất hiệu quả vì chúng chia sẻ cùng một hệ điều hành với máy chủ vật lý. Điều này làm cho chúng sử dụng ít tài nguyên hơn VM và có thể chạy nhiều container trên cùng một máy vật lý.
– Dễ quản lý: Các container dễ quản lý hơn VM vì chúng là những hệ thống đơn giản hơn.
– Di động: Các container có thể dễ dàng được di chuyển từ máy chủ này sang máy chủ khác.

Nhược điểm của container:
– Độ độc lập thấp: Các container không độc lập như VM. Điều này có nghĩa là chúng có thể bị ảnh hưởng bởi các ứng dụng khác đang chạy trên cùng một máy chủ vật lý.
– Bảo mật thấp: Các container có thể dễ bị tấn công hơn VM vì chúng không được cô lập với nhau.
– Khả năng mở rộng thấp: Các container có thể khó mở rộng hơn VM vì chúng phụ thuộc vào hệ điều hành của máy chủ vật lý.

Hướng dẫn đơn giản để tạo một hệ thống ảo hóa bằng sử dụng một Type 2 hypervisor như Oracle VirtualBox trên máy tính cá nhân của bạn:

Bước 1: Chuẩn bị

  • Tải và cài đặt Oracle VirtualBox từ trang web chính thức của VirtualBox (https://www.virtualbox.org).

  • Tải bản ISO của hệ điều hành mà bạn muốn cài đặt trên máy ảo. Ví dụ: Ubuntu, Windows, CentOS, v.v.

  • Đảm bảo rằng bạn có đủ tài nguyên phần cứng (bộ xử lý, bộ nhớ, dung lượng đĩa) để chạy máy ảo.

Bước 2: Tạo máy ảo

  1. Mở VirtualBox và nhấp vào nút “New” hoặc “Tạo mới” để bắt đầu tạo máy ảo.

  2. Đặt tên cho máy ảo của bạn và chọn loại hệ điều hành mà bạn muốn cài đặt (Ubuntu, Windows, CentOS, v.v.).

  3. Chọn dung lượng RAM cho máy ảo. Đảm bảo bạn chỉ định một số lượng RAM hợp lý để máy ảo hoạt động mượt mà mà không ảnh hưởng đến hệ thống chính.

  4. Chọn “Create a virtual hard disk now” và nhấp “Create”.

  5. Chọn loại ổ cứng ảo mà bạn muốn sử dụng (VDI, VHD, VMDK) và chọn “Dynamically allocated” để chỉ cấp phát không gian đĩa cần thiết cho máy ảo khi cần.

  6. Đặt kích thước ổ cứng ảo cho máy ảo của bạn. Đảm bảo rằng bạn cung cấp đủ không gian để cài đặt hệ điều hành và ứng dụng trong máy ảo.

  7. Tạo máy ảo.

Bước 3: Cài đặt hệ điều hành trên máy ảo

  1. Chọn máy ảo bạn vừa tạo và nhấp vào nút “Start” hoặc “Bắt đầu”.

  2. Chọn tệp ISO của hệ điều hành bạn đã tải xuống trong phần “Storage” của máy ảo.

  3. Khởi động máy ảo. Quá trình cài đặt sẽ bắt đầu từ tệp ISO.

  4. Làm theo hướng dẫn trên màn hình để cài đặt hệ điều hành trên máy ảo. Quá trình này tùy thuộc vào loại hệ điều hành bạn chọn.

Bước 4: Sử dụng máy ảo
Sau khi cài đặt hoàn tất, bạn có thể sử dụng máy ảo bằng cách khởi động nó trong VirtualBox. Máy ảo sẽ chạy như một hệ thống độc lập trong cửa sổ riêng biệt trên máy tính của bạn.

Lưu ý: Để tạo một hệ thống ảo phức tạp hơn hoặc triển khai trong môi trường sản xuất, bạn có thể xem xét sử dụng Type 1 hypervisor như VMware ESXi hoặc Microsoft Hyper-V.

Tips:

Thay vì click bằng tay, bạn có thể xem xét tự động hóa bằng Vagrant. Mình có viết 1 bài hướng dẫn sử dụng Vagrant tạo máy ảo tại đây:

https://shinchan.asia/2023/03/19/chay-vm-tren-virtualbox-bang-vagrant/

Dưới đây là hướng dẫn đơn giản để tạo một container bằng Docker:

Bước 1: Chuẩn bị

  • Tải và cài đặt Docker từ trang web chính thức của Docker (https://www.docker.com).

  • Đảm bảo rằng bạn có đủ tài nguyên phần cứng (bộ xử lý, bộ nhớ) để chạy container.

Bước 2: Tạo Dockerfile

  1. Tạo một thư mục trống để làm việc.

  2. Trong thư mục đó, tạo một tệp văn bản mới và đặt tên là “Dockerfile” (không có phần mở rộng).

  3. Mở Dockerfile trong một trình soạn thảo văn bản và thêm các command sau:

# Chọn một hình ảnh cơ sở để xây dựng container
FROM ubuntu:latest

# Cài đặt các gói và phần mềm cần thiết trong container
RUN apt-get update && apt-get install -y <tên-gói-1> <tên-gói-2> ...

# Chạy một lệnh hoặc dòng lệnh trong quá trình xây dựng container
RUN <lệnh>

# Mở cổng cho các kết nối mạng đến container (nếu cần)
EXPOSE <port>

# Chạy một quá trình hoặc ứng dụng khi container được khởi chạy
CMD <lệnh>

Chú ý: Thay thế <tên-gói-1>, <tên-gói-2>, <lệnh>, <port> bằng các giá trị thực tế tùy thuộc vào yêu cầu của bạn.

Bước 3: Xây dựng container

  1. Mở cửa sổ terminal hoặc command prompt và di chuyển đến thư mục chứa Dockerfile.

  2. Chạy lệnh sau để xây dựng container từ Dockerfile:

docker build -t <tên-container> .

Lưu ý: Thay thế tên-container bằng tên bạn muốn đặt cho container của mình.

Bước 4: Chạy container

  1. Sau khi quá trình xây dựng hoàn tất, chạy lệnh sau để chạy container:
docker run -it <tên-container>

Lưu ý: Thay thế tên-container bằng tên bạn đã đặt cho container.

Container của bạn sẽ được chạy và bạn sẽ được đưa vào một môi trường dòng lệnh bên trong container.

Lưu ý: Để tùy chỉnh và triển khai container phức tạp hơn hoặc sử dụng nhiều công cụ khác nhau, bạn có thể xem xét sử dụng các công nghệ containerization khác như Kubernetes hoặc Docker Compose.

Tổng kết:

Khi nói đến điện toán đám mây, công nghệ ảo hóa đóng một vai trò quan trọng. Hãy tập thử nghiệm tự dựng các VM để nắm bắt cách thức hoạt động của một môi trường ảo hóa.

Tài nguyên tham khảo:

Virtualization Explained:https://www.youtube.com/watch?v=FZR0rG3HKIk

What is a Hypervisor?:https://www.youtube.com/watch?v=LMAEbB2a50M&list=RDCMUCKWaEZ-_VweaEx1j62do_vQ&index=3

Containers vs VMs: What’s the difference?:https://www.youtube.com/watch?v=cjXI-yxqGTI

Docker Tutorial for Beginners – A Full DevOps Course on How to Run Applications in Containers:https://www.youtube.com/watch?v=fqMOX6JJhGo&list=PLWKjhJtqVAbkzvvpY12KkfiIGso9A_Ixs

K8s tổng quan

Bắt đầu với k8s

Giới thiệu vè Docker

Docker là gì?

Docker là một container platform mã nguồn mở được tạo ra cho mục đích giúp việc tạo, deploy và chạy các app trở nên dễ dàng hơn bằng việc sử dụng các containers.

Container cho phép các lập trình viên đóng gói app cùng với các thành phần cần kiến, ví dụ như các thư viện hay các dependencies, sau đó giao nó cho người dùng dưới dạng một docker image.

Lúc này lập trình viên có thể đảm bảo rằng các app của mình sẽ chayj trên các máy hỗ trợ Docker. Docker containers đóng vai trò tương tự như các máy ảo, có thể cùng lúc chạy nhiều container trên một máy vật lý.

Docker dành cho ai?

Docker được thiết kế để giúp đỡ cho cả lập trình viên là sysadmin, nó cũng được coi là một phần của DevOps toolchain.

Với lập trình viên, họ sẽ có thể tập trung viết code mà không cần quá lo lắng về việc sẽ chạy trên máy nào, liệu máy đó có đảm bảo đủ dependecies để chạy hay không.

Với những người làm vận hành, Docker cung cấp cho họ sự linh hoạt và giảm thiểu số lượng máy vật lý cần thiết.

Mục đích của Docker là gì?

Chủ yếu là để tập trung tự động hóa việc deploy các application và tự đông hóa việc ảo hóa.

Docker thì nhẹ hơn VM do không chứa phần OS mà share chung Kernel với máy vật lý, nên tốc độ khởi chạy cũng nhanh hơn máy ảo. Docker cũng có thể tích hợp với nhiều tool, có thể kể đến:

  • AWS

  • GCP

  • Azure

  • K8s

  • OpenStack

  • OpenSVC

  • Ansible

  • Chef

  • Jenkins

  • Puppet

  • Vagrant

  • VMWare vSphere

Phân biệt container và VM

Chi tiết về sự khác biệt, bạn có thể xem thêm tại đây: cloudacademy.com/blog/docker-vs-virtual-mac..

DockerVirtual Machines (VMs)
Boot-TimeKhởi động trong vài giây.Phải mất vài phút để máy ảo khởi động.
Runs onDockers tận dụng execution engine.VMs tận dụng hypervisor.
Memory EfficiencyKhông cần dung lượng để ảo hóa, do đó ít bộ nhớ hơn.Yêu cầu phải tải toàn bộ hệ điều hành trước khi khởi động, do đó kém hiệu quả hơn.
IsolationKhông cách ly hoàn toàn, vẫn sử dụng chung Kernel với máy vật lý.Khả năng nhiễu là tối thiểu do cơ chế cách ly hiệu quả.
DeploymentViệc triển khai rất dễ dàng vì chỉ một containerized image duy nhất, có thể được sử dụng trên nhiều nền tảng.Quá trình triển khai tương đối dài vì các instances riêng biệt chịu trách nhiệm thực thi.
UsageDocker có cơ chế sử dụng phức tạp bao gồm cả third party và docker managed tools.Các công cụ dễ sử dụng và đơn giản hơn.

Một số khái niệm:

  • Docker Engine: Đây là thành phần chính của docker, có chức năng như một công cụ dùng để đóng gói ứng dụng.

  • Docker Hub: Được biết đến là một kho lưu trữ công khai của Docker image, bên cạnh đó còn có một tên gọi khác là “thư viện và cộng đồng lớn nhất thế giới về image container”. Docker Hub có chứa khoảng hơn 100.000 image container, những image container này được lấy từ các nhà cung cấp phần mềm thương mại, các nhà phát triển cá nhân, các dự án có mã nguồn mở.

  • Docker Images: Đây được biết đến là một khuôn mẫu dùng để tạo ra một Container, có chứa mã nguồn ứng dụng thư thì, cũng như có chứa tất cả công cũ, thư viện. Thường image sẽ dựa trên một image có sẵn nào đó và có thêm sự tùy chỉnh. Chẳng hạn như khi bạn build một image dựa vào image Centos có sẵn mẫu dùng để chạy Nginx với những tùy chỉnh, thì cấu hình web của bạn có thể hoàn toàn chạy được. Bạn hoàn toàn có thể tự build một image cho mình hoặc có thể sử dụng image trên Docker hub để dụng. Trường hợp nếu tự build image, bạn sẽ nhận được sự chỉ dẫn từ Dockerfile.

  • Docker Container: Chính là một phiên bản live hay running instance của một Docker image. Cụ thể, ta thấy docker image là file dùng để đọc trong khi đó docker container là phiên bản live, executable mà tại đây người dùng hoàn toàn có thể tương tác với chung. Bên cạnh đó, quản trị viên hoàn toàn có thể điều chỉnh cài đặt để phù hợp với các yêu cầu, quy định của họ. Tại docker container, bạn hoàn toàn có thể thực hiện các bước như create, start, stop, move or delete container dựa trên Docker API hoặc Docker CLI.

  • Docker Client: Đây là một công cụ hỗ trợ người dùng giao tiếp với Docker host. Docker host chính là thành phần mà thông qua command line có thể giúp bạn kết nối, giao tiếp với Docker host. Thông tường, Docker client sẽ thực hiện bằng cách thông qua REST API gửi lệnh tới Docker Daemon.

  • Docker Daemon: Đây là nơi lắng nghe các yêu cầu đến từ Docker client với mục đích quản lý các đối tượng thông qua REST API như image, container, Network hay Volumes. Bên cạnh đó, các Docker Daemon cũng giao tiếp với nhau nhằm quản lý các Docker Services.

  • Dockerfile: Chính là một tệp tin mà trong đó có chứa các chỉ dẫn, hướng dẫn để có thể build một image. Một container docker thường bắt đầu bằng một file văn bản với hình thức đơn giản, trong đó có chứa các hướng dẫn về cách build một image container docker. Bên cạnh đó, Dockerfile còn tự động hóa được tiến trình tạo image docker. Dockerfile còn biết đến là danh sách các lệnh được Docker Engine dùng để chạy và tập hợp các image.

  • Docker Volumes: Chính là phần dữ liệu được tạo ra trong quá trình các container được khởi tạo.

  • Docker machine: Là hệ thống tạo ra các docker engine trên máy chủ.

  • Docker Compose: Thực hiện chạy ứng dụng thông qua các định nghĩa cấu hình các Docker Container, thực hiện thông qua file cấu hình.

  • Docker Swarm: để phối hợp triển khai container. Docker Services: là các containers trong production. 1 service chỉ run 1 image nhưng nó mã hoá cách thức để run image — sử dụng port nào, bao nhiêu bản sao container run để service có hiệu năng cần thiết và ngay lập tức.

Build Docker images:

docker build – tạo images từ 1 Docker file

docker history – xem lịch sử của một images, bao gồm các thay đổi với các layer.

docker update – cho phép một user update các configuration của các containers

docker tag – tạo tag, để giúp cho users có thể nhóm và tổ chức các container images

docker search – tìm kiếm trên Docker Hub, một image hay repository.

docker save – cho phép 1 user lưu trữ image và một archive

docker rmi – xóa một hoặc nhiều image

Ví dụ:

Dockerfile:

FROM nginx:latest
COPY website/* /var/www/html
EXPOSE 80

build image:

docker build -t mywebsite:v1

chúng ta sử dụng -tag hoặc -t để đặt tên và đánh tag cho docker image, cú pháp như sau: ‘name:tag’

Kiểm tra image:

docker images

Dockerfile instructions:

FROM: chỉ định base image, một Dockerfile luôn bắt đầu với FROM.

MAINTAINER: set các thông tin liên quan đến người tạo ra image

LABEL: chỉ định thông tin metadata, LABEL là một cặp giá trị key – value.

ADD: copy files, thư mục, và các file tải từ đường link urls vào trong docker container. Nếu source file được nén (zip, tar, gzip,..) thì sẽ giải nén luôn các file khi copy vào thư mục đích.

COPY: copy file, thư mục và các file từ đường link url vào trong docker container. (không bao gồm việc giải nén)

RUN Được dùng khi muốn cài đặt cái gói bổ sung trong quá trình build image.

CMD Là chỉ thị cho biết lệnh nào được thực hiện mỗi khi khởi tạo container. Trong Dockerfile chỉ có duy nhất một chỉ thị CMD

ENTRYPOINT cho phép cấu hình một container mà chạy như một lệnh thực thi. ENTRYPOINT sẽ ghi đè lên các phần tử mà được sử dụng bởi chỉ thị CMD.

VOLUME

Dùng để mount file/directories giữa host và container. Mục đích của VOLUME là:

  • Giữ được dữ liệu khi container bị remove

  • Chia sẻ dữ liệu giữa host và container

  • Chia sẻ dữ liệu giữa các container

USER

Được sử dụng để thiết lập user để sử dụng khi chạy image and cho một số chỉ thị: RUN, CMD & ENTRYPOINT trong Dockerfile.

WORKDIR Là chỉ thị dùng để thiết lập thư mục làm việc. Nó giống home directory, trong trường hợp này là home directory của container. Khi gọi WORKDIR nó sẽ tạo ra thư mục ngay lần gọi đầu và truy cập đến nó như home directory. Nó có thể được dùng nhiều lần trong một Dockerfile.

ENV Định nghĩa các biến môi trường

EXPOSE Dùng khai báo các listen port của container.

EXPOSE <port> [<port>/<protocol>…]

Kết hợp với tham số -p để expose port của container ra bên ngoài (NAT port)

Tương tác CMDENTRYPOINT. Cả 2 lệnh đều xác định lệnh nào được thực hiện khi chạy một container.

Có vài quy tắc trong sự tương tác giữa 2 lệnh:

Tối thiểu sẽ có 1 chỉ thị được chỉ định trong Dockerfile (tất nhiên là có thể 2 chỉ thị đều xuất hiện trong Dockerfile)

  • ENTRYPOINT được định nghĩa khi sử dụng container như một lệnh thực thi

  • CMD được sử dụng như một cách để xác định các tham số mặc định cho chỉ thị ENTRYPOINT hoặc thực thi một lệnh trong một container

  • CMD sẽ bị ghi đè khi chạy container với các tham số xen kẽ.

Tham khảo thêm: docs.docker.com/engine/reference/builder

Lưu trữ image:

Chúng ta có thể lưu trữ trên Docker Hub:

docker login 
docker images
docker tag <image-id> <tag, eg: my-repository/website:v1>
docker push my-repository/website:v1

Có thể lưu trữ trên các private repository cung cấp bởi các cloud provider:

  • AWS ECR

  • Azure Container Registry

  • Google container registry

  • Docker Trusted Registry cung cấp bởi Docker

  • Docker registry by Quay.io

Bạn cũng có thể tự tạo một local registry của bạn bằng cách sử dụng docker “registry” image:

docker run -d -p 5000:5000 \
--restart always \
--name registry \
registry:2

Để lưu image, tag image với localhost:5000 như sau:

docker tag 44870583de0c localhost:5000/website:v1
docker push localhost:5000/website:v1

Docker containers:

Khi run docker image, chúng ta sẽ có được docker container. Docker container là một đơn vị tiêu chuẩn có thể được tạo ra từ một docker image, mục đích là để tạo ra môi trường runtime cho application.

Để run container, thì chúng ta sử dụng câu lệnh “docker run”. Cú pháp:

docker run [options] image:tag

Ví dụ:

docker run -d \
--name mywebsite \
-p 80:80 \
mywebsite:v1

Ở đây, -d có nghĩ là chúng ta sẽ run docker ở backgrouo (như daemon), -p sử dụng để map host to container port (HostPort:ContainerPort).

Để kiểm tra các containers đang chạy, chúng ta sử dụng câu lệnh docker ps:

docker ps

Bạn muốn truy cập vào application đã chạy ở câu lệnh run bên trên, có thể truy cập vào địa chỉ:

http://127.0.0.1/

Dưới đây là một list các Docker commands để quản lý các containers:

docker run – Tạo một container từ Docker image

docker start – Start 1 hoặc nhiều các container bị stop

docker stop – Dừng một hoặc nhiều container

docker export – Export một container’s filesystem dưới dạng .tar file

docker exec – Chạy một câu lệnh trong một run-time container

docker attach – Attach cho một running container

docker commit – Tạo một image mới từ các thay đổi của một container

docker kill – Kill container bằng các dừng tiến trình chạy ngay lập tức

docker rm – Xóa một stopped container.

Xem thêm các câu lệnh CLI: docs.docker.com/engine/reference/commandlin..

Tại sao K8s lại được tạo ra?

Kubernetes (thường được gọi là k8s) là một container orchestration system (hệ thống điều phối container) mã nguồn mở, được tạo ra cho mục đích tự động hóa application deployment, scaling và quản lý.

K8s ban đầu được tạo ra bởi Google, hiện tại được maintain bởi Cloud Native Computing Foundation.

Rất nhiều cloud service cung cấp các nền tảng dựa trên k8s hoặc dịch vụ cho phép người dùng deploy k8s như:

  • AWS

  • Azure

  • GCP

  • OpenStack

Tại sao bạn cần K8s và nó làm được gì?

K8s có rất nhiều tính năng. Và nó có thể được coi là:

  • một container platform

  • một micro-service platform

  • Một portable cloud platform và hơn thế nữa

K8s cung cấp cho người dùng môi trường quản lý chuyên biệt cho container.

Nó cho phép người dùng lên kịch bản computing, networking và storage infrastruture.

K8s orchestration cho phép các application của bạn có thể được mở rộng trên nhiều containers, schedule, scale và quản lý health check của các containers.

K8s định nghĩa một set các building blocks (primitives) cung cấp cơ chế deploy, maintain và scale application dựa trên CPU, memory và các custom metrics.

K8s là loosely coupled và có khả năng mở rộng để đáp ứng cho nhiều workload khác nhau.

K8s architecture

Điều đầu tiên và quan trọng nhất bạn nên hiểu về Kubernetes là nó là một hệ thống phân tán. Một Kubernetes cluster bao gồm các control plane nodes và worker nodes.

Control Plane

Control plane chịu trách nhiệm điều phối container và duy trì trạng thái mong muốn của cluster. Nó có các thành phần sau.

  1. kube-apiserver

  2. etcd

  3. kube-scheduler

  4. kube-controller-manager

  5. cloud-controller-manager

Worker Node

Worker nodes chịu trách nhiệm chạy các ứng dụng được đóng gói. Worker nodes có các thành phần sau.

  1. kubelet

  2. kube-proxy

  3. Container runtime

kube-apiserver

kube-api server là trung tâm của Kubernetes cluster expose K8s API. End user và các component khác giao tiếp với cluster thông qua API.

Vì vậy, khi bạn sử dụng kubectl để quản lý cluster, ở phần backend, bạn thực sự đang giao tiếp với máy chủ API thông qua HTTP REST API. Tuy nhiên, internal cluster components như scheduler, controllern, v.v. giao tiếp với API server bằng gRPC.

Giao tiếp giữa API server và các thành phần khác trong cluster diễn ra qua TLS để ngăn chặn truy cập trái phép vào cluster.

Kubernetes api-server có các trách nhiệm sau:

  • Quản lý API: Hiển thị cluster API endpoints và xử lý tất cả các API requests.

  • Xác thực (Sử dụng client certificates, bearer tokens, and HTTP Basic Authentication) và Authorization (đánh giá ABAC và RBAC).

  • Xử lý các API requests và xác thực dữ liệu cho các đối tượng API như pods, services, etc. (Validation and Mutation Admission controllers)

  • Nó là thành phần duy nhất giao tiếp với etcd

  • api-server điều phối tất cả các quy trình giữa ontrol plane và worker node components.

etcd

Kubernetes là một hệ thống phân tán và nó cần một cơ sở dữ liệu phân tán hiệu quả như etcd hỗ trợ bản chất phân tán của nó. etcd hoạt động như một backend service discovery và database. Có thể nói đây là bộ não của K8s.

etcd là một open-source strongly consistent, distributed key-value store.

  • Strongly consistent: Nếu một bản cập nhật được thực hiện cho một node, Strongly consistent sẽ đảm bảo rằng nó được cập nhật ngay lập tức cho tất cả các node khác trong cluster. Ngoài ra, nếu bạn nhìn vào định lý CAP, việc đạt được 100% khả dụng với strong consistency & Partition Tolerance là không thể.

  • Distributed: etcd được thiết kế để chạy trên nhiều node dưới dạng một cluster mà không ảnh hưởng đến tính nhất quán.

  • Key Value Store: nonrelational database lưu trữ dữ liệu dưới dạng key và value. Nó cũng exposes một key-value API. Datastore được xây dựng trên BboltDB, một nhánh của BoltDB

etcd sử dụng Raft Consensus Algorithm (raft.github.io) cho strongly consitency. Nó hoạt động theo kiểu leader-member để có tính sẵn sàng cao và chịu được lỗi của nodes.

Vậy etcd hoạt động như thế nào với Kubernetes?

Nói một cách đơn giản, khi bạn sử dụng kubectl để lấy object details, kubernetes, bạn sẽ lấy nó từ etcd. Ngoài ra, khi bạn triển khai một đối tượng như pod, một entry sẽ được tạo trong etcd.

Tóm lại, đây là những gì bạn cần biết về etcd:

  • etcd lưu trữ tất cả các cấu hình, trạng thái và metadata của các đối tượng Kubernetes (pods, secrets, daemonsets, deployments, configmaps, statefulsets, etc).

  • etcd cho phép client subscribe các sự kiện bằng API Watch(). Kubernetes api-server sử dụng chức năng theo dõi của etcd để theo dõi sự thay đổi trạng thái của một đối tượng.

  • etcd exposes key-value API bằng gRPC. Ngoài ra, gRPC gateway là một proxy RESTful dịch tất cả lệnh gọi HTTP API thành gRPC messages. Điều này làm cho nó trở thành một cơ sở dữ liệu lý tưởng cho Kubernetes.

  • etcd lưu trữ tất cả các đối tượng trong /registry directory key ở định dạng key-value. Ví dụ: thông tin về pod có tên Nginx trong kdefault namespace có thể được tìm thấy trong /registry/pods/default/nginx

Ngoài ra, etcd nó là thành phần Statefulset duy nhất trong control plane.

Etcd Split Brain

Split brain scenarios xảy ra khi một nhóm các node trong hệ thống phân tán mất liên lạc với nhau chủ yếu do phân vùng mạng, dẫn đến trạng thái hệ thống không nhất quán hoặc xung đột.

etcd được thiết kế để tránh split-brain scenarios, vì nó dựa trên cơ chế bầu chọn leader để đảm bảo rằng chỉ có một nút đang hoạt động và kiểm soát cluster tại bất kỳ thời điểm nào.

Theo như official document, không có “split-brain” trong etcd. Đây là lý do tại sao:

  • A network partition divides the etcd cluster into two parts; one with a member majority and the other with a member minority.

  • The majority side becomes the available cluster and the minority side is unavailable

  • If the leader is on the majority side, then from the majority point of view the failure is a minority follower failure.

  • If the leader is on the minority side, then it is a leader failure.

  • The leader on the minority side steps down and the majority side elects a new leader.

  • Once the network partition clears, the minority side automatically recognizes the leader from the majority side and recovers its state.

Xem thêm: etcd.io/docs/v3.5/op-guide/failures

kube-scheduler

Kube-scheduler chịu trách nhiệm schedule cho các pod trên worker node.

Khi bạn deploy một pod, bạn sẽ chỉ định các pod requirements. ví dụ như CPU, memory, affinitiy, taints, tolerants, priority, persistent volumes (PV),… Nhiệm vụ chính của scheduler là identify create request và chọn node tốt nhất cho pod.

Kube Controller manager:

Controller là các chương trình chạy các vòng điều khiển vô hạn. Có nghĩa là nó chạy liên tục và theo dõi trạng thái thực tế và mong muốn của các object. Nếu có sự khác biệt trong trạng thái thực tế và trạng thái mong muốn, nó đảm bảo rằng tài nguyên/đối tượng kubernetes ở trạng thái mong muốn.

Theo tài liệu của kubernetes.io:

“In Kubernetes, controllers are control loops that watch the state of your cluster, then make or request changes where needed. Each controller tries to move the current cluster state closer to the desired state.”

Giả sử bạn muốn tạo deployment, bạn chỉ định trạng thái mong muốn trong manifest YAML file (declarative approach). Ví dụ: 2 replicas, 1 mount volume, configmap,…

In-built deployment controller đảm bảo rằng deployment luôn ở trạng thái mong muốn. Nếu người dùng cập nhật deployment thành 5 replicas, controller sẽ nhận ra nó và đảm bảo trạng thái mong muốn là 5 replicas.

Kube controller manager là một thành phần quản lý tất cả K8s controller. K8s resources/objects như pods, namespaces, jobs, replicaset được quản lý bởi các controller tương ứng. kube scheduler cũng là một controller được quản lý bởi Kube controller manager.

Danh sách các built-in controller quan trọng:

  1. Deployment controller

  2. Replicaset controller

  3. DaemonSet controller

  4. Job Controller (Kubernetes Jobs)

  5. CronJob Controller

  6. endpoints controller

  7. namespace controller

  8. service accounts controller.

  9. Node controller

Cloud Controller Manager (CCM)

Khi k8s được deploy trên môi trường cloud, cloud controller manager sẽ hoạt động giống như cầu nối giữa Cloud Platform APIs và K8s cluster.

Cloud troller integration cho phép k8s cluster có thể provision các cloud resources như instances (cho các node), LB (cho services), và Storage Volume (cho persistent volumes).

CCM bao gồm một set các cloud platform-specific controllers nhằm đảm bảo trạng thái mong muốn của các cloud-specific components (nodes, Loadbalancers, storage, etc).

3 main controller là một phần của CCM:

Node controller: controller này update các thông tin liên quan tới node bằng cách nói chuyenẹ với cloud provider API. Ví dụ, node labeling & annotation, getting hostname, CPU & memory availability, nodes health, etc.

Node controller sẽ thực hiện những chức năng sau:

  1. Khởi tạo một Node với các nhãn region/zone.

  2. Khởi tạo một Node với những thông tin được cung cấp từ cloud, ví dụ như loại máy và kích cỡ.

  3. Thu thập địa chỉ mạng của Node và hostname.

  4. Trong trường hợp một Node không có tín hiệu phản hồi, Node controller sẽ kiểm tra xem Node này có thực sự xóa khỏi hệ thống cloud hay chưa. Nếu Node đó không còn tồn tại trên cloud, controller sẽ xóa Node đó khỏi Kubernetes cluster.

Route controller: Chịu trách nhiệm cấu hình các định tuyến network trên cloud platform giúp cho pods ở các nodes khác nhau có thể nói chuyện với nhau.

Service controller: Service controller lắng nghe các sự kiện tạo mới, cập nhật và xoá bỏ một service. Dựa trên trạng thái hiện tại của các vụ trên Kubernetes, nó cấu hình các dịch vụ cân bằng tải trên cloud (như ELB của AWS, Google Load Balancer, hay Oracle Cloud Infrastructure LB) nhằm phản ánh trạng thái của các Service trên Kubernetes. Ngoài ra, nó đảm bảo những service backends cho các dịch vụ cần bằng tải trên cloud được cập nhật.

Worker Node components

container runtime (docker): Chịu trách nhiệm chạy container trên các worker nodé.

Nó pull image từ một repository, cung cấp tài nguyên và quản lý container lifecycle.

kubelet: là “node agent” chính chạy trên mỗi node, được quản lý bởi systemd.

kubelet chịu trách nhiệm cho những việc sau:

  • Tạo, sửa đổi và xóa container cho pod.

  • Chịu trách nhiệm xử lý các liveliness, readiness, and startup probes.

  • Chịu trách nhiệm gắn volumes bằng cách đọc cấu hình pod và tạo ra các thư mục tương ứng trên máy chủ để mount volume.

  • Thu thập và báo cáo trạng thái của node và pod thông qua API calls tới server.

Trong khi khởi động control plane, kubelet khởi động api-server, scheduler, và controller manager dưới dạng các static pods từ podSpecs trong file /etc/kubernetes/manifests.

Một số điều quan trọng về kubelet:

  • Kubelet sử dụng giao diện gRPC CRI (container runtime interface) để giao tiếp với container runtime.

  • Nó expose một endpoint HTTP để truyền nhật ký và cung cấp các exec sessions cho clients.

  • Sử dụng gRPC CSI (container storage interface) để định cấu hình block volumes.

  • sử dụng plugin CNI được định cấu hình trong cluster để phân bổ địa chỉ IP của pod thiết lập bất kỳ tuyến mạng và quy tắc tường lửa cần thiết nào cho pod.

  • Kubelet chịu trách nhiệm thu gom rác các image không sử dụng cứ sau 5 phút và các container không sử dụng sau mỗi phút.

Kube proxy

kube-proxy là Network Proxy và load balancer cho dịch vụ, trên một single worker node. Nó đảm nhiệm network routing cho TCP và UDP packets, và thực hiện connection forwarding.

Một hoặc nhiều containers sẽ được gói trong Pod. Pod là unit nhỏ nhat có thể được scheduled như một deployment trong Kubernetes. Nhóm containers trong pod dùng chung storage, Linux name space, IP addresses, …

Một khi Pod được deployed và running, kubelet process giao tiếp với Pods để check state và health. kube-proxy sẽ route any packets tới Pods từ resources khác muốn communicate vói chúng. Worker node có thể được expose tới internet thông qua load balancer. Traffic đi vào các node cũng sẽ được kube-proxy đảm nhiệm.

Dưới đây là một số lệnh để quản lý Kube-proxy:

  • kubectl get pods -n kube-system: Liệt kê các pod trong không gian tên kube-system, nơi Kube-proxy được triển khai.

  • kubectl describe pod kube-proxy: Hiển thị thông tin chi tiết về pod Kube-proxy.

  • kubectl edit pod kube-proxy: Mở tệp cấu hình của pod Kube-proxy để chỉnh sửa.

  • kubectl logs kube-proxy: Xem nhật ký của pod Kube-proxy.

Để tìm hiểu thêm về Kube-proxy, bạn có thể tham khảo tài liệu chính thức của Kubernetes.

Cluster setup

Các khái niệm trong K8S

Có rất nhiều khái niệm mới khi tiếp cận với Kubernetes (K8S) cần nắm được khi mới bắt đầu tìm hiểu:

  • Pods

  • Labels

  • Replica Controllers

  • Replica Sets

  • Deployments

  • Services

  • Volumes

  • Config Maps

  • Daemons

  • Jobs

  • Cron Jobs

  • Namespaces

  • Quotas and Limits

Pod:

  • Pod là 1 nhóm (1 trở lên) các container chứa ứng dụng cùng chia sẽ các tài nguyên lưu trữ, địa chỉ ip…

  • Pod có thể chạy theo 2 cách sau:

    • Pods that run a single container.: 1 container tương ứng với 1 pod.

    • Pods that run multiple containers that need to work together.: Một Pod có thể là một ứng dụng bao gồm nhiều container được kết nối chặt chẽ và cần phải chia sẻ tài nguyên với nhau giữa các container.

  • Pods cung cấp hai loại tài nguyên chia sẻ cho các containers: networking và storage.

  • Networking: Mỗi pod sẽ được cấp 1 địa chỉ ip. Các container trong cùng 1 Pod cùng chia sẽ network namespace (địa chỉ ip và port). Các container trong cùng pod có thể giao tiếp với nhau và có thể giao tiếp với các container ở pod khác (use the shared network resources).

  • Storage: Pod có thể chỉ định một shared storage volumes. Các container trong pod có thể truy cập vào volume này.

Replication Controllers

  • Replication controller đảm bảo rằng số lượng các pod replicas đã định nghĩa luôn luôn chạy đủ số lượng tại bất kì thời điểm nào.

  • Thông qua Replication controller, Kubernetes sẽ quản lý vòng đời của các pod, bao gồm scaling up and down, rolling deployments, and monitoring.

Services

  • Vì pod có tuổi thọ ngắn nên không đảm bảo về địa chỉ IP mà chúng được cung cấp.

  • Service là khái niệm được thực hiện bởi : domain name, và port. Service sẽ tự động “tìm” các pod được đánh label phù hợp (trùng với label của service), rồi chuyển các connection tới đó.

  • Nếu tìm được 5 pods thoả mã label, service sẽ thực hiện load-balancing: chia connection tới từng pod theo chiến lược được chọn (VD: round-robin: lần lượt vòng tròn).

  • Mỗi service sẽ được gán 1 domain do người dùng lựa chọn, khi ứng dụng cần kết nối đến service, ta chỉ cần dùng domain là xong. Domain được quản lý bởi hệ thống name server SkyDNS nội bộ của k8s – một thành phần sẽ được cài khi ta cài k8s.

  • Đây là nơi bạn có thể định cấu hình cân bằng tải cho nhiều pod và expose các pod đó.

Volumes

  • Volumes thể hiện vị trí nơi mà các container có thể truy cập và lưu trữ thông tin.

  • Volumes có thể là local filesystem,local storage, Ceph, Gluster, Elastic Block Storage,..

  • Persistent volume (PV) là khái niệm để đưa ra một dung lượng lưu trữ THỰC TẾ 1GB, 10GB …

  • Persistent volume claim (PVC) là khái niệm ảo, đưa ra một dung lượng CẦN THIẾT, mà ứng dụng yêu cầu.

Khi 1 PV thoả mãn yêu cầu của 1 PVC thì chúng “match” nhau, rồi “bound” (buộc / kết nối) lại với nhau.

Namespaces

  • Namespace hoạt động như một cơ chế nhóm bên trong Kubernetes.

  • Các Services, pods, replication controllers, và volumes có thể dễ dàng cộng tác trong cùng một namespace.

  • Namespace cung cấp một mức độ cô lập với các phần khác của cluster.

ConfigMap (cm) – Secret

  • ConfigMap là giải pháp để nhét 1 file config / đặt các ENVironment var hay set các argument khi gọi câu lệnh. ConfigMap là một cục config, mà pod nào cần, thì chỉ định là nó cần – giúp dễ dàng chia sẻ file cấu hình.

  • secret dùng để lưu trữ các mật khẩu, token, … hay những gì cần giữ bí mật. Nó nằm bên trong container.

Labels – Annotations

  • Labels: Là các cặp key-value được Kubernetes đính kèm vào pods, replication controllers,…Annotations: You can use Kubernetes annotations to attach arbitrary non-identifying metadata to objects. Clients such as tools and libraries can retrieve this metadata.Labels can be used to select objects and to find collections of objects that satisfy certain conditions. In contrast, annotations are not used to identify and select objects.

Có nhiều cách để cài đặt một cụm Kubernetes. Một số cách phổ biến nhất bao gồm:

  • Cài đặt trên máy ảo: Đây là cách cài đặt Kubernetes đơn giản nhất. Bạn có thể cài đặt Kubernetes trên máy ảo trên máy tính của mình hoặc trên đám mây.

  • Cài đặt trên máy vật lý: Đây là cách cài đặt Kubernetes hiệu quả nhất. Bạn có thể cài đặt Kubernetes trên máy vật lý tại chỗ hoặc trên đám mây.

  • Sử dụng dịch vụ Kubernetes: Đây là cách cài đặt Kubernetes dễ dàng nhất. Bạn có thể sử dụng một dịch vụ Kubernetes như Amazon Elastic Container Service for Kubernetes (EKS), Google Kubernetes Engine (GKE) hoặc Microsoft Azure Container Service for Kubernetes (AKS).

Sau khi bạn đã chọn cách cài đặt Kubernetes, bạn cần cài đặt các thành phần của Kubernetes. Các thành phần chính của Kubernetes bao gồm:

  • Kubernetes Master: Kubernetes Master là máy tính chịu trách nhiệm quản lý cụm Kubernetes.

  • Kubernetes Node: Kubernetes Node là máy tính chịu trách nhiệm chạy các pod trong cụm Kubernetes.

  • Kubernetes Pod: Kubernetes Pod là một nhóm container được chạy cùng nhau trên một nút.

Sau khi bạn đã cài đặt các thành phần của Kubernetes, bạn cần cấu hình cụm Kubernetes. Cấu hình Kubernetes bao gồm định nghĩa về các pod, các dịch vụ và các mạng trong cụm.

Sau khi bạn đã cấu hình cụm Kubernetes, bạn có thể bắt đầu triển khai các ứng dụng trong cụm. Để triển khai một ứng dụng trong cụm Kubernetes, bạn cần tạo một file YAML chứa định nghĩa về ứng dụng. Sau đó, bạn có thể sử dụng lệnh kubectl apply để triển khai ứng dụng trong cụm.

Sau khi bạn đã triển khai ứng dụng trong cụm Kubernetes, bạn có thể quản lý ứng dụng bằng lệnh kubectl. Lệnh kubectl cho phép bạn xem các pod, các dịch vụ và các mạng trong cụm, cũng như quản lý các pod, các dịch vụ và các mạng trong cụm.

Hướng dẫn setup tạo một cụm cluster Kubernetes bằng Minikube:

Bước 1: Cài đặt Minikube

Bước 2: Khởi động Minikube

  • Mở terminal hoặc command prompt và chạy lệnh sau để khởi động Minikube:
minikube start

Bước 3: Đợi Minikube khởi động

  • Minikube sẽ tải xuống image của Kubernetes và khởi động một máy ảo (VM) để chạy cụm cluster. Việc này có thể mất một vài phút.

Bước 4: Kiểm tra trạng thái của Minikube

  • Chạy lệnh sau để kiểm tra trạng thái của Minikube:
minikube status

Bước 5: Kết nối tới cụm cluster

  • Chạy lệnh sau để thiết lập môi trường kubectl để kết nối tới cụm cluster:
minikube kubectl -- get po -A
  • Lệnh trên sẽ kết nối kubectl tới cụm cluster Minikube.

Bước 6: Kiểm tra cụm cluster

  • Chạy lệnh sau để kiểm tra trạng thái của cụm cluster:
    kubectl cluster-info

  • Lệnh trên sẽ hiển thị thông tin về cụm cluster Kubernetes đang chạy trên Minikube.

Đến đây, bạn đã tạo thành công một cụm cluster Kubernetes bằng Minikube trên máy tính của mình. Bạn có thể bắt đầu triển khai ứng dụng và thực hiện các tác vụ quản lý khác trên cụm cluster này bằng cách sử dụng kubectl.

Một số file deployment tham khảo:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: apache2
spec:
  replicas: 3
  template:
    metadata:
      labels:
        name: apache2
    spec:
      containers:
      - name: apache2
        image: httpd:2.2.31
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: apache2
spec:
  selector:
    name: apache2
  ports:
    - port: 5555
      targetPort: 80
  type: NodePort
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: httpd
spec:
  template:
    metadata:
      labels:
        name: httpd
    spec:
      containers:
      - name: httpd
        image: httpd:2.2.31
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: httpd
spec:
  selector:
    name: httpd
  ports:
    - port: 5566
      targetPort: 80
  type: NodePort

bạn có thể lưu các file trên dưới dạng <tên>.yml và deploy bằng câu lệnh:

kubectl apply -f <tên>.yml

Kubectl commands

View cluster info:

kubectl cluster-info

List the nodes in cluster:

kubectl get nodes

List all Containers in all namespaces

kubectl get pods --all-namespaces

List Containers filtering by Pod namespace

kubectl get pods --namespace kube-system

Trong đó, kube-system là tên namespace.

List cluster events:

kubectl get events

List deployments, pods, svc

kubectl get deployments
kubectl get pods
kubectl get svc

Delete nodes

kubectl delete nodes <tên node>

Delete deployments, pods, svc

kubectl delete svc monitoring-grafana --namespace=kube-system

Get describe deployments pods, svc,…

kubectl describe deployments php-apache

Get a shell to the running Container:

kubectl exec -it shell-demo /bin/bash

Trong đó shell-demo là tên container.

Scale

# Scale a replicaset named 'foo' to 3.
root@master:~# kubectl scale --replicas=3 rs/foo

# If the deployment named mysql's current size is 2, scale mysql to 3.
root@master:~# kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

auto scale

# Auto scale a replication controller "foo", with the number of pods between 1
and 5, target CPU utilization at 80%:
root@master:~# kubectl autoscale rc foo --max=5 --cpu-percent=80

Port Forwarding: Forward one or more local ports to a pod.

# Listen on port 8888 locally, forwarding to 5000 in the pod
root@master:~# kubectl port-forward mypod 8888:5000

Expose: Expose a resource as a new Kubernetes service.

# Create a service for an nginx deployment, which serves on port 80 and connects to the containe
rs on port 8000.
root@master:~# kubectl expose deployment nginx --port=80 --target-port=8000

Rollout

kubectl rollout supports both Deployment and DaemonSet. It has the following subcommands:

  • kubectl rollout undo works like rollback; it allows the users to rollback to a previous version of deployment.
# Rollback to the previous deployment
root@master:~# kubectl rollout undo deployment/abc
  • kubectl rollout pause allows the users to pause a deployment. See pause deployments.

  • kubectl rollout resume allows the users to resume a paused deployment.

  • kubectl rollout status shows the status of a deployment.

  • kubectl rollout history shows meaningful version information of all previous deployments. See development version.

  • kubectl rollout retry retries a failed deployment. See perm-failed deployments.

Rolling-update

  • Note that kubectl rolling-update only supports Replication Controllers.

  • A rolling update works by:

    1. Creating a new replication controller with the updated configuration.

    2. Increasing/decreasing the replica count on the new and old controllers until the correct number of replicas is reached.

    3. Deleting the original replication controller.

// Update pods of frontend-v1 using new replication controller data in frontend-v2.json.
$ kubectl rolling-update frontend-v1 -f frontend-v2.json

// Update the pods of frontend-v1 to frontend-v2
$ kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2

// Update the pods of frontend, keeping the replication controller name
$ kubectl rolling-update frontend --image=image:v2

Volume

Các loại volume trong kubernetes:

  • emptyDir

  • hostPath

  • gcePersistentDisk

  • awsElasticBlockStore

  • nfs

  • iscsi

  • flocker

  • glusterfs

  • rbd

  • cephfs

  • gitRepo

  • secret

  • persistentVolumeClaim

  • downwardAPI

  • azureFileVolume

  • azureDisk

  • vsphereVolume

  • Quobyte

  • PortworxVolume

  • ScaleIO

emptyDir

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

hostPath

Là dạng volume sẽ mount file or thư mục trên máy host vào pod. Tương tự docker.

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data

PersistentVolume

  • PersistentVolume (PV) là nguồn tài nguyên lưu trữ qua mạng (networked storage) được cung cấp bởi admin trong 1 cluster.

  • PersistentVolumeClaim (PVC) là yêu cầu của user về volume để sử dụng trong một pod.

Network

Các yêu cầu cơ bản trong network của kubernetes:

  • Các containers nói chuyện với nhau mà không cần NAT.

  • Tất cả các nodes có thể nói chuyện với containers (và ngược lại) mà không cần NAT.

  • IP mà containers nhìn thấy chính là địa chỉ ip mà các thành phần khác nhìn thấy. (the IP that a container sees itself as is the same IP that others see it as)

Trên thực tế, k8s áp dụng địa chỉ ip cho Pod. Các containers trong pod chia sẽ chung dải địa chỉ ip.

Các giải pháp network trong k8s là:

  • Contiv

  • Contrail

  • Flannel

  • GCE

  • L2 networks and linux bridging

  • Nuage Networks VCS

  • OpenVSwitch

  • OVN

  • Project Calico

  • Romana

  • Weave Net from Weaveworks

File config

Pods

---
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
  – name: rss-reader
    image: nginx:1.10
    ports:
      – containerPort: 80
    volumeMounts:
      - name: rss-volume
        mountPath: /var/www/html
  volumes:
  - name: rss-volume
    hostPath:
      path: /data
  • apiVersion: v1: Chỉ ra phiên bản api đang sử dụng. Hiện tại k8s có pod ở phiên bản 1

  • kind: Pod: : Chỉ loại file mà ta muốn tạo. Có thể là pod, Deployment, Job, Service,…. Tùy theo từng loại mà có các phiên bản api khác nhau. Xem thêm tại đây: https://kubernetes.io/docs/api-reference/v1.6/

  • metadata:: Là các siêu dữ liệu khi tạo pod.

    • name: Khai báo tên của pod.

    • app: web: Ta bổ sung thêm nhãn label với key là app và value tương ứng là web.

  • spec:: Khai báo các đối tượng mà k8s sẽ xử lý như: containers, volume,…

    • containers: Khai báo đối tượng containers

      • name: Tên containers.

      • image: nginx:1.10: containers sẽ được build từ image nginx với tag là 1.10

      • ports: Liệt kê các port sẽ được containers expose ra. Ở đây là port 80.

      • volumeMounts: Chỉ định volume sẽ được mount vào containers.

        • name: Tên volume.

        • mountPath: /var/www/html: Volume sẽ được mount vào thư mục /var/www/html trên containers

    • volumes:: Khai báo đối tượng volume.

      • name: rss-volume: Tên volume

      • hostPath:: Volume sẽ sử dụng thư mục /data trên máy host.

Deployments:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
  • apiVersion: apps/v1beta1: Chỉ ra phiên bản api sử dụng.

  • kind: Deployment: Loại file, ở đây là Deployment.

  • metadata:: Các thông tin bổ sung cho deployment này.

    • name: nginx-deployment: Tên deployment.
  • spec: Khai báo các đối tượng mà k8s sẽ xử lý như: containers, volume,…

    • replicas: 3: 3Pods sẽ được tạo ra.

    • template: Template định nghĩ pod sẽ được tạo từ template này. Các thông tin trong mục template tương ứng với phần định nghĩa ở File pod ở trên. Tạo ra containers từ image nào, xuất ra port nào, có các labels nào,…

Service:

apiVersion: v1
kind: Service
metadata:
  name: dbfrontend
  labels:
    name: dbfrontend
  spec:
    # label keys and values that must match in order to receive traffic for this service
    selector:
      name: dbfrontend
    ports:
     # the port that this service should serve on
      - port: 5555
        targetPort: 3306
    type: NodePort
  • selector:

    • name: dbfrontend: Định tuyến traffic đến pod với cặp giá trị này (name->dbfrontend).
  • port:

    • port: 5555: port sẽ được expose bởi service.

    • targetPort: 3306: Port mà truy cập vào pods. (Giá trị từ 1-65535). (port của service trên container).

  • type: NodePort: type determines how the Service is exposed. Defaults to ClusterIP. NodePort sẽ expose port 5555 trên tất cả các node (cả cụm cluster).

Trong type có 3 dạng đó là:

  • ClusterIP: “ClusterIP” allocates a cluster-internal IP address for load-balancing to endpoints. Endpoints are determined by the selector or if that is not specified, by manual construction of an Endpoints object. If clusterIP is “None”, no virtual IP is allocated and the endpoints are published as a set of endpoints rather than a stable IP.

  • NodePort: on top of having a cluster-internal IP, expose the service on a port on each node of the cluster (the same port on each node). You’ll be able to contact the service on any NodeIP:NodePort address.

  • LoadBalancer: on top of having a cluster-internal IP and exposing service on a NodePort also, ask the cloud provider for a load balancer which forwards to the Service exposed as a NodeIP:NodePort for each Node.

Monitoring trên Kubernetes Cluster

Kubernetes Monitoring là một tập hợp các công cụ và thực tiễn giúp bạn theo dõi trạng thái của Kubernetes Cluster và các ứng dụng được triển khai trên đó. Nó cho phép bạn hiểu cách thức hoạt động của cụm của bạn và phát hiện các vấn đề tiềm ẩn trước khi chúng gây ra gián đoạn.

Có một số công cụ monitoring Kubernetes khác nhau có sẵn, bao gồm:

  • Prometheus: Prometheus là một hệ thống monitoring open source được sử dụng rộng rãi. Nó có thể được sử dụng để theo dõi các chỉ số từ các nguồn khác nhau, bao gồm Kubernetes.

  • Grafana: Grafana là một công cụ visualization open source. Nó có thể được sử dụng để tạo dashboard trực quan cho dữ liệu Prometheus.

  • Elasticsearch, Logstash, Kibana (ELK) stack: ELK stack là một bộ công cụ open source được sử dụng để thu thập, phân tích và visualize logs. Nó có thể được sử dụng để theo dõi logs từ các pod Kubernetes.

Để triển khai monitoring trên Kubernetes Cluster, bạn cần cài đặt các công cụ monitoring trên các nút của cụm. Sau đó, bạn cần cấu hình các công cụ monitoring để thu thập dữ liệu từ các pod Kubernetes. Cuối cùng, bạn cần tạo các dashboard để visualize dữ liệu monitoring.

Monitoring Kubernetes Cluster là một công việc quan trọng. Nó giúp bạn hiểu cách thức hoạt động của cụm của bạn và phát hiện các vấn đề tiềm ẩn trước khi chúng gây ra gián đoạn.

Dưới đây là một số lợi ích của việc monitoring Kubernetes Cluster:

  • Hiểu cách thức hoạt động của cụm: Monitoring giúp bạn hiểu cách thức hoạt động của cụm của bạn. Bạn có thể thấy các chỉ số như CPU usage, memory usage, và network traffic. Điều này giúp bạn hiểu cách thức hoạt động của các pod trong cụm và cách thức chúng tương tác với nhau.

  • Phát hiện các vấn đề tiềm ẩn: Monitoring giúp bạn phát hiện các vấn đề tiềm ẩn trước khi chúng gây ra gián đoạn. Bạn có thể thấy các chỉ số như errors, latency, và downtime. Điều này giúp bạn phát hiện các vấn đề tiềm ẩn và khắc phục chúng trước khi chúng gây ra gián đoạn cho người dùng của bạn.

  • Cải thiện hiệu suất: Monitoring giúp bạn cải thiện hiệu suất của cụm của bạn. Bạn có thể thấy các chỉ số như CPU usage, memory usage, và network traffic. Điều này giúp bạn xác định các pod nào đang sử dụng nhiều tài nguyên và điều chỉnh chúng cho phù hợp.

  • Tuân thủ quy định: Monitoring giúp bạn tuân thủ các quy định. Một số quy định yêu cầu bạn phải theo dõi các chỉ số nhất định. Monitoring giúp bạn tuân thủ các quy định này.

Các setup monitoring k8s bằng Prometheus:

https://devopscube.com/setup-prometheus-monitoring-on-kubernetes/

Tips:

Mình có tạo 1 Flashcard để học K8s trên Vaia, bạn có thể cài đặt, tạo tài khoảng Vaia và sử dụng nếu thích:

https://app.hellovaia.com/studysets/16669615?ref=TLspXhxECp6KDCB2rl4rX21nj3H84AiL

Ngoài ra, nếu bạn muốn học về các tài nguyên ECS, EKS bạn có thể tham khảo bài viết sau:

https://www.facebook.com/groups/vietawscommunity/posts/1497616297723001/

Một số link trong bài:

  • Amazon ECS Core Concepts:Video

  • Writing Task Definitions:Video

  • Task Placement:Video

  • Autoscaling for Containers:Video

  • Load Balancing for Containers:Video

  • CloudWatch Monitoring:Video

  • Setting up CICD for containers:Video

  • Containerized Microservices:Video

  • Using Amazon ECR:Video

  1. Amazon ECS Workshop: Website

  2. Introduction to ECS: Website

  3. Running Containerized Microservices on AWS – AWS Whitepaper: PDF

Học về một số phương thức lưu trữ phổ biến & một số loại database

Ví dụ như NAS, SAN, NFS, iSCSI, Ceph, RAID và LVM,..

Và một số loại database như MySQL, PostgreSQL, Oracle,…

Một số tài nguyên tham khảo:

  • Một số phương thức lưu trữ phổ biến:

Introduction to SAN and NAS Storage:https://www.tutorialspoint.com/introduction_to_san_and_nas_storage/index.asp

How to Install and Configure an NFS Linux Server and Client:https://www.classcentral.com/classroom/youtube-how-to-install-and-configure-an-nfs-linux-server-and-client-143572

Linux System Engineer: Network Filesystems Using NFS and Samba:https://www.linkedin.com/learning/linux-system-engineer-network-filesystems-using-nfs-and-samba/using-linux-for-network-filesystems?autoplay=true

Windows Server file servers and storage management:https://learn.microsoft.com/en-us/training/paths/windows-server-file-servers-storage-management/

Configure storage and file services:https://learn.microsoft.com/en-us/training/paths/configure-storage-file-services/

Cloud storage:https://learn.microsoft.com/en-us/training/paths/cmu-cloud-computing-cloud-storage/

Ceph document:https://docs.ceph.com/en/quincy/

Introduction to RAID:https://www.baeldung.com/cs/raid-intro

An Introduction to RAID Terminology and Concepts:https://www.digitalocean.com/community/tutorials/an-introduction-to-raid-terminology-and-concepts

  • Một số loại database:

Database Systems – Cornell University Course (SQL, NoSQL, Large-Scale Data Analysis): youtube.com/watch?v=4cWkVbC2bNE

SQL Tutorial – Full Database Course for Beginners: youtube.com/watch?v=HXV3zeQKqGY

NoSQL – Complete guide for beginner: youtube.com/watch?v=xh4gy1lbL2k&t=13s

GraphQL Full Course – Novice to Expert: youtube.com/watch?v=ed8SzALpx1Q

Kiến thức về phần này khá nhiều, và tùy vào mục đích công việc mà các bạn có thể sẽ học những kiến thức khác nhau. Phạm vi bài viết có hạn, nên mình sẽ chỉ dẫn link một số tài liệu tham khảo, không viết chi tiết.

Làm quen với các công cụ mã nguồn mở

Ví dụ như Terraform, Kubernetes,… Điều này sẽ đặc biệt hữu ích khi bạn muốn vượt qua giới hạn của các tool hiện có trên cloud, hoặc làm việc trong các dự án multi-cloud.

Tài nguyên tham khảo:

https://landscape.cncf.io/

Check list tham khảo học Terraform:

  1. Understand Infrastructure as Code (IaC):

    • Learn the concept of Infrastructure as Code and its benefits.

    • Understand how Terraform fits into the IaC ecosystem.

  2. Install Terraform:

    • Install Terraform on your local machine.

    • Ensure you have the necessary dependencies (e.g., provider plugins) installed.

  3. Learn Terraform Basics:

    • Understand the Terraform workflow: initialization, planning, applying, and destroying.

    • Learn how to write Terraform configuration files (.tf files) using the HashiCorp Configuration Language (HCL).

  4. Provider and Resource Configuration:

    • Explore the Terraform documentation to understand the available providers and resources.

    • Learn how to configure providers and define resources in your Terraform configuration.

  5. Terraform State:

    • Understand the concept of Terraform state and its importance.

    • Learn how to manage and work with Terraform state files.

  6. Variables and Data Sources:

    • Learn how to use variables in your Terraform configuration to make it more dynamic.

    • Understand how to use data sources to fetch information from external systems.

  7. Modules:

    • Explore how to create and use Terraform modules to encapsulate and reuse configurations.

    • Understand module best practices and how to publish and consume modules.

  8. Remote Backends and Collaboration:

    • Learn how to configure remote backends for storing the Terraform state.

    • Understand how to collaborate with others using remote backends and version control systems.

  9. Terraform Commands and Workflow:

    • Familiarize yourself with commonly used Terraform commands like terraform init, terraform plan, terraform apply, and terraform destroy.

    • Understand how to manage and organize your Terraform projects efficiently.

  10. Terraform Best Practices:

    • Explore Terraform best practices for writing maintainable and scalable infrastructure code.

    • Understand how to structure your Terraform codebase and manage configuration values securely.

  11. Explore Advanced Topics:

    • Dive deeper into advanced Terraform topics like remote execution modes, provisioners, and workspaces.

    • Learn about Terraform Cloud, Terraform Enterprise, and other advanced features.

  12. Practice and Apply Knowledge:

    • Start working on practical projects to apply your Terraform knowledge.

    • Experiment with different infrastructure scenarios and explore real-world use cases.

Ngoài ra, bạn hoàn toàn có thể tự tìm hiểu cho mình bằng cách:

<tên tool muốn học> + learning checklist/learning path