added vi translation for k8s sections
This commit is contained in:
parent
4b755f9b90
commit
55ce180461
@ -56,7 +56,7 @@ Cuối cùng thì chúng ta cũng đã xây dựng xong ứng dụng, kiểm th
|
||||
|
||||
Các ứng dụng khác nhau đòi hỏi các yêu cầu khác nhau về phần cứng và cấu hình. Đó là khi quản lý cấu hình ứng dụng (Application Configuration Management) và cơ sở hạ tầng ứng dụng dưới dạng mã (Infrastructure as Code) đóng vai trò then chốt trong vòng đời DevOps. Các ứng dụng có thể được đóng gói và chạy trong các containers hoặc chạy trên các máy ảo (VM). Điều này khiến chúng ta cần sử dụng các nền tảng như Kubernetes để điều phối các containers và đảm bảo ứng dụng ở trong trạng thái mong muốn nhằm phục vụ người dùng cuối.
|
||||
|
||||
Chúng ta sẽ tìm hiểu chi tiết về các chủ đề quan trọng này trong vài tuần tới để có kiến thức nền tẳng tốt hơn về chúng và khi nào thì nên sử dụng.
|
||||
Chúng ta sẽ tìm hiểu chi tiết về các chủ đề quan trọng này trong vài tuần tới để có kiến thức nền tảng tốt hơn về chúng và khi nào thì nên sử dụng.
|
||||
|
||||
## Giám sát
|
||||
|
||||
|
@ -138,7 +138,7 @@ Trên Windows, bạn có ổ C: và đó là thứ mà chúng ta coi là gốc.
|
||||
|
||||
Khi đề cập tới một hệ thống Linux hoặc bất kỳ hệ thống nào, chúng ta có thể muốn biết các ổ đĩa có sẵn và chúng tôi có bao nhiêu dung lượng trống trên các đĩa đó. Một vài lệnh sau đây giúp xác định và sử dụng cũng như quản lý bộ lưu trữ.
|
||||
|
||||
- `lsblk` Liệt kê các thiết bị chặn(List Block devices). `sda` là đĩa vật lý của chúng ta và sau đó `sda1, sda2, sda3` là các phân vùng của chúng ta trên đĩa đó.
|
||||
- `lsblk` Liệt kê các thiết bị khối (List Block devices). `sda` là đĩa vật lý của chúng ta và sau đó `sda1, sda2, sda3` là các phân vùng của chúng ta trên đĩa đó.
|
||||
|
||||

|
||||
|
||||
|
@ -16,7 +16,7 @@ Ngay cả khi bạn đã cài đặt git trên hệ thống của mình, bạn c
|
||||
|
||||
### Cài đặt Git
|
||||
|
||||
Như đã đề cập, Git là công cụ đa nền tẳng, chúng ta sẽ nhắc tới Windows và Linux và bạn cũng có thể tìm thấy hướng dẫn cho macOS tại [đây](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
|
||||
Như đã đề cập, Git là công cụ đa nền tảng, chúng ta sẽ nhắc tới Windows và Linux và bạn cũng có thể tìm thấy hướng dẫn cho macOS tại [đây](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
|
||||
|
||||
Đối với [Windows](https://git-scm.com/download/win), chúng ta có thể download trình cài đặt từ trang web chính thức.
|
||||
|
||||
|
@ -12,11 +12,11 @@ id: 1049044
|
||||
|
||||
Khám phá GitHub | GitLab | BitBucket
|
||||
|
||||
Hôm nay tôi muốn đề cập đến một số dịch vụ dựa trên git mà có lẽ tất cả chúng ta đều đã nghe nói đến và mong rằng chúng ta cũng sử dụng hàng ngày.
|
||||
Hôm nay tôi muốn đề cập đến một số dịch vụ dựa trên git mà có lẽ tất cả chúng ta đều đã nghe nói đến và có thể đang sử dụng hàng ngày.
|
||||
|
||||
Sau đó, chúng ta sẽ sử dụng một số kiến thức trong buổi trước của mình để di chuyển các bản sao dữ liệu của chúng ta sang từng dịch vụ chính.
|
||||
Sau đó, chúng ta sẽ sử dụng một số kiến thức trong buổi trước của mình để.
|
||||
|
||||
Tôi gọi phần này là "Mạng xã hội cho mã" hãy để tôi giải thích tại sao?
|
||||
Tôi gọi phần này là "Mạng xã hội cho mã" và hãy để tôi giải thích tại sao?
|
||||
|
||||
### GitHub
|
||||
|
||||
@ -83,7 +83,7 @@ Nếu cuộn xuống thêm một chút, bạn cũng sẽ thấy rằng chúng ta
|
||||
|
||||
Ở đầu trang, bạn sẽ thấy một danh sách các tab. Chúng có thể khác nhau và chúng có thể được tuỳ biến để chỉ hiển thị những thứ bạn yêu cầu. Bạn sẽ thấy ở đây tôi không sử dụng tất cả những thứ này và nên loại bỏ chúng để đảm bảo toàn bộ kho lưu trữ gọn gàng.
|
||||
|
||||
Đầu tiên, chúng ta có tab code mà chúng ta vừa thảo luận nhưng các tab này sẽ giúp điều hướng qua trong kho lưu trữ, điều này cực kỳ hữu ích để chúng ta có thể chuyển đổi giữa các phần một cách nhanh chóng và dễ dàng. Tiếp theo, chúng tôi có tab Issues.
|
||||
Đầu tiên, chúng ta có tab code mà chúng ta vừa thảo luận nhưng các tab này sẽ giúp điều hướng qua trong kho lưu trữ, điều này cực kỳ hữu ích để chúng ta có thể chuyển đổi giữa các phần một cách nhanh chóng và dễ dàng. Tiếp theo, chúng ta có tab Issues.
|
||||
|
||||
Issues cho phép bạn theo dõi công việc của mình trên GitHub, nơi quá trình phát triển diễn ra. Trong kho lưu trữ cụ thể này, bạn có thể thấy tôi có một số issue tập trung vào việc thêm sơ đồ hoặc lỗi chính tả nhưng chúng ta cũng có yêu cầu có phiên bản tiếng Trung cho kho lưu trữ.
|
||||
|
||||
@ -93,7 +93,7 @@ Nếu đây là một kho lưu trữ mã thì đây là nơi tuyệt vời để
|
||||
|
||||
Tab tiếp theo là Pull Requests, Pull Requests cho phép bạn thông báo cho người khác về những thay đổi mà bạn đã đẩy tới một nhánh trong kho lưu trữ. Đây là nơi ai đó có thể đã phân nhánh kho lưu trữ của bạn, thực hiện các thay đổi như sửa lỗi hoặc cải tiến tính năng hoặc chỉ lỗi đánh máy.
|
||||
|
||||
Chúng tôi sẽ đề cập đến fork sau.
|
||||
Chúng ta sẽ đề cập đến fork sau.
|
||||
|
||||

|
||||
|
||||
@ -115,7 +115,7 @@ Tôi biết rằng issues có vẻ là một nơi tốt để ghi lại các yê
|
||||
|
||||

|
||||
|
||||
Không có trong dự án này nhưng có tab Security để đảm bảo rằng những contributors biết cách xử lý một số tác vụ nhất định, chúng tôi có thể xác định một policy tại đây cũng như các tiện ích quét mã để đảm bảo mã của bạn không chứa các biến môi trường bí mật.
|
||||
Không có trong dự án này nhưng có tab Security để đảm bảo rằng những contributors biết cách xử lý một số tác vụ nhất định, chúng ta có thể xác định một policy tại đây cũng như các tiện ích quét mã để đảm bảo mã của bạn không chứa các biến môi trường bí mật.
|
||||
|
||||

|
||||
|
||||
@ -123,7 +123,7 @@ Không có trong dự án này nhưng có tab Security để đảm bảo rằng
|
||||
|
||||

|
||||
|
||||
Cuối cùng, chúng tôi có tab Settings, đây là nơi chúng tôi có thể xem chi tiết cách chúng tôi chạy kho lưu trữ của mình, tôi hiện là người bảo trì duy nhất của kho lưu trữ nhưng chúng tôi có thể chia sẻ trách nhiệm này tại đây. Chúng ta có thể định nghĩa tích hợp và các tác vụ khác tương tự như vậy tại đây.
|
||||
Cuối cùng, chúng ta có tab Settings, đây là nơi chúng ta có thể xem chi tiết cách chúng ta chạy kho lưu trữ của mình, tôi hiện là người bảo trì duy nhất của kho lưu trữ nhưng chúng ta có thể chia sẻ trách nhiệm này tại đây. Chúng ta có thể định nghĩa tích hợp và các tác vụ khác tương tự như vậy tại đây.
|
||||
|
||||

|
||||
|
||||
@ -133,73 +133,69 @@ This was a super quick overview of GitHub, I think there are some other areas th
|
||||
|
||||
### Forking
|
||||
|
||||
Ta sẽ tìm hiểu thêm về Nguồn mở trong buổi ngày mai nhưng một phần quan trọng của bất kỳ kho lưu trữ mã nào là khả năng cộng tác với cộng đồng. Hãy nghĩ về kịch bản sau: tôi muốn có một bản sao của kho lưu trữ vì tôi muốn thực hiện một số thay đổi, có thể tôi muốn sửa lỗi hoặc có thể tôi muốn thay đổi thứ gì đó để sử dụng nó cho trường hợp sử dụng mà tôi có thể không trường hợp sử dụng dự định cho người bảo trì ban đầu của mã. Đây là những gì chúng tôi gọi là forking một kho lưu trữ. Một ngã ba là một bản sao của một kho lưu trữ. Forking một kho lưu trữ cho phép bạn tự do thử nghiệm các thay đổi mà không ảnh hưởng đến dự án ban đầu.
|
||||
Ta sẽ tìm hiểu thêm về Nguồn mở trong buổi ngày mai nhưng một phần quan trọng của bất kỳ kho lưu trữ mã nào là khả năng cộng tác với cộng đồng. Hãy nghĩ về kịch bản sau: tôi muốn có một bản sao của kho lưu trữ vì tôi muốn thực hiện một số thay đổi, có thể tôi muốn sửa lỗi hoặc có thể tôi muốn thay đổi thứ gì đó để sử dụng nó cho trường hợp sử dụng mà tôi có thể không trường hợp sử dụng dự định cho người bảo trì ban đầu của mã. Đây là những gì chúng ta gọi là forking một kho lưu trữ. Một fork là một bản sao của một kho lưu trữ. Forking một kho lưu trữ cho phép bạn tự do thử nghiệm các thay đổi mà không ảnh hưởng đến dự án ban đầu.
|
||||
|
||||
Hãy để tôi quay lại trang mở đầu sau khi đăng nhập và xem một trong những kho lưu trữ được đề xuất đó.
|
||||
|
||||
I am going to get more into Open-Source in the session tomorrow but a big part of any code repository is the ability to collaborate with the community. Let's think of the scenario I want a copy of a repository because I want to make some changes to it, maybe I want to fix a bug or maybe I want to change something to use it for a use case that I have that was maybe not the intended use case for the original maintainer of the code. This is what we would call forking a repository. A fork is a copy of a repository. Forking a repository allows you to freely experiment with changes without affecting the original project.
|
||||
Hãy quay lại trang mở đầu sau khi đăng nhập và xem một trong những kho lưu trữ được đề xuất đó.
|
||||
|
||||

|
||||
|
||||
Nếu chúng ta nhấp vào kho lưu trữ đó, chúng ta sẽ có giao diện giống như kho lưu trữ 90DaysOfDevOps.
|
||||
|
||||
|
||||

|
||||
|
||||
If we notice below we have 3 options, we have watch, fork and star.
|
||||
Nếu để ý bên dưới, chúng ta có 3 tùy chọn, chúng ta có watch, fork và star.
|
||||
|
||||
- Watch - Updates when things happen to the repository.
|
||||
- Fork - a copy of a repository.
|
||||
- Star - "I think your project is cool"
|
||||
- Watch - Cập nhật các thay đổi của kho lưu trữ.
|
||||
- Fork - một bản sao của một kho lưu trữ.
|
||||
- Star - "Tôi nghĩ dự án của bạn rất tuyệt"
|
||||
|
||||

|
||||
|
||||
Given our scenario of wanting a copy of this repository to work on we are going to hit the fork option. If you are a member of multiple organisations then you will have to choose where the fork will take place, I am going to choose my profile.
|
||||
Với kịch bản của chúng ta là muốn một bản sao của kho lưu trữ để làm việc với nó, chúng ta sẽ nhấn tùy chọn fork. Nếu bạn là thành viên của nhiều tổ chức thì bạn sẽ phải chọn nơi để fork, tôi sẽ chọn profile của mình.
|
||||
|
||||

|
||||
|
||||
Now we have our copy of the repository that we can freely work on and change as we see fit. This would be the start of the pull request process that we mentioned briefly before but we will cover it in more detail tomorrow.
|
||||
Bây giờ chúng ta có bản sao của kho lưu trữ để có thể tự do làm việc và thay đổi phù hợp. Đây sẽ là bước khởi đầu của quy trình pull request mà chúng ta đã đề cập ngắn gọn trước đây, nó sẽ được đề cập chi tiết hơn vào ngày mai.
|
||||
|
||||

|
||||
|
||||
Ok, I hear you say, but how do I make changes to this repository and code if it's on a website, well you can go through and edit on the website but it's not going to be the same as using your favourite IDE on your local system with your favourite colour theme. For us to get a copy of this repository on our local machine we will perform a clone of the repository. This will allow us to work on things locally and then push our changes back into our forked copy of the repository.
|
||||
Ok, nhưng làm cách nào để thay đổi kho lưu trữ và mã này nếu nó ở trên một trang web, bạn có thể xem qua và chỉnh sửa trực tiếp trên đó nhưng bạn không thể sử dụng IDE yêu thích của bạn trên máy cá nhân với theme màu yêu thích của bạn. Để chúng ta có được một bản sao của kho lưu trữ này trên máy của mình, chúng ta sẽ clone kho lưu trữ đó. Điều này sẽ cho phép chúng ta làm việc trên môi trường cục bộ và sau đó đẩy (push) các thay đổi trở lại bản sao được fork từ kho lưu trữ gốc.
|
||||
|
||||
We have several options when it comes to getting a copy of this code as you can see below.
|
||||
Chúng ta có một số tùy chọn khi nhận được một bản sao của mã này như bạn có thể thấy bên dưới.
|
||||
|
||||
There is a local version available of GitHub Desktop which gives you a visual desktop application to track changes and push and pull changes between local and GitHub.
|
||||
Có một phiên bản của GitHub Desktop cung cấp cho bạn một ứng dụng máy tính t để theo dõi các thay đổi cũng như push và pull các thay đổi giữa môi trường local và GitHub.
|
||||
|
||||
For this little demo, I am going to use the HTTPS URL we see on there.
|
||||
Đối với demo nhỏ này, tôi sẽ sử dụng URL HTTPS mà chúng ta thấy trên đó.
|
||||
|
||||

|
||||
|
||||
Now on our local machine, I am going to navigate to a directory I am happy to download this repository to and then run `git clone url`
|
||||
Bây giờ trên máy cục bộ của chúng ta, tôi sẽ điều hướng đến một thư mục mà tôi muốn tải xuống kho lưu trữ này và sau đó chạy `git clone url`
|
||||
|
||||

|
||||
|
||||
Now we could take it to VScode to make some changes to this.
|
||||
Bây giờ chúng ta có thể mở nó bằng VSCode và thay đổi một số thứ.
|
||||
|
||||

|
||||
|
||||
Let's now make some changes, I want to make a change to all those links and replace that with something else.
|
||||
Hãy thực hiện một số thay đổi, tôi muốn thay đổi các liên kết đó và thay thế nó bằng thứ gì khác.
|
||||
|
||||

|
||||
|
||||
Now if we check back on GitHub and we find our readme.mdin that repository, you should be able to see a few changes that I made to the file.
|
||||
Bây giờ, nếu chúng ta kiểm tra lại GitHub và tìm tệp Readme.md trong kho lưu trữ đó, bạn có thể thấy một vài thay đổi mà tôi đã thực hiện đối với tệp đó.
|
||||
|
||||

|
||||
|
||||
At this stage, this might be complete and we might be happy with our change as we are the only people going to use our new change but maybe it was a bug change and if that is the case then we will want to contribute via a Pull Request to notify the original repository maintainers of our change and see if they accept our changes.
|
||||
Ở thời điểm này, quá trình này có thể đã hoàn tất và chúng ta có thể hài lòng với thay đổi của mình vì chúng ta là những người duy nhất sẽ sử dụng thay đổi mới đó. Nhưng rất có thể sẽ có lúc thay đổi của chúng ta là để sửa một bug và thông qua một Pull request, chúng ta sẽ thông báo cho những người bảo trì kho lưu trữ đó về thay đổi của chúng ta và xem liệu họ có chấp nhận những thay đổi đó hay không.
|
||||
|
||||
We can do this by using the contribute button highlighted below. I will cover more on this tomorrow when we look into Open-Source workflows.
|
||||
Chúng ta có thể làm điều này bằng cách sử dụng nút Contribute được làm rõ ở dưới đây. Tôi sẽ đề cập nhiều hơn về vấn đề này vào ngày mai khi chúng ta xem xét quy trình làm việc với các phần mềm mã nguồn mở.
|
||||
|
||||

|
||||
|
||||
I have spent a long time looking through GitHub and I hear some of you cry but what about other options!
|
||||
Tôi đã dành một thời gian dài để hướng dẫn về Github và tôi nghe thấy một số yêu cầu vê những lựa chọn khác.
|
||||
|
||||
Well, there are and I am going to find some resources that cover the basics for some of those as well. You are going to come across GitLab and BitBucket amongst others in your travels and whilst they are git-based services they have their differences.
|
||||
|
||||
You will also come across hosted options. Most commonly here I have seen GitLab as a hosted version vs GitHub Enterprise (Don't believe there is a free hosted GitHub?)
|
||||
Và tôi cũng sẽ tìm một số tài nguyên cơ bản cho những vấn đề đó. Bạn sẽ thấy GitLab và BitBucket trong số những lựa chọn khi bạn sử dụng các dịch vụ quản lý phiên bản, tuy chúng là những dịch vụ dựa trên git nhưng chúng cũng có một số khác biệt nhất dịnh.
|
||||
|
||||
Bạn cũng sẽ bắt gặp các tuỳ chọn tự host. Phổ biến nhất ở đây tôi có thể thấy là GitLab và GitHub Enterprise (Tôi không nghĩ rằng có dịch vụ tự host miễn phí của Github?)
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Learn GitLab in 3 Hours | GitLab Complete Tutorial For Beginners](https://www.youtube.com/watch?v=8aV5AxJrHDg)
|
||||
|
@ -17,7 +17,7 @@ Chúng ta sẽ sử dụng và giải thích về docker nhưng cũng sẽ đề
|
||||
Docker là một khung phần mềm để xây dựng, chạy, quản lý các vùng chứa. Thuật ngữ "docker" có thể đề cập đến các công cụ (các lệnh và deamon)
|
||||
hoặc định dạng tệp Dockerfile.
|
||||
|
||||
Chúng ta sẽ sử dọng Docker Personal trong tuần này, nó sẽ được miễn phí cho mục đích học tập. Tất cả những chức năng cần thiết mà chúng ta cần trang bị để có kiến thức nền tảng tốt về container và công cụ xung quanh đều có trong Docker Personal.
|
||||
Chúng ta sẽ sử dụng Docker Personal trong tuần này, nó sẽ được miễn phí cho mục đích học tập. Tất cả những chức năng cần thiết mà chúng ta cần trang bị để có kiến thức nền tảng tốt về container và công cụ xung quanh đều có trong Docker Personal.
|
||||
|
||||
Có lẽ đáng để chia nhỏ một số công cụ "docker" mà chúng ta sẽ sử dụng và cách chúng được sử dụng. Thuật ngữ docker có thể đề cập đến dự án docker nói chung, đây là một nền tảng dành cho các nhà phát triển và quản trị viên để phát triển, vận chuyển và chạy các ứng dụng. Nó cũng có thể nhắn tới process docker daemon chạy trên máy chủ quản lý image và container, hay còn được gọi là Docker Engine.
|
||||
|
||||
|
119
2022/vi/Days/day45.md
Normal file
119
2022/vi/Days/day45.md
Normal file
@ -0,0 +1,119 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Phân tích một Docker Image - Ngày 45'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Phân tích một Docker Image
|
||||
tags: 'DevOps, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048777
|
||||
---
|
||||
## Phân tích một Docker Image
|
||||
|
||||
Trong phần trước, chúng ta đã đề cập đến một số điều cơ bản về cách sử dụng Docker Desktop kết hợp với DockerHub để triển khai và chạy một số image đã được xác nhận. Ôn lại về image, chắc hẳn bạn sẽ không quên mọi thứ nếu tôi liên tục đề cập đến chúng.
|
||||
|
||||
Docker image là một template chỉ có thể đọc chứa một bộ chỉ dẫn để tạo container có thể chạy được trên nền tảng Docker. Nó cũng câp một giải pháp thuận tiện để đóng gói các ứng dụng và môi trường được cấu hình trước mà bạn có thể sử dụng cho mục đích cá nhân hoặc chia sẻ công khai với những người dùng Docker khác. Docker image cũng là điểm khởi đầu với bất kỳ ai lần đầu tiên sử dụng Docker.
|
||||
|
||||
|
||||
Điều gì sẽ xảy ra nếu chúng ta muốn tạo Docker image của riêng mình? Để làm được điều này, đầu tiên bạn cần tạo một Dockerfile. Bạn đã thấy cách chúng ta có thể lấy container image của Ubuntu và thêm các phần mềm cần thiết và mọi thứ hoạt động rất ổnm tuy nhiên, nếu container đó bị dừng lại hoặc loại bỏ thì tất cả các cập nhật phần mềm cũng như quá trình cài đặt sẽ biến mất, không có phiên bản nào lặp lại cho quá trình chúng ta đã thực hiện. Vì vậy, việc đó có thể tốt nếu chúng ta cần thể hiện các chức năng của Docker image nhưng không giúp ích gì cho việc truyền hình ảnh qua nhiều môi trường khác nhau với các phần mềm được cài đặt sẵn cho mỗi container khi khởi tạo/chạy.
|
||||
|
||||
### Dockerfile là gì?
|
||||
|
||||
Dockerfile là một tệp dữ liệu text có chứa các câu lệnh mà bạn sẽ thực hiện thủ công để xây dựng một docker image. Docker có thể xây dựng các hình ảnh một cách tự động bằng việc đọc các chỉ dẫn của chúng ta trong các dockerfile.
|
||||
|
||||
Mỗi một tệp tạo ra một docker image được biết tới như một layer (lớp). Các layers này đến từ các images, được tạo trên các image khác trong nhiều stages. Mỗi một layer độc lập với layer nằm trực tiếp phía dưới của nó. Thứ tự của các layer đóng vai trò then chốt trong việc quản lý vòng đời docker image của bạn môt cách hiệu quả.
|
||||
|
||||
Chúng ta nên tổ chức các layers theo thứ tự của việc hay thay đổi nhất. Các layer hay bị thay đổi nên nằm càng cao càng tốt trong stack của chúng ta, lý do vì khi bạn thay đổi một layer trong image của bạn, Docker không chỉ xây dựng lại layer đó mà toàn bộ các layer nằm phía sau/dựa vào layer đó. Do đó, một thay đổi với layer ở phía trên sẽ giúp tiết kiệm thời gian cho việc xây dựng lại toàn bộ image.
|
||||
|
||||
Mỗi lần docker tạo một container từ một image (như chúng ta đã làm ngày hôm qua), chúng thêm vào một layer có thể được chỉnh sửa, hay còn biết đến như container layer. Nó sẽ ghi lại toàn bộ các thay đổi của container trong runtime. Layer này là thứ duy nhất khác biệt giữa một container đang hoạt động và image gốc. Bất kỳ số lượng container tương tự nào cũng có thể chia sẻ quyền truy cập vào cùng một base image trong khi vẫn duy trì trạng thái của chúng.
|
||||
|
||||
Quay trở lại ví dụ chúng ta sử dụng ngày hôm qua với Ubuntu image. Chúng ta có thể chạy cùng một lệnh đó nhiều lần và trên container đầu tiên, chúng ta có thể cài đặt pinta và trên container thứ hai, chúng ta có thể cài đặt figlet với hai ứng dụng khác nhau, mục đích khác nhau, kích thước khác nhau, v.v. Mỗi container mà chúng ta triển khai chia sẻ cùng một image nhưng không cùng một trạng thái và sau đó trạng thái đó sẽ biến mất khi chúng ta xoá container.
|
||||
|
||||

|
||||
|
||||
Theo ví dụ trên với Ubuntu image, nhưng cũng có nhiều container image dựng sẵn khác có sẵn trên DockerHub và các kho lưu trữ của bên thứ ba. Những image này thường được gọi là image gốc - base image. Nó là nền tảng để xây dựng tất cả các layer khác và cung cấp các khối xây dựng cơ bản cho môi trường container của chúng ta.
|
||||
|
||||
Cùng với một tập hợp các tệp layers riêng lẻ, Docker image cũng bao gồm một tệp bổ sung được gọi là manifest. Đây thực chất là phần mô tả image ở định dạng JSON và bao gồm các thông tin như image tag, chữ ký điện tử và chi tiết về cách định cấu hình container cho các loại nền tảng khác nhau.
|
||||
|
||||

|
||||
|
||||
### Làm thế nào để tạo một docker image
|
||||
|
||||
Có hai cách chúng ta có thể tạo một docker image. Chúng ta có thể thực hiện nhanh chóng với quy trình mà chúng ta đã bắt đầu ngày hôm qua, chúng ta chọn base image của mình khởi động container đó và cài đặt tất cả phần mềm cũng như các dependencies (phụ thuộc) mà chúng ta muốn có trên container của mình.
|
||||
|
||||
Sau đó, chúng ta có thể sử dụng `docker commit container name` để có một bản sao cục bộ của image này như một docker image và nó sẽ xuất hiện trong tab images của docker desktop của bạn.
|
||||
|
||||
Cực kỳ đơn giản, tôi không đề xuất phương pháp này trừ khi bạn muốn hiểu quy trình, sẽ rất khó để quản lý vòng đời theo cách này và cần rất nhiều cấu hình thủ công. Nhưng đó là cách nhanh nhất và đơn giản nhất để xây dựng docker image. Nó rất tốt cho việc thử nghiệm, khắc phục sự cố, xác thực các dependencies, v.v.
|
||||
|
||||
Cách chúng ta dự định xây dựng image của mình là thông qua một dockerfile. Điều này giúp chúng ta có một cách rõ ràng, nhanh gọn và có thể lặp lại để tạo một image. Quản lý vòng đời cũng sẽ dễ dàng hơn nhiều ngoài ra cũng dễ dàng tích hợp vào các quy trình Phân phối liên tục và Tích hợp liên tục (CI/CD). Nhưng như bạn có thể thấy, nó khó hơn một chút so với quy trình được đề cập đầu tiên.
|
||||
|
||||
Việc sử dụng phương pháp dockerfile phù hợp hơn nhiều với việc triển container của doanh nghiệp trong thế giới thực.
|
||||
|
||||
Dockerfile là một quy trình gồm ba bước, theo đó bạn tạo dockerfile và thêm các lệnh bạn cần để tạo nên một image.
|
||||
|
||||
Bảng sau đây chứa một số câu lệnh dockerfile mà chúng tôi sẽ sử dụng và rất có thể bạn cũng sẽ sử dụng.
|
||||
|
||||
| Lệnh | Mục đích |
|
||||
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| FROM | Để chỉ định hình ảnh gốc. |
|
||||
| WORKDIR | Để đặt thư mục làm việc cho bất kỳ lệnh nào phía sau trong Dockerfile. |
|
||||
| RUN | Để chạy các câu lệnh giúp cài đặt bất kỳ ứng dụng và package nào cần thiết cho container của bạn. |
|
||||
| COPY | Để sao chép các tệp hoặc thư mục từ một vị trí cụ thể. |
|
||||
| ADD | Là COPY, nhưng cũng có thể xử lý các URL và giải nén các tệp nén. |
|
||||
| ENTRYPOINT | Lệnh sẽ luôn được thực thi khi container khởi động. Nếu không được chỉ định, giá trị mặc định là /bin/sh -c |
|
||||
| CMD | Các đối số được chuyển đến điểm vào. Nếu ENTRYPOINT không được cấu hình (mặc định là /bin/sh -c), CMD sẽ là các lệnh mà container thực thi. |
|
||||
| EXPOSE | Để xác định cổng nào để truy cập ứng dụng container của bạn. |
|
||||
| LABEL | Để thêm metadata vào image. |
|
||||
|
||||
Bây giờ chúng ta có chi tiết về cách xây dựng dockerfile đầu tiên, chúng ta có thể tạo một thư mục làm việc và tạo dockerfile. Tôi đã tạo một thư mục làm việc trong repository này, nơi bạn có thể xem các tệp và thư mục mà tôi thực hành. [Container](../../../2022/Days/Containers/)
|
||||
|
||||
Trong thư mục này, tôi sẽ tạo một tệp .dockerignore tương tự như .gitignore mà chúng ta đã sử dụng trong phần trước. Tệp này sẽ liệt kê bất kỳ tệp nào sẽ được tạo trong quá trình xây dựng Docker mà bạn muốn loại bỏ khỏi bản dựng cuối cùng.
|
||||
|
||||
Hãy nhớ rằng mọi thứ về container đều phải nhỏ gọn, nhanh nhất có thể và không bị cồng kềnh.
|
||||
|
||||
Tôi muốn tạo một Dockerfile đơn giản với bố cục bên dưới, nó cũng có thể được tìm thấy trong thư mục được liên kết ở trên.
|
||||
|
||||
```
|
||||
# Use the official Ubuntu 18.04 as base
|
||||
FROM ubuntu:18.04
|
||||
# Install nginx and curl
|
||||
RUN apt-get update && apt-get upgrade -y
|
||||
RUN apt-get install -y nginx curl
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
Điều hướng đến thư mục này trong terminal của bạn, sau đó chạy `docker build -t 90daysofdevops:0.1 .` chúng ta đang sử dụng `-t`, sau đó đặt tên và thẻ cho image.
|
||||
|
||||

|
||||
|
||||
Bây giờ chúng ta đã tạo image của mình, sau đó chúng ta có thể chạy image của mình bằng Docker Desktop hoặc có thể sử dụng câu lệnh với docker. Tôi đã sử dụng Docker Desktop. Tôi đã kích hoạt một container và bạn có thể thấy rằng chúng ta có sẵn gói `curl` trong cli của container.
|
||||
|
||||

|
||||
|
||||
Trong khi Docker Desktop cũng có khả năng tận dụng giao diện người dùng để thực hiện thêm một số tác vụ với image mới này.
|
||||
|
||||

|
||||
|
||||
Chúng ta có thể kiểm tra hình ảnh của mình, khi làm như vậy, bạn sẽ thấy rất nhiều dockerfile và các dòng mã mà chúng ta muốn chạy trong container của mình.
|
||||
|
||||

|
||||
|
||||
Chúng ta có pull option, nếu thử thì chúng ta sẽ thất bại vì image này không được lưu trữ ở bất kỳ đâu nên sẽ gặp lỗi. Tuy nhiên, chúng ta có một tuỳ chọn "Push to Hub" cho phép chúng ta đẩy hình ảnh của mình lên DockerHub.
|
||||
|
||||
Nếu bạn đang sử dụng cùng một lệnh `docker build` mà chúng ta đã chạy trước đó thì nó cũng sẽ không hoạt động, bạn sẽ cần lệnh build là `docker build -t {{username}}/{{imagename}}:{{version}} `
|
||||
|
||||

|
||||
|
||||
Sau đó, nếu xem qua kho lưu trữ DockerHub của chúng ta, bạn có thể thấy rằng chúng ta vừa đẩy một hình ảnh mới. Bây giờ trong Docker Desktop, chúng ta có thể sử dụng pull tab đó.
|
||||
|
||||

|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [TechWorld with Nana - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=3c-iBn73dDE)
|
||||
- [Programming with Mosh - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=pTFZFxd4hOI)
|
||||
- [Docker Tutorial for Beginners - What is Docker? Introduction to Containers](https://www.youtube.com/watch?v=17Bl31rlnRM&list=WL&index=128&t=61s)
|
||||
- [WSL 2 with Docker getting started](https://www.youtube.com/watch?v=5RQbdMn04Oc)
|
||||
- [Blog on gettng started building a docker image](https://stackify.com/docker-build-a-beginners-guide-to-building-docker-images/)
|
||||
- [Docker documentation for building an image](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
|
||||
|
||||
Hẹn gặp lại vào [ngày 46](day46.md)
|
182
2022/vi/Days/day46.md
Normal file
182
2022/vi/Days/day46.md
Normal file
@ -0,0 +1,182 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Docker Compose - Day 46'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Docker Compose
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048740
|
||||
---
|
||||
|
||||
## Docker Compose
|
||||
|
||||
Khả năng chạy một container sẽ rất tuyệt vời nếu bạn có một image độc lập có mọi thứ bạn cần cho trường hợp sử dụng của mình, những mọi thứ trở nên thú vị hơn khi bạn đang tìm cách xây dựng nhiều ứng dụng với các container image khác nhau. Ví dụ: nếu tôi có giao diện người dùng của trang web nhưng yêu cầu có một cơ sở dữ liệu ở phía backend, tôi có thể đặt cả hai vào một container chúng nhưng tốt hơn và hiệu quả hơn là có container cơ sở dữ liệu của riêng ứng dụng đó.
|
||||
|
||||
Đây là nơi Docker compose xuất hiện, đây là một công cụ cho phép bạn chạy các ứng dụng phức tạp hơn trên nhiều container. Với lợi ích là có thể sử dụng một tệp và lệnh duy nhất để khởi động ứng dụng của bạn. Ví dụ tôi sẽ hướng dẫn trong bài đăng này là từ [Ứng dụng mẫu Docker QuickStart (Quickstart: Compose and WordPress)](https://docs.docker.com/samples/wordpress/).
|
||||
|
||||
Trong ví dụ đầu tiên này, chúng ta sẽ:
|
||||
|
||||
- Sử dụng Docker Compose để triển khai WordPress và một MySQL instance riêng.
|
||||
- Sử dụng tệp YAML sẽ được gọi là `docker-compose.yml`
|
||||
- Xây dựng dự án
|
||||
- Định cấu hình WordPress qua trình duyệt web
|
||||
- Dọn dẹp
|
||||
|
||||
### Cài đặt Docker Compose
|
||||
|
||||
Như đã đề cập Docker Compose là một công cụ. Nếu bạn đang sử dụng macOS hoặc Windows thì compose có sẵn trong bản cài đặt Docker Desktop của bạn. Tuy nhiên, bạn có thể muốn chạy container của mình trên máy chủ Windows hoặc máy chủ Linux và trong trường hợp đó, bạn có thể cài đặt bằng cách sử dụng hướng dẫn sau [Cài đặt Docker Compose](https://docs.docker.com/compose/install/)
|
||||
|
||||
Để xác nhận rằng chúng ta đã cài đặt `docker-compose` trên hệ thống của mình, chúng ta có thể mở một terminal và gõ lệnh trên.
|
||||
|
||||

|
||||
|
||||
### Docker-Compose.yml (YAML)
|
||||
|
||||
Điều tiếp theo mà chúng ta đề cập đến là docker-compose.yml, bạn có thể tìm thấy trong [thư mục Container của kho lưu trữ](../../Days/Containers/my_wordpress/docker-compose.yaml). Nhưng quan trọng hơn, chúng ta cần thảo luận về YAML một chút.
|
||||
|
||||
Gần như có thể có một bài riêng về YAML vì bạn sẽ gặp nó ở rất nhiều nơi khác nhau. Nhưng khái quát lại thì:
|
||||
|
||||
"YAML là ngôn ngữ tuần tự hóa dữ liệu (data serialization language) thân thiện với con người sử dụng với tất cả các ngôn ngữ lập trình."
|
||||
|
||||
Nó thường được sử dụng cho các tệp cấu hình và trong một số ứng dụng nhằm lưu trữ hoặc truyền dữ liệu. Chắc chắn bạn đã bắt gặp các tệp XML được dùng để cung cấp cùng một tệp cấu hình đó. YAML cung cấp một cú pháp tối thiểu nhưng nhằm vào các trường hợp sử dụng tương tự.
|
||||
|
||||
YAML Ain't Markup Language (YAML) là ngôn ngữ tuần tự hóa đã phổ biến dần trong vài năm qua. Các khả năng tuần tự hóa đối tượng giúp nó trở thành một sự thay thế khả thi cho các ngôn ngữ như JSON.
|
||||
|
||||
Từ viết tắt YAML là viết tắt của Yet Another Markup Language. Nhưng những người bảo trì đã đổi tên nó thành YAML Ain't Markup Language để nhấn mạnh hơn vào các tính năng hướng dữ liệu của nó.
|
||||
|
||||
Dù sao, hãy quay lại tệp docker-compose.yml. Đây là tệp cấu hình về những gì chúng ta muốn thực hiện khi có nhiều container đang được triển khai trên một hệ thống duy nhất của chúng ta.
|
||||
|
||||
Ngay từ hướng dẫn được liên kết ở trên, bạn có thể thấy nội dung của tệp trông như thế này:
|
||||
```
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
DB:
|
||||
image: mysql:5.7
|
||||
volumes:
|
||||
- db_data:/var/lib/mysql
|
||||
restart: always
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: somewordpress
|
||||
MYSQL_DATABASE: wordpress
|
||||
MYSQL_USER: wordpress
|
||||
MYSQL_PASSWORD: wordpress
|
||||
|
||||
wordpress:
|
||||
depends_on:
|
||||
- db
|
||||
image: wordpress:latest
|
||||
volumes:
|
||||
- wordpress_data:/var/www/html
|
||||
ports:
|
||||
- "8000:80"
|
||||
restart: always
|
||||
environment:
|
||||
WORDPRESS_DB_HOST: db
|
||||
WORDPRESS_DB_USER: wordpress
|
||||
WORDPRESS_DB_PASSWORD: wordpress
|
||||
WORDPRESS_DB_NAME: wordpress
|
||||
volumes:
|
||||
db_data: {}
|
||||
wordpress_data: {}
|
||||
```
|
||||
|
||||
Chúng ta khai báo một phiên bản và sau đó một phần lớn của tệp docker-compose.yml này được tạo thành từ các services, chúng tôi có service DB và service WordPress. Bạn có thể thấy mỗi trong số đó có một image được xác định bằng version tag. Bây giờ chúng ta sẽ tạo các volumes để có thể lưu trữ cơ sở dữ liệu của mình ở đó.
|
||||
|
||||
Sau đó, chúng tôi có một số biến môi trường (environment) như mật khẩu và tên người dùng. Các tệp này có thể trở nên rất phức tạp nhưng tệp cấu hình YAML đơn giản hóa giao diện tổng thể của chúng.
|
||||
|
||||
### Xây dựng dự án
|
||||
|
||||
Tiếp theo, chúng ta quay trở lại terminal của mình và sử dụng một số lệnh với công cụ docker-compose. Điều hướng đến thư mục của bạn, nơi chứa tệp docker-compose.yml.
|
||||
|
||||
Từ terminal, chúng ta chỉ cần chạy `docker-compose up -d`, thao tác này sẽ bắt đầu quá trình pull những image và dựng ứng dụng có nhiều containers của bạn.
|
||||
|
||||
`-d` trong lệnh này có nghĩa là chế độ tách rời (detached mode), có nghĩa là lệnh Run đang hoặc sẽ chạy ở chế độ nền.
|
||||
|
||||

|
||||
|
||||
Nếu bây giờ chúng ta chạy lệnh `docker ps`, bạn có thể thấy chúng ta có 2 containers đang chạy, một là WordPress và một là MySQL.
|
||||
|
||||

|
||||
|
||||
Tiếp theo, chúng ta có thể xác thực việc đã thiết lập và chạy WordPress bằng cách mở trình duyệt và truy cập `http://localhost:8000`, bạn sẽ thấy trang thiết lập WordPress.
|
||||
|
||||

|
||||
|
||||
Chúng tôi có thể trải qua quá trình thiết lập WordPress và sau đó có thể bắt đầu xây dựng trang web của mình với bảng điều khiển bên dưới.
|
||||
|
||||

|
||||
|
||||
Sau đó, nếu chúng ta mở một tab mới và điều hướng đến cùng một địa chỉ mà chúng ta đã làm trước đó `http://localhost:8000` thì sẽ thấy một theme mặc định đơn giản với tiêu đề trang web là "90DaysOfDevOps" và một bài đăng mẫu.
|
||||
|
||||

|
||||
|
||||
Trước khi chúng ta thực hiện bất kỳ thay đổi nào, hãy mở Docker Desktop và điều hướng đến tab Volumes, ở đây bạn sẽ thấy hai volumes được liên kết với containers của chúng ta, một cho wordpress và một cho db.
|
||||
|
||||

|
||||
|
||||
Theme wordpress hiện tại của tôi là "Twenty Twenty-Two" và tôi muốn thay đổi nó thành "Twenty Twenty", chúng ta có thể thực hiện những thay đổi đó trong bảng điều khiển.
|
||||
|
||||

|
||||
|
||||
Tôi cũng sẽ thêm một bài đăng mới vào trang web của mình và bạn có thể thấy phiên bản mới nhất của trang web của chúng ta.
|
||||
|
||||

|
||||
|
||||
### Dọn dẹp hay không
|
||||
|
||||
Nếu bây giờ chúng ta sử dụng lệnh `docker-compose down` thì lệnh này sẽ xoá bỏ những containers của chúng ta nhưng sẽ để lại và giữ nguyên các volumes.
|
||||
|
||||

|
||||
|
||||
Chúng ta có thể xác nhận trong Docker Desktop rằng volumes của chúng ta vẫn còn đó.
|
||||
|
||||

|
||||
|
||||
Sau đó, nếu chúng ta muốn đem mọi thứ trở lại thì có thể sử dụng lệnh `docker up -d` từ trong cùng thư mục và chúng ta có các ứng dụng của mình khởi động và chạy bình thường trở lại.
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng ta truy cập tới cùng một địa chỉ `http://localhost:8000` và nhận thấy rằng bài đăng mới và thay đổi về theme vẫn còn nguyên.
|
||||
|
||||

|
||||
|
||||
Nếu chúng ta muốn loại bỏ các containers và các volumes đó thì việc sử dụng lệnh `docker-compose down --volumes` cũng sẽ xoá bỏ các volumes.
|
||||
|
||||

|
||||
|
||||
Bây giờ, khi chúng ta sử dụng lại `docker-compose up -d`, các ứng dụng sẽ khởi động lại, tuy nhiên, các image đã có sẵn hệ thống của chúng ta nên sẽ không cần phải pull lại chúng từ kho lưu trữ DockerHub.
|
||||
|
||||
Thú thật rằng khi tôi bắt đầu tìm hiểu về docker-compose và các khả năng của nó, tôi đã bối rối không biết nó nằm ở đâu bên cạnh hoặc với các công cụ Điều phối containers (Container Orchestration) như Kubernetes, mọi thứ chúng ta đã làm ở đây trong bản demo ngắn này đều tập trung vào một máy chủ khi chạy WordPress và DB trên máy tính để bàn cục bộ. Chúng ta không có nhiều máy ảo hoặc nhiều máy chủ vật lý, chúng ta cũng không thể dễ dàng mở rộng và thu nhỏ các yêu cầu của ứng dụng của mình.
|
||||
|
||||
Phần tiếp theo của chúng tôi sẽ đề cập đến Kubernetes nhưng trước tiên chúng tôi có một vài ngày nữa về Container nói chung.
|
||||
|
||||
Đây cũng là một nguồn tài nguyên tuyệt vời cho các mẫu ứng dụng docker-compose với nhiều tích hợp khác nhau. [Awesome-Compose](https://github.com/docker/awesome-compose)
|
||||
|
||||
Trong kho lưu trữ ở trên, có một ví dụ tuyệt vời sẽ triển khai Elaticsearch, Logstash và Kibana (ELK) cho một node.
|
||||
|
||||
Tôi đã tải các tệp lên [Thư mục vùng chứa](../Days/Containers/elasticsearch-logstash-kibana/) Khi bạn có thư mục này ở máy tính của bạn, hãy điều hướng đến đó và bạn chỉ cần sử dụng `docker-compose up -d`
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng ta có thể kiểm tra các containers đang chạy với câu lệnh `docker ps`
|
||||
|
||||

|
||||
|
||||
Bây giờ chúng ta có thể mở trình duyệt cho từng vùng chứa:
|
||||
|
||||

|
||||
|
||||
Để xóa mọi thứ, chúng ta có thể sử dụng lệnh `docker-compose down`.
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [TechWorld with Nana - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=3c-iBn73dDE)
|
||||
- [Programming with Mosh - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=pTFZFxd4hOI)
|
||||
- [Docker Tutorial for Beginners - What is Docker? Introduction to Containers](https://www.youtube.com/watch?v=17Bl31rlnRM&list=WL&index=128&t=61s)
|
||||
- [WSL 2 with Docker getting started](https://www.youtube.com/watch?v=5RQbdMn04Oc)
|
||||
- [Blog on getting started building a docker image](https://stackify.com/docker-build-a-beginners-guide-to-building-docker-images/)
|
||||
- [Docker documentation for building an image](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
|
||||
- [YAML Tutorial: Everything You Need to Get Started in Minute](https://www.cloudbees.com/blog/yaml-tutorial-everything-you-need-get-started)
|
||||
|
||||
Hẹn gặp bạn vào [ngày 47](day47.md)
|
144
2022/vi/Days/day47.md
Normal file
144
2022/vi/Days/day47.md
Normal file
@ -0,0 +1,144 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Docker Networking & Security - Ngày 47'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Docker Networking & Security
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1049078
|
||||
---
|
||||
|
||||
## Docker Networking & Security
|
||||
|
||||
Trong loạt bài viết về container chúng ta đã xem xét qua mọi thứ nhưng chưa xem xét cách mọi thứ hoạt động ở phía sau từ góc độ network và cũng chưa đề cập tới bảo mật, nó sẽ được đề cập trong bài viết này.
|
||||
|
||||
### Khái niệm cơ bản về Docker networking
|
||||
|
||||
Mở một terminal và gõ lệnh `docker network`, đây là câu lệnh chính để định cấu hình và quản lý mạng container.
|
||||
|
||||
Theo như bên dưới, bạn có thể thấy đây là cách chúng ta có thể sử dụng lệnh và các lệnh phụ có sẵn. Chúng ta có thể tạo các mạng mới, liệt kê cách mạng hiện có, kiểm tra và xoá các mạng.
|
||||
|
||||

|
||||
|
||||
Hãy xem qua các mạng hiện có mà chúng ta có kể từ khi cài đặt, mạng Docker có sẵn dùng trông giống như sử dụng lệnh `docker network list`.
|
||||
|
||||
Mỗi mạng có một NAME và ID duy nhất. Mỗi mạng cũng được liên kết với một driver duy nhất. Lưu ý rằng mạng "bridge" và mạng "host" có cùng tên với driver tương ứng của chúng.
|
||||
|
||||

|
||||
|
||||
Tiếp theo, chúng ta có thể xem xét kỹ hơn các mạng của mình bằng lệnh `docker network inspect`.
|
||||
|
||||
Khi tôi chạy lệnh `docker network inspect bridge`, tôi có thể nhận được tất cả các chi tiết cấu hình của mạng cụ thể đó. Điều này bao gồm tên, ID, driver, container được liên kết và như bạn thấy, có rất nhiều thông tin khác.
|
||||
|
||||

|
||||
|
||||
### Docker: Bridge Networking
|
||||
|
||||
Như bạn đã thấy ở trên, bản cài đặt tiêu chuẩn của Docker Desktop cung cấp cho chúng ta một mạng dựng sẵn có tên là `bridge`. Nếu bạn xem lại lệnh `docker network list`, bạn có thể thấy rằng mạng được gọi là bridge được liên kết với driver `bridge`. Chỉ vì chúng có cùng tên không có nghĩa chúng giống nhau. Được liên kết nhưng không giống nhau.
|
||||
|
||||
Đầu ra ở trên cũng cho thấy rằng mạng bridge có phạm vi cục bộ. Điều này có nghãi là mạng chỉ tồn tại trên máy chủ Docker này. Điều này đúng với tất cả các mạng sử dụng driver bridge - bridge driver cung cấp mạng cho single-host.
|
||||
|
||||
Tất cả các mạng được tạo bằng bridge driver đều dựa trên cấu hình Linux bridge (còn gọi là virtual switch)
|
||||
|
||||
### Kết nối tới một container
|
||||
|
||||
Theo mặc định, bridge network được gán cho các container mới, nghĩa là trừ khi bạn chỉ định một mạng cụ thể, tất các các container sẽ được kết nối với mạng bridge.
|
||||
|
||||
Hãy tạo một container mới với câu lệnh `docker run -dt ubuntu sleep infinity`
|
||||
|
||||
|
||||
Lệnh sleep ở trên chỉ để giữ cho container chạy ở chế độ nền để chúng ta có thể thực hành với nó.
|
||||
|
||||

|
||||
|
||||
Sau đó, nếu chúng ta kiểm tra mạng bridge của mình với lệnh `docker network inspect bridge`, bạn sẽ thấy rằng chúng ta có một container khớp với những gì chúng ta vừa triển khai vì chúng ta đã không chỉ định một mạng nào cho nó.
|
||||
|
||||

|
||||
|
||||
Bạn cũng có thể đi sâu vào container bằng cách sử dụng `docker exec -it 3a99af449ca2 bash`, bạn sẽ phải sử dụng `docker ps` để lấy container id của bạn.
|
||||
|
||||
Từ đây, image của chúng ta không có gì để ping nên chúng ta cần chạy thêm lệnh sau `apt-get update && apt-get install -y iputils-ping` sau đó ping một địa chỉ bên ngoài. `ping -c5 www.90daysofdevops.com`
|
||||
|
||||

|
||||
|
||||
Để xoá bỏ container, chúng ta có thể chạy lại lệnh `docker stop 3a99af449ca2` và sử dụng lệnh `docker ps` để kiểm tra.
|
||||
|
||||
### Cấu hình NAT cho kết nối bên ngoài
|
||||
|
||||
Trong bước này, chúng ta sẽ bắt đầu một NGINX container mới và map port 8080 trên máy chủ Docker tới cổng 80 bên trong container. Điều này có nghĩa là các truy cập vào máy chủ Docker trên cổng 8080 sẽ được chuyển sang cổng 80 bên trong container.
|
||||
|
||||
Bắt đầu một container mới dựa trên NGINX image chính thức bằng cách chạy `docker run --name web1 -d -p 8080:80 nginx`
|
||||
|
||||

|
||||
|
||||
Xem lại trạng thái của container và port mapping bằng cách chạy `docker ps`
|
||||
|
||||

|
||||
|
||||
Dòng trên cùng hiển thị container web1 mới đang chạy NGINX. Lưu ý lệnh mà container đang chạy cũng như port mapping - `0.0.0.0:8080->80/tcp` ánh xạ cổng 8080 trên tất cả các interfaces của máy chủ tới cổng 80 bên trong container web1. Port mapping này là yếu tố làm cho dịch vụ web của container có thể truy cập hiệu quả từ bên ngoài (thông qua địa chỉ IP máy chủ Docker trên cổng 8080).
|
||||
|
||||
Bây giờ chúng ta cần địa chỉ IP cho máy chủ thực tế của mình, có thể thực hiện việc này bằng cách vào WSL terminal của mình và sử dụng lệnh `IP addr`.
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng tôi có thể lấy IP này, mở trình duyệt và truy cập `http://172.25.218.154:8080/` IP của bạn có thể khác. Điều này xác nhận rằng có thể truy cập được NGINX.
|
||||
|
||||

|
||||
|
||||
Tôi đã thực hiện các hướng dẫn của trang web này từ DockerCon 2017 nhưng chúng vẫn còn phù hợp cho đến ngày nay. Tuy nhiên, phần còn lại của hướng dẫn đi sâu vào Docker Swarm và chúng ta sẽ không xem xét điều đó ở đây. [Mạng Docker - DockerCon 2017](https://github.com/docker/labs/tree/master/dockercon-us-2017/docker-networking)
|
||||
|
||||
### Bảo vệ container của bạn
|
||||
|
||||
Container cung cấp môi trường an toàn cho workloads của bạn so với cấu hình một máy chủ đầy đủ. Chúng cung cấp khả năng chia nhỏ các ứng dụng của bạn thành nhiều thành phần nhỏ hơn, được liên kết lỏng lẻo, mỗi thành phần được tách biệt với nhau, giúp giảm tổng thể bề mặt cho các cuộc tấn công.
|
||||
|
||||
Nhưng chúng không tránh khỏi các tin tặc đang tìm cách khai thác hệ thống. Chúng ta vẫn cần hiểu những nguy cơ bảo mật của công nghệ và tuân thủ, áp dụng các thực hành tốt nhất.
|
||||
|
||||
### Di chuyển khỏi quyền root
|
||||
|
||||
Tất cả các container mà chúng ta đã triển khai đều đang sử dụng quyền root đối với process trong container của bạn. Điều này có nghĩa là họ có toàn quyền truy cập của admin vào môi trường máy chủ và vùng chứa của bạn. Chúng ta đều đã biết rằng những hệ thống này sẽ không hoạt động lâu dài. Nhưng bạn cũng đã thấy rằng để khởi động và chạy chúng dễ dàng như thế nào.
|
||||
|
||||
Chúng ta có thể thêm một vài bước vào quy trình của chúng ta để sử dụng người dùng không phải root như một thực hành tốt nhất mà chúng ta ưu tiên. Khi tạo các tệp dockerfile, chúng ta có thể tạo tài khoản người dùng. Bạn cũng có thể tìm thấy ví dụ này trong [thư mục container](../../Days/Containers/Dockerfile)
|
||||
|
||||
```
|
||||
# Use the official Ubuntu 18.04 as base
|
||||
FROM ubuntu:18.04
|
||||
RUN apt-get update && apt-get upgrade -y
|
||||
RUN groupadd -g 1000 basicuser && useradd -r -u 1000 -g basicuser basicuser
|
||||
USER basicuser
|
||||
```
|
||||
|
||||
We can also use `docker run --user 1009 ubuntu` the Docker run command overrides any user specified in your Dockerfile. Therefore, in the following example, your container will always run with the least privilege—provided user identifier 1009 also has the lowest permission level.
|
||||
|
||||
However, this method doesn’t address the underlying security flaw of the image itself. Therefore it’s better to specify a non-root user in your Dockerfile so your containers always run securely.
|
||||
|
||||
Chúng ta cũng có thể sử dụng `docker run --user 1009 ubuntu` lệnh Docker run sẽ ghi đè bất kỳ người dùng nào được chỉ định trong Dockerfile. Do đó, trong ví dụ sau, container của bạn sẽ luôn chạy với ít đặc quyền nhất và mã định danh người dùng 1009 cũng có mức cấp phép thấp nhất.
|
||||
|
||||
Tuy nhiên, phương pháp này không giải quyết được lỗ hổng bảo mật tiềm ẩn của chính image đó. Do đó, tốt hơn là chỉ định người dùng không phải root trong Dockerfile của bạn để vùng chứa của bạn luôn chạy an toàn.
|
||||
|
||||
### Private Registry
|
||||
|
||||
Một điều khác mà chúng ta đã sử dụng nhiều là các registry công khai như DockerHub. Thay vào đó, sử dụng một private registry chứa các container image do tổ chức của bạn có nghĩa là bạn có thể lưu trữ ở nơi bạn muốn hoặc cũng có các dịch vụ được quản lý sẵn cho việc này, nhưng nhìn chung, điều này mang lại cho bạn quyền kiểm soát hoàn toàn các image cho bạn và nhóm của bạn.
|
||||
|
||||
DockerHub cung cấp cho bạn một điểm bắt đầu rất tốt, nhưng nó chỉ cung cấp cho bạn một dịch vụ cơ bản mà bạn phải đặt nhiều niềm tin vào các image publisher.
|
||||
|
||||
### Tinh gọn và sạch sẽ
|
||||
|
||||
Tôi đã đề cập đến việc này trong suốt các bài viết về container, mặc dù nó không liên quan tới bảo mật. Nhưng kích thước container của bạn có thể ảnh hưởng đến bảo mặt trên khía cạnh về bề mặt tấn công. Nếu bạn có tài nguyên mà bạn không sử dụng trong ứng dụng của mình thì bạn không cần nó trong container của mình.
|
||||
|
||||
Đây cũng là mối quan tâm chính của tôi với việc lấy các hình ảnh `latest` bởi vì điều đó cũng có thể làm cho image của bạn lớn lên rất nhiều. DockerHub cũng hỗ trợ hiển thị kích thước sau khi nén cho từng hình ảnh ở trong kho lưu trữ.
|
||||
|
||||
`docker image` là một câu lệnh tốt để kiểm tra kích thước các image của bạn.
|
||||
|
||||

|
||||
|
||||
## Resources
|
||||
|
||||
- [TechWorld with Nana - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=3c-iBn73dDE)
|
||||
- [Programming with Mosh - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=pTFZFxd4hOI)
|
||||
- [Docker Tutorial for Beginners - What is Docker? Introduction to Containers](https://www.youtube.com/watch?v=17Bl31rlnRM&list=WL&index=128&t=61s)
|
||||
- [WSL 2 with Docker getting started](https://www.youtube.com/watch?v=5RQbdMn04Oc)
|
||||
- [Blog on getting started building a docker image](https://stackify.com/docker-build-a-beginners-guide-to-building-docker-images/)
|
||||
- [Docker documentation for building an image](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
|
||||
- [YAML Tutorial: Everything You Need to Get Started in Minute](https://www.cloudbees.com/blog/yaml-tutorial-everything-you-need-get-started)
|
||||
|
||||
Hẹn gặp lại vào [ngày 48](day48.md)
|
115
2022/vi/Days/day48.md
Normal file
115
2022/vi/Days/day48.md
Normal file
@ -0,0 +1,115 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Các lựa chọn thay thế cho Docker - Ngày 48'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Các lựa chọn thay thế cho Docker
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048807
|
||||
---
|
||||
|
||||
## Các lựa chọn thay thế cho Docker
|
||||
|
||||
Tôi đã nói ngay từ đầu rằng chúng ta sẽ sử dụng Docker cho loạt bài viết về Container, đơn giản vì có rất nhiều tài nguyên và cộng động sử dụng rất lớn, ngoài ra nó cũng là lý do khiến container trở nên phổ biến. Tôi nghĩ chúng ta nên tìm hiểu về lịch sử hình thành và phát triển của Docker, tôi thấy nó rất hữu ích.
|
||||
|
||||
Nhưng như tôi đã đề cập, chúng ta có những lựa chọn khác thay thế cho Docker. Nếu chúng ta nghĩ Docker là gì và nó giúp gì cho chúng ta thì nó là một nền tảng để phát triển, kiểm thử, triển khai và quản lý các ứng dụng.
|
||||
|
||||
Tôi muốn làm nổi bật một vài lựa chọn thay thế cho Docker mà bạn có thể hoặc sẽ thấy trong tương lai.
|
||||
|
||||
### Podman
|
||||
|
||||
Podman là gì? Podman là một container engine không sử dụng deamon nhằm phát triển, quản lý và chạy các bộ OCI containers trên hệ thống Linux. Các containers có thể được chạy với quyền root và non-root.
|
||||
|
||||
Tôi sẽ xem xét điều này từ quan điểm của Windows nhưng biết rằng giống như Docker, không có yêu cầu ảo hoá ở đó vì nó sẽ sử dụng Hệ điều hành cơ bản, điều không thể thực hiện được với Windows.
|
||||
|
||||
Podman có thể chạy trên WSL2 mặc dù không có một trải nghiệm mượt mà như với Docker Desktop. Ngoài ra còn có thể sử dụng Windows client để kết nối tới một Linux VM nơi mà containers của bạn sẽ chạy.
|
||||
|
||||
Ubuntu của tôi trên WSL2 là phiên bản 20.04. Làm theo các bước tiếp theo sẽ cho phép bạn cài đặt Podman trên phiên bản WSL của mình
|
||||
|
||||
```Shell
|
||||
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /" |
|
||||
sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
|
||||
```
|
||||
Thêm khoá GPG
|
||||
|
||||
```Shell
|
||||
curl -L "https://download.opensuse.org/repositories/devel:/kubic:\
|
||||
/libcontainers:/stable/xUbuntu_20.04/Release.key" | sudo apt-key add -
|
||||
```
|
||||
|
||||
Chạy bản cập nhật và nâng cấp hệ thống bằng lệnh `sudo apt-get update && sudo apt-get upgrade`. Cuối cùng, chúng ta có thể cài đặt podman bằng `sudo apt install podman`
|
||||
|
||||
Bây giờ chúng ta có thể sử dụng rất nhiều lệnh tương tự với docker, lưu ý rằng chúng ta không có giao diện người dùng đẹp mắt giống docker. Bạn có thể thấy bên dưới tôi đã sử dụng `podman images` và không có gì sau khi cài đặt, sau đó tôi đã sử dụng `podman pull ubuntu` để kéo container image của ubuntu xuống.
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng tôi có thể chạy hình ảnh Ubuntu của mình bằng cách sử dụng `podman run -dit ubuntu` và `podman ps` để xem hình ảnh đang chạy của chúng ta.
|
||||
|
||||

|
||||
|
||||
Sau đó, để truy cập vào container đó, chúng ta có thể chạy `podman attach dazzling_darwin` tên container của bạn rất có thể sẽ khác.
|
||||
|
||||

|
||||
|
||||
Nếu bạn đang chuyển từ docker sang podman, bạn cũng nên thay đổi tệp cấu hình của mình thành `alias docker=podman` theo cách đó, bất kỳ lệnh nào bạn chạy với docker cũng sẽ sử dụng podman.
|
||||
|
||||
### LXC
|
||||
|
||||
LXC là một container engine cho phép người dùng tạo nhiều Linux container được cô lập. Không giống như Docker, LXC hoạt động như một trình ảo hóa để tạo nhiều máy Linux với các tệp hệ thống riêng biệt và các tính năng, cấu hình mạng. Xuất hiện trước Docker và sau đó quay trở lại trong thời gian ngắn do những thiếu sót của Docker.
|
||||
|
||||
LXC nhẹ như docker và dễ dàng triển khai.
|
||||
|
||||
### Containerd
|
||||
|
||||
Một standalone container runtime. Containerd mang lại sự đơn giản và mạnh mẽ cũng như tính di động. Containerd trước đây là một công cụ trong các dịch vụ container của Docker cho đến khi Docker quyết định tách nó ra thành một thành phần độc lập.
|
||||
|
||||
Một dự án trong Cloud Native Computing Foundation, nó được đặt cùng với các công cụ vùng chứa phổ biến như Kubernetes, Prometheus và CoreDNS.
|
||||
|
||||
### Các công cụ Docker khác
|
||||
|
||||
Chúng ta cũng có thể đề cập đến các công cụ và tùy chọn xung quanh Rancher và VirtualBox nhưng có thể sẽ trình bày chi tiết hơn vào một bài viết khác.
|
||||
|
||||
[**Gradle**](https://gradle.org/)
|
||||
|
||||
- Quét bản dựng cho phép các nhóm cộng tác gỡ lỗi và theo dõi lịch sử của tất cả các bản dựng.
|
||||
- Các tùy chọn thực thi cung cấp cho các nhóm khả năng xây dựng liên tục để bất cứ khi nào có thay đổi, nhiệm vụ sẽ tự động được thực thi.
|
||||
- Bố cục kho lưu trữ tùy chỉnh cung cấp cho các nhóm khả năng xử lý bất kỳ cấu trúc thư mục tệp nào dưới dạng kho lưu trữ cho artifact.
|
||||
|
||||
[**Packer**](https://packer.io/)
|
||||
|
||||
- Khả năng tạo song song nhiều hình ảnh máy để tiết kiệm thời gian của nhà phát triển và tăng hiệu quả.
|
||||
- Các nhóm có thể dễ dàng gỡ lỗi các bản dựng bằng trình gỡ lỗi của Packer, công cụ này sẽ kiểm tra các lỗi và cho phép các nhóm thử các giải pháp trước khi bắt đầu lại các bản dựng.
|
||||
- Hỗ trợ nhiều nền tảng thông qua plugin để các nhóm có thể tùy chỉnh bản dựng của mình.
|
||||
|
||||
|
||||
[**Logspout**](https://github.com/gliderlabs/logspout)
|
||||
|
||||
- Công cụ ghi log - Khả năng tùy chỉnh của công cụ này cho phép các nhóm gửi cùng một nhật ký đến nhiều điểm đến.
|
||||
- Các nhóm có thể dễ dàng quản lý các tệp của họ vì công cụ này chỉ yêu cầu quyền truy cập vào Docker socket.
|
||||
- Mã nguồn mở và dễ triển khai.
|
||||
|
||||
[**Logstash**](https://www.elastic.co/products/logstash)
|
||||
|
||||
- Tùy chỉnh quy trình của bạn và dễ dàng tích hợp với Logstash pluggable framework.
|
||||
- Dễ dàng phân tích cú pháp và chuyển đổi dữ liệu của bạn để phân tích và mang lại giá trị kinh doanh.
|
||||
- Nhiều đầu ra khác nhau của Logstash cho phép bạn định tuyến dữ liệu của mình đến nơi bạn muốn.
|
||||
|
||||
[**Portainer**](https://www.portainer.io/)
|
||||
|
||||
- Sử dụng các mẫu được tạo sẵn hoặc tạo mẫu của riêng bạn để triển khai các ứng dụng.
|
||||
- Tạo nhóm và gán vai trò và quyền cho các thành viên trong nhóm.
|
||||
- Biết những gì đang chạy trong từng môi trường bằng bảng điều khiển của công cụ.
|
||||
|
||||
## Tài nguyên tham khảo
|
||||
|
||||
- [TechWorld with Nana - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=3c-iBn73dDE)
|
||||
- [Programming with Mosh - Docker Tutorial for Beginners](https://www.youtube.com/watch?v=pTFZFxd4hOI)
|
||||
- [Docker Tutorial for Beginners - What is Docker? Introduction to Containers](https://www.youtube.com/watch?v=17Bl31rlnRM&list=WL&index=128&t=61s)
|
||||
- [WSL 2 with Docker getting started](https://www.youtube.com/watch?v=5RQbdMn04Oc)
|
||||
- [Blog on getting started building a docker image](https://stackify.com/docker-build-a-beginners-guide-to-building-docker-images/)
|
||||
- [Docker documentation for building an image](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
|
||||
- [YAML Tutorial: Everything You Need to Get Started in Minute](https://www.cloudbees.com/blog/yaml-tutorial-everything-you-need-get-started)
|
||||
- [Podman | Daemonless Docker | Getting Started with Podman](https://www.youtube.com/watch?v=Za2BqzeZjBk)
|
||||
- [LXC - Guide to building an LXC Lab](https://www.youtube.com/watch?v=cqOtksmsxfg)
|
||||
|
||||
Hẹn gặp lại vào [ngày 49](day49.md)
|
215
2022/vi/Days/day49.md
Normal file
215
2022/vi/Days/day49.md
Normal file
@ -0,0 +1,215 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Bức tranh toàn cảnh: Kubernetes - Ngày 49'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Bức tranh toàn cảnh: Kubernetes
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1049049
|
||||
---
|
||||
|
||||
## Bức tranh toàn cảnh: Kubernetes
|
||||
|
||||
Trong phần trước, chúng ta đã đề cập đến Containers, container chưa đạt yêu cầu khi xem xét khía cạnh điều chỉnh quy mô (scaling) và điều phối (orchestration). Thứ tốt nhất chúng ta có thể làm là docker-compose để tạo một ứng dụng với nhiều container. Khi nói đến Kubernetes, một Container Orchestrator, nó mang lại chúng ta khả năng tăng và giảm quy mô một cách tự động hoặc dựa trên tải ứng dụng và dịch vụ của bạn.
|
||||
|
||||
Là một nền tảng, Kubernetes cung cấp khả năng sắp xếp các container theo yêu cầu và trạng thái mong muốn của bạn. Chúng ta sẽ đề cập đến Kubernetes trong phần này vì nó đang nổi lên là một cách để triển khai cơ sở hạ tầng tiếp theo. Tôi cũng đề xuất rằng, từ góc độ DevOps, Kubernetes chỉ là một nền tảng mà bạn cần có hiểu biết cơ bản, cũng như về bare metal, ảo hoá và rất có thể là các dịch vụ dựa trên điện toán đám mây. Kubernetes chỉ là một tuỳ chọn khác để chạy các ứng dụng của bạn.
|
||||
|
||||
### Container Orchestration (Điều phối container) là gì?
|
||||
|
||||
Tôi đã đề cập tới Kubernetes và tôi đã đề cập tới Container Orchestration, Kubernetes là công nghệ trong khi điều phối container là khái niệm, quy trình phía sau công nghệ đó. Kubernetes không phải là nền tảng Điều phối container duy nhất mà chúng ta còn có Docker Swarm, HashiCorp Nomad và các nền tảng khác. Nhưng Kubernetes đang phát triển ngày càng mạnh mẽ, vì vậy tôi muốn đề cập đến Kubernetes nhưng muốn nói rằng nó không phải công nghệ duy nhất ngoài kia.
|
||||
|
||||
### Kubernetes là gì?
|
||||
|
||||
Điều đầu tiên bạn nên đọc nếu bạn chưa quen với Kubernetes là tài liệu chính thức. Kinh nghiệm của tôi khi thực sự tìm hiểu sâu về Kubernetes hơn một năm trước là đó sẽ là một quá trình học tập đòi hỏi nhiều thời gian. Xuất phát từ nền tảng ảo hoá và lưu trữ, tôi đã nghĩ nó sẽ rất khó khăn.
|
||||
|
||||
Nhưng cộng động và tài nguyên học tập miễn phí và các tư liệu cực kỳ tốt. [Kubernetes.io](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/)
|
||||
|
||||
_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._
|
||||
|
||||
Những điều quan trọng cần lưu ý trong câu trích dẫn trên, Kubernetes là dự án mã nguồn mở với lịch sử bắt nguồn từ Google, người đã trao tặng dự án cho tổ chức Cloud Native Computing Foundation (CNCF) và nó hiện cũng đang được phát triển bởi cộng đồng mã nguồn mở và các doanh nghiệp lớn góp phần tạo nên Kubernetes như ngày nay.
|
||||
|
||||
Tôi đã đề cập ở trên về việc các container tốt như thế nào và trong phần trước, chúng ta đã nói về cách container và các container image đã thay đổi và đẩy nhanh việc áp dụng các hệ thống cloud-native. Nhưng chỉ riêng container sẽ không cung cấp trải nghiệm sẵn sàng cho môi trường sản xuất của các ứng dụng của bạn. Kubernetes cung cấp cho chúng ta những điều sau:
|
||||
|
||||
- **Phát hiện dịch vụ (Service discovery) và cân bằng tải (load balancing)** Kubernetes có thể expose 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, Kubernetes 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ữ (Storage orchestration)** Kubernetes 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ộ (local storage) 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 và khôi phục (Automated rollouts and rollbacks)** 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 Kubernetes và nó có thể thay đổi trạng thái mong muốn với tốc độ được kiểm soát. Ví dụ: bạn có thể tự động hoá Kubernetes để 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 Kubernetes một cluster gồm nhiều 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 Kubernetes biết lượng CPU và bộ nhớ (RAM) mà mỗi container cần. Kubernetes 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** Kubernetes 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 health-check 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à bí mật (Secret and configuration management)** Kubernetes 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 SSH keys. 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 container image cũng như không để lộ các giá trị đó trong cấu hình hệ thống của bạn.
|
||||
|
||||
Kubernetes cung cấp cho bạn một framework để chạy các hệ thống phân tán một cách linh hoạt.
|
||||
|
||||
Container Orchestration quản lý việc triển khai, sắp xếp và vòng đời của các containers.
|
||||
|
||||
Nó cũng có các nhiệm vụ khác:
|
||||
|
||||
- Quản lý, liên kết các máy chủ thành một cluster.
|
||||
- Quản lý lập lịch, sắp xếp các containers trên các nodes thông qua scheduler.
|
||||
- Khám phá dịch vụ (service discovery) biết vị trí của các containers trong các nodes thông qua scheduler.
|
||||
- Đảm bảo đủ số lượng nodes và containers cho khối lượng công việc được yêu cầu thông qua replication.
|
||||
- Quản lý sức khoẻ, phát hiện và thay thế các nodes, containers.
|
||||
|
||||
### Các thành phần chính của Kubernetes
|
||||
|
||||
Kubernetes là một công cụ điều phối containers cho phép cung cấp, quản lý và mở rộng quy mô ứng dụng. Bạn có thể sử dụng nó để quản lý vòng đời của các ứng dụng được container hoá trong các nodes của một cluster - là một tập hợp các máy worker như các máy ảo hoặc các máy vật lý.
|
||||
|
||||
Ứng dụng của bạn có thể cần nhiều tài nguyên khác để chạy, chẳng hạn như ổ đĩa, mạng và các giá trị bí mật giúp bạn kết nối với cơ sở dữ liệu, nói chuyện với các hệ thống được bảo vệ bởi tường lửa và khóa bảo mật. Với Kubernetes, bạn có thể thêm các tài nguyên đó vào ứng dụng của mình. Tài nguyên cơ sở hạ tầng mà ứng dụng của bạn cần sẽ được quản lý quản lý theo dạng khai báo.
|
||||
|
||||
Hình mẫu chính (key paradigm) của Kubernetes là mô hình khai báo của nó. Bạn cung cấp trạng thái mà bạn muốn và Kubernetes sẽ biến nó thành hiện thực. Nếu bạn cần năm instances, thì bạn không tự mình khởi động năm instances riêng biệt. Thay vào đó, bạn nói với Kubernetes rằng bạn cần năm instances và Kubernetes sẽ tự động điều chỉnh trạng thái. Nếu xảy ra sự cố với một trong các instances của bạn, Kubernetes vẫn biết trạng thái mà bạn muốn và tạo các instances trên một node có sẵn.
|
||||
|
||||
### Node
|
||||
|
||||
#### Control Plane
|
||||
|
||||
Mỗi Kubernetes cluster yêu cầu một Control plane node, các thành phần của control plane đưa ra các quyết định chung về cluster đó (ví dụ: lập lịch), cũng như phát hiện và phản hồi các sự kiện của cluster.
|
||||
|
||||

|
||||
|
||||
#### Worker Node
|
||||
|
||||
Một máy worker chạy khối lượng công vuệc của Kubernetes. Nó có thể là một máy vật lý (bare metal) hoặc máy ảo (VM). Mỗi node có thể lưu trữ một hoặc nhiều pods. Các nodes của Kubernetes được quản lý bởi một control plane.
|
||||
|
||||

|
||||
|
||||
Có nhiều loại node khác nữa nhưng tôi sẽ không đề cập tại đây.
|
||||
|
||||
#### kubelet
|
||||
|
||||
Một agent chạy trên mọi node trong cluster. Nó đảm bảo rằng các containers đang được chạy trong pod.
|
||||
|
||||
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à khoẻ mạnh. Kubelet không quản lý các containers không được tạo bởi Kubernetes.
|
||||
|
||||

|
||||
|
||||
#### kube-proxy
|
||||
|
||||
|
||||
kube-proxy là một proxy mạng chạy trên mỗi node trong cluster của bạn, triển khai một phần của khái niệm Kubernetes Service.
|
||||
|
||||
kube-proxy duy trì các quy tắc mạng trên các nodes. Các quy tắc mạng này cho phép giao tiếp mạng với các Pods của bạn từ các sessions mạnh bên trong hoặc bên ngoài cluster của bạn.
|
||||
|
||||
kube-proxy sử dụng lớp lọc gói tin (packet filtering layer) của hệ điều hành nếu có thể. Nếu không, kube-proxy tự chuyển tiếp traffic.
|
||||
|
||||

|
||||
|
||||
#### Container runtime
|
||||
|
||||
The container runtime là phần mềm chịu trách nhiệm chạy các containers.
|
||||
|
||||
Kubernetes hỗ trợ một số container runtimes: Docker, containerd, CRI-O, và mọi các triển khai của Kubernetes CRI (Container Runtime Interface).
|
||||
|
||||

|
||||
|
||||
### Cluster
|
||||
|
||||
Cluster là một nhóm các nodes, trong đó một node có thể là một máy vật lý hoặc một máy ảo. Mỗi node sẽ có container runtime (Docker) và cũng sẽ chạy một kubelet service, là agent nhận các lệnh từ Master controller (sẽ nói thêm sau) và một Proxy được sử dụng để kết nối proxy tới các Pods khác từ một thành phần khác (Services, thứ mà chúng ta sẽ đề cập sau).
|
||||
|
||||
Control plane của chúng ta có thể được triển khai với độ sẵn sàng cao (HA) sẽ chứa một số vai trò khác biệt với các worker nodes, quan trọng nhất sẽ là máy chủ kube API, đây là nơi sẽ diễn ra mọi giao tiếp để lấy thông tin hoặc đẩy thông tin đến Kubernetes cluster của chúng ta.
|
||||
|
||||
#### 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 pods, services, replication controllers, và các đối tượng khác. Máy chủ API phụ vụ các tác vụ REST và cung cấp giao diện người dùng cho các trạng thái được chia sẻ của cluster qua đó tất cả các thành phần khác có thể tương tác.
|
||||
|
||||
#### Scheduler
|
||||
|
||||
Kubernetes scheduler (bộ lập lịch) là một quy trình của control plane lập lịch các Pods cho các Nodes. Scheduler xác định node nào là vị trí thích hợp cho từ pod trong hàng đợi lập lịch theo các ràng buộc và tài nguyên sẵn có. Sau đó, Scheduler sẽ xếp hạng từng node hợp lệ gắn pod vào một node thích hợp.
|
||||
|
||||
#### Controller Manager
|
||||
|
||||
Kubernetes 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 Kubernetes, 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 cluster 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.
|
||||
|
||||
#### etcd
|
||||
|
||||
Kho lưu trữ dạng key-value 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 Kubernetes cluster.
|
||||
|
||||

|
||||
|
||||
#### kubectl
|
||||
|
||||
Để quản lý Kubernetes cluster bằng CLI, chúng ta có kubectl, kubectl tương tác với API server.
|
||||
|
||||
Công cụ dòng lệnh của Kubernetes, kubectl cho phép bạn chạy các lệnh tương tác với Kubernetes cluster. Bạn có thể sử dụng kubectl để triển khai ứng dụng, kiểm tra và quản lý tài nguyên của cluster cũng như xem log.
|
||||
|
||||

|
||||
|
||||
### Pods
|
||||
|
||||
Pod là một nhóm các container tạo thành một ứng dụng logic. Ví dụ: Nếu bạn có một ứng dụng web đang chạy nodejs container và một MySQL container thì cả hai containers này có thể được đặt trong một pod duy nhất. Một pod cũng có thể chia sẻ các volumes dữ liệu chung và chúng cũng chia sẻ một networking namespace. Hãy nhớ rằng các pod là tạm thời và chúng có thể được bật hoặc tắt bởi Master Controller. Kubernetes sử dụng một phương tiện đơn giản nhưng hiệu quả để xác định các pod thông qua khái niệm Labels (nhãn: key - values).
|
||||
|
||||
- Pods sử lý Volumes, Secrets, và cấu hình cho containers.
|
||||
- Pod mang tính tạm thời (ephemeral). Chúng sẽ tự khởi động lại khi chúng gặp lỗi.
|
||||
- Pod được replicated khi ứng dụng mở rộng quy mô theo chiều ngang bởi ReplicaSet. Mỗi pod sẽ chạy cùng một container code.
|
||||
- Pods chạy trên các Worker nodes.
|
||||
|
||||

|
||||
|
||||
### Deployments
|
||||
|
||||
- Bạn chỉ có thể quyết định chạy Pods, nhưng khi chúng gặp lỗi chúng sẽ biến mất.
|
||||
- Một Deployment sẽ cho phép pod của bạn chạy liên tục.
|
||||
- Deployment cho phép bạn cập nhật ứng dụng đang chạy mà không có đowntime.
|
||||
- Deployment cũng xác định một chiến lược khởi động lại pod khi chúng chết.
|
||||
|
||||

|
||||
|
||||
### ReplicaSets
|
||||
|
||||
- Deployment cũng có thể tạo ReplicaSet.
|
||||
- Một ReplicaSet đảm bảo ứng dụng của bạn có số lượng pod mong muốn.
|
||||
- Replicate sẽ tạo vả mở rộng các nhóm dựa trên Deployment
|
||||
|
||||
### StatefulSets
|
||||
|
||||
- Ứng dụng của bạn có yêu cầu bạn lưu giữ thông tin về trạng thái của nó không?
|
||||
- Một cơ sở dữ liệu cần trạng thái
|
||||
- Các Pod của StatefulSet không thể hoán đổi cho nhau.
|
||||
- Mỗi nhóm có một mã định danh duy nhất, cố định mà controller duy trì trong mọi lần lập lịch lại.
|
||||
|
||||

|
||||
|
||||
### DaemonSets
|
||||
|
||||
- DeamonSets được sử dụng cho các tiến trình liên tục.
|
||||
- Chạy trên một pod trong mỗi node.
|
||||
- Mỗi node mới được thêm vào cluster sẽ bắt đầu một pod mới
|
||||
- Hữu ích cho các tác vụ nên như monitoring hay thu thập log
|
||||
- Mỗi pod có một mã định danh duy nhất và cố định mà controller duy trì trong mọi lần lập lịch lại.
|
||||
|
||||

|
||||
|
||||
### Services
|
||||
|
||||
- Một endpoint duy nhất để truy cập các pods.
|
||||
- Một cách thống nhất để định tuyến lưu lượng truy cập đến một cluster và cuối cùng là các pods.
|
||||
- Bằng cách sử dụng Services, các pods có thể được khởi động và tắt mà không ảnh hưởng đến bất cứ thứ gì.
|
||||
|
||||
Đây chỉ là khái quát nhanh và ghi chú về các khối xây dựng cơ bản của Kubernetes, chúng ta có thể sử dụng kiến thức này và thêm vào một số kiến thức khác xung quanh Storage và Ingress để cải thiện ứng dụng của mình nhưng cũng có nhiều lựa chọn về nơi mà bạn muốn chạy Kubernetes cluster của mình. Phần tiếp theo sẽ tập trung vào các tuỳ chọn về nơi chạy cluster Kubernetes, đồng thời tìm hiểu thêm một số kiến thức cụ thể về Storage.
|
||||
|
||||

|
||||
|
||||
### Những gì chúng ta sẽ đề cập trong loạt bài về Kubernetes
|
||||
|
||||
- Kiến trúc Kubernetes
|
||||
- Các câu lệnh kubectl
|
||||
- Kubernetes YAML
|
||||
- Kubernetes Ingress
|
||||
- Kubernetes Services
|
||||
- Helm Package Manager
|
||||
- Lưu trữ liên tục - Persistent Storage
|
||||
- Ứng dụng có trạng thái - Stateful Apps
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
|
||||
- [TechWorld with Nana - Kubernetes Tutorial for Beginners [FULL COURSE in 4 Hours]](https://www.youtube.com/watch?v=X48VuDVv0do)
|
||||
- [TechWorld with Nana - Kubernetes Crash Course for Absolute Beginners](https://www.youtube.com/watch?v=s_o8dwzRlu4)
|
||||
- [Kunal Kushwaha - Kubernetes Tutorial for Beginners | What is Kubernetes? Architecture Simplified!](https://www.youtube.com/watch?v=KVBON1lA9N8)
|
||||
|
||||
Hẹn gặp lại vào [ngày 50](day50.md)
|
79
2022/vi/Days/day50.md
Normal file
79
2022/vi/Days/day50.md
Normal file
@ -0,0 +1,79 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Chọn nền tảng chạy Kubernetes - Ngày 50'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Chọn nền tảng chạy Kubernetes
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1049046
|
||||
---
|
||||
|
||||
## Chọn nền tảng chạy Kubernetes
|
||||
|
||||
Tôi muốn sử dụng phần này để chia nhỏ một số nền tảng, một thách thức với thế giới Kubernetes là loại bỏ, giảm bớt sự phức tạp.
|
||||
|
||||
Kubernetes đã trải qua một chặng đường khó khăn về cách xây dựng từ con số không thành một Kubernetes cluster đầy đủ chức năng, điều này cực quan trọng nhưng ngày càng nhiều, ít nhất những người mà tôi đang nói chuyện đang muốn loại bỏ sự phức tạp đó và chạy Kubernetes cluster được quản lý. Vấn đề là nó tốn nhiều tiền hơn nhưng lợi ích đem lại nếu bạn sử dụng dịch vụ được quản lý, bạn có cần biết kiến thức node nền tảng và điều gì đang xảy ra trong Control Plan node khi nhìn chung bạn không có quyền truy cập vào nó.
|
||||
|
||||
Sau đó, chúng ta có các bản phân phối phát triển cục bộ cho phép chúng ta sử dụng hệ thống của mình và chạy phiên bản Kubernetes cục bộ để các nhà phát triển có thể có môi trường làm việc đầy đủ để chạy ứng dụng của họ trong nên tảng mà họ dự định sử dụng.
|
||||
|
||||
Cơ sở chung của tất cả các khái niệm này là chúng đều là một loại của Kubernetes, nghĩa là chúng ta có thể tự do migrate và di chuyển workloads của mình đến nơi chúng ta cần để phù hợp với yêu cầu của mình.
|
||||
|
||||
Rất nhiều khi lựa chọn của chúng ta cũng sẽ phụ thuộc vào những khoản đầu tư đã được thực hiện. Tôi cũng đã đề cập đến trải nghiệm của nhà phát triển nhưng một số môi trường Kubernetes cục bộ chạy trên máy tính xách tay của chúng ta cũng đã rất tuyệt vời để nắm bắt công nghệ mà không tốn bất kỳ khoản tiền nào.
|
||||
|
||||
### Bare-Metal Clusters
|
||||
|
||||
Một lựa chọn cho nhiều người có thể là chạy hệ điều hành Linux của bạn trực tiếp trên một số máy chủ vật lý để tạo cluster của chúng ta, đó cũng có thể là Windows nhưng tôi chưa nghe nhiều tỷ lệ tương thích của Windows, Containers và Kubernetes. Nếu chúng ta là một doanh nghiệp và quyết định một khoản đầu tư vào các máy chủ vật lý thì đây có thể là lựa chọn của bạn cho việc chạy Kubernetes cluster, tuy nhiên bạn sẽ phải tự xây dựng và quản lý mọi thứ từ đầu.
|
||||
|
||||
### Ảo hoá (Virtualisation)
|
||||
|
||||
Bất kể môi trường ảo hoá bao gồm thử nghiệm hay học tập hay sẵn sàng cho các enterprise của Kubernetes cluster đều là một cách tốt để bạn bắt đầu, điển hình là việc tạo ra các máy ảo để hoạt động như các node của bạn sau đó nhóm chúng lại với nhau cũng như tận dụng khoản tiền đã chi. Ví dụ như VMware cung cấp một giải pháp tuyệt vời cho cả máy ảo và Kubernetes với nhiều tuỳ chọn khác nhau.
|
||||
|
||||
Kubernetes cluster của tôi được xây dựng dựa trên ảo hoá bằng Microsoft Hyper-V trên một máy chủ cũ mà tôi có. Máy chủ này có khả năng chạy một số máy ảo làm node của tôi.
|
||||
|
||||
### Các tuỳ chọn trên máy tính để bàn
|
||||
|
||||
Có một số lựa chọn khi chạy Kubernetes cluster cục bộ trên máy tính để bàn hoặc máy tính xách tay của bạn. Như đã nói ở trên, điều này mang lại cho các nhà phát triển khả năng kiểm tra ứng dụng của họ mà không cần phải có nhiều cluster phức tạp hoặc tốn kém. Cá nhân tôi nghĩ rằng đây là một trong những thứ mà tôi đã sử dụng rất nhiều và cụ thể là tôi đã dùng minikube. Nó có một số chức năng và tiện ích bổ sung rất tốt giúp thay đổi cách bạn thiết lập và chạy một thứ gì đó.
|
||||
|
||||
### Dịch vụ Kubernetes được quản lý
|
||||
|
||||
Tôi đã đề cập đến ảo hoá và điều này có thể thực hiện được với các trình ảo hoá cục bộ, chúng ta đã biết từ các phần trước rằng chúng ta cũng có thể tận dụng các máy ảo trong dịch vụ điện toán đám mây công cộng để hoạt động như các nodes của chúng ta. Điều tôi đang muốn nhắc tới ở đây khi nói tới các dịch vụ được quản lý của Kubernetes là các dịch vụ mà chúng ta thấy từ các công ty điện toán đám mây cũng như từ các MSP (Managed service provider - Bên cung cấp dịch vụ quản lý) loại bỏ các tác vụ quản lý và kiểm soát khỏi người dùng cuối, điều này có thể loại bỏ quyền kiểm soát control plane khỏi người dùng cuối, đây là điều sẽ xảy ra với Amazon EKS, Microsoft AKS và Google Kubernetes Engine (GKE).
|
||||
|
||||
### Quá nhiều chọn lựa
|
||||
|
||||
Ý tôi là được lựa chọn là điều tuyệt vời nhưng có một điểm khiến chúng ta bị ngập trong các chọn lựa và bài viết này không đề cập một cách sâu sắc về tất cả các tuỳ chọn trong mỗi danh mục được liệt kê ở trên. Ngoài những điều được nhắc tới ở trên, chúng ta cũng có OpenShift của RedHat và lựa chọn này có thể được chạy trên các lựa chọn ở trên với tất cả các nhà cung cấp điện toán đám mây lớn và có lẽ sẽ mang lại khả năng sử dụng tổng thể tốt nhất cho các quản trị viên bất kể cluster được triển khai ở đâu.
|
||||
|
||||
Vậy bạn bắt đầu từ đâu trong hành trình học tập của mình, như tôi đã nói, tôi bắt đầu với lộ trình ảo hoá nhưng đó là vì tôi có quyền truy cập vào một máy chủ vậy lý mà tôi có thể sử dụng cho mục đích này, tôi rất biết ơn vì điều đó và trên thực tế, kể từ đó tôi không còn được truy cập vào lựa chọn này.
|
||||
|
||||
Lời khuyên thực tế của tôi bây giờ là sử dụng Minikube làm tuỳ chọn đầu tiên hoặc Kind (Kubernetes in Docker) nhưng Minikube mang lại cho chúng ta một số tiện ích bổ sung và gần như trừu tượng hoá sự phức tạp vì chúng ta có thể sử dụng các add-ón và xây dựng mọi thứ một cách nhanh chóng, sau đó xoá tất cả khi chúng ta hoàn thành, chúng ta cũng có thể chạy nhiều clusters, chạy nó ở hầu hết tất cả mọi nơi, đa nền tảng và không phụ thuộc và phần cứng.
|
||||
|
||||
Tôi đã trài qua hành trình tìm hiểu về Kubernetes, vì vậy tôi sẽ để lại lựa chọn nền tảng và các chi tiết cụ thể ở đây để liệt kê các tuỳ chọn mà tôi đã thử để giúp tôi hiểu rõ hơn về nền tàng Kubernetes và nơi nó có thể chạy. Bạn có thể tham khảo những bài viết dưới đây để đưa ra lựa chọn của mình.
|
||||
|
||||
- [Kubernetes playground – How to choose your platform](https://vzilla.co.uk/vzilla-blog/building-the-home-lab-kubernetes-playground-part-1)
|
||||
- [Kubernetes playground – Setting up your cluster](https://vzilla.co.uk/vzilla-blog/building-the-home-lab-kubernetes-playground-part-2)
|
||||
- [Getting started with Amazon Elastic Kubernetes Service (Amazon EKS)](https://vzilla.co.uk/vzilla-blog/getting-started-with-amazon-elastic-kubernetes-service-amazon-eks)
|
||||
- [Getting started with Microsoft Azure Kubernetes Service (AKS)](https://vzilla.co.uk/vzilla-blog/getting-started-with-microsoft-azure-kubernetes-service-aks)
|
||||
- [Getting Started with Microsoft AKS – Azure PowerShell Edition](https://vzilla.co.uk/vzilla-blog/getting-started-with-microsoft-aks-azure-powershell-edition)
|
||||
- [Getting started with Google Kubernetes Service (GKE)](https://vzilla.co.uk/vzilla-blog/getting-started-with-google-kubernetes-service-gke)
|
||||
- [Kubernetes, How to – AWS Bottlerocket + Amazon EKS](https://vzilla.co.uk/vzilla-blog/kubernetes-how-to-aws-bottlerocket-amazon-eks)
|
||||
- [Getting started with CIVO Cloud](https://vzilla.co.uk/vzilla-blog/getting-started-with-civo-cloud)
|
||||
- [Minikube - Kubernetes Demo Environment For Everyone](https://vzilla.co.uk/vzilla-blog/project_pace-kasten-k10-demo-environment-for-everyone)
|
||||
|
||||
### Những gì chúng ta sẽ đề cập trong loạt bài về Kubernetes
|
||||
|
||||
- Kiến trúc Kubernetes
|
||||
- Các câu lệnh kubectl
|
||||
- Kubernetes YAML
|
||||
- Kubernetes Ingress
|
||||
- Kubernetes Services
|
||||
- Helm Package Manager
|
||||
- Lưu trữ liên tục - Persistent Storage
|
||||
- Ứng dụng có trạng thái - Stateful Apps
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
|
||||
- [TechWorld with Nana - Kubernetes Tutorial for Beginners [FULL COURSE in 4 Hours]](https://www.youtube.com/watch?v=X48VuDVv0do)
|
||||
- [TechWorld with Nana - Kubernetes Crash Course for Absolute Beginners](https://www.youtube.com/watch?v=s_o8dwzRlu4)
|
||||
- [Kunal Kushwaha - Kubernetes Tutorial for Beginners | What is Kubernetes? Architecture Simplified!](https://www.youtube.com/watch?v=KVBON1lA9N8)
|
||||
|
||||
Hẹn gặp lại vào [ngày 51](day51.md)
|
175
2022/vi/Days/day51.md
Normal file
175
2022/vi/Days/day51.md
Normal file
@ -0,0 +1,175 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Triển khai cluster Kubernetes đầu tiên - Ngày 51'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Triển khai cluster Kubernetes đầu tiên
|
||||
tags: 'DevOps, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048778
|
||||
---
|
||||
|
||||
## Triển khai cluster Kubernetes đầu tiên
|
||||
|
||||
Trong bài viết này, chúng ta sẽ thiết lập và chạy một Kubernetes cluster trên máy tính cá nhân sử dụng minikube, điều này sẽ cung cấp cho chúng ta một cluster cơ bản cho phần còn lại của tuần nói về Kubernetes. Mặc dù chúng ta cũng sẽ xem xét tới việc triển khai một Kubernetes cluster với Virtual Box trong phần sau. Lý do chọn phương pháp này so với sử dụng dịch vụ được quản lý bởi các nhà cung cấp điện toán đám mây công cộng là vì nó sẽ khiến bạn tốn tiền ngay cả với bậc miễn phí, tôi đã chia sẻ một số blog nếu bạn muốn thực hiện điều đó vào [ngày 50](day50.md).
|
||||
|
||||
### Minikube là gì?
|
||||
|
||||
> "minikube nhanh chóng thiết lập một Kubernetes cluster cục bộ trên macOS, Linux và Windows. Chúng tôi tập trung vào việc trợ giúp các nhà phát triển ứng dụng và những người dùng mới của Kubernetes"
|
||||
|
||||
Bạn có thể không phải là đối tượng được nhắc tới ở trên nhưng tôi nhận thấy minikube là một công cụ tuyệt vời nếu bạn chỉ muốn thực nghiệm thứ gì đó với Kubernetes, bạn có thể dễ dàng triển khai một ứng dụng và chúng cũng có một số add-ons rất tốt sẽ được giới thiệu ngay sau đây.
|
||||
|
||||
Để bắt đầu, bất kể hệ điều hành nào cũng có thể chạy minikube. Trước tiên, hãy truy cập vào [trang web chính thức của dự án tại đây](https://minikube.sigs.k8s.io/docs/start/) để chọn phương pháp cài đặt. Tôi không sử dụng cách này nhưng bạn có thể chọn cách của tôi ở dưới dây.
|
||||
|
||||
Được đề cập ở dưới, bạn cần phải có "Trình quản lý container hoặc máy ảo, ví dụ như Docker, Hyper kit, Hyper-V, KVM, Parallels, Podman, VirtualBox, hoặc VMware", đó sẽ là nơi Minikube chạy một cách dễ dàng nhất. Bạn có thể cài đặt Docker trên hệ thống của mình bằng cách sử dụng [hướng dẫn sau](https://docs.docker.com/get-docker/).
|
||||
|
||||

|
||||
|
||||
### Các cài đặt minikube và các phần mềm khác của tôi
|
||||
|
||||
Tôi đã sử dụng Arkade được một thời gian để tải tất cả các công cụ liên quan tới Kubernetes và CLIs, bạn có thể xem hướng dẫn cài đặt trên [github repository này](https://github.com/alexellis/arkade) để bắt đầu với Arkade. Tôi cũng đã đề cập đến điều này trong các bài đăng khác khi tôi muốn cài đặt thứ gì đó. Sự đơn giản của việc chỉ cần nhập arkade get và sau đó xem liệu công cụ hoặc cli của bạn có hay không sẽ giúp ích rất nhiều cho bạn. Trong tuần về Linux, chúng ta đã nói về trình quản lý gói và quy trình cài đặt các phần mềm, bạn có thể nghĩ rằng Arkade là một marketplace cho tất cả các ứng dụng và CLI cho Kubernetes. Một công cụ hữu ích và nhỏ gọn cho hệ thống của bạn, viết bằng Golang và có thể dùng với mọi platform.
|
||||
|
||||

|
||||
|
||||
Là một phần của danh sách dài các ứng dụng có sẵn trong arkade, minikube có thể được tải xuống và cài đặt một cách đơn giản với câu lệnh `arkade get minikube`.
|
||||
|
||||

|
||||
|
||||
Chúng tôi cũng sẽ cần kubectl như một phần của các công cụ, vì vậy bạn cũng có thể cài đặt nó thông qua arkade hoặc tôi tin rằng theo như tài liệu của minikube, nó cũng được cài đặt thông qua câu lệnh curl ở bên trên. Chúng ta sẽ nói về kubectl ở phần sau của bài viết.
|
||||
|
||||
### Bắt đầu và chạy Kubernetes cluster
|
||||
|
||||
Đối với phần này, tôi muốn đề cập đến các lựa chọn có sẵn cho chúng ta khi thiết lập và chạy một Kubernetes cluster trên máy tính cá nhân của bạn. Chúng ta có thể chỉ cần chạy lệnh sau và một cluster sẽ được tạo cho bạn sử dụng.
|
||||
|
||||
minikube được sử dụng trên dòng lệnh và khi mọi thứ được cài đặt, bạn chỉ cần lệnh `minikube start` để triển khai Kubernetes cluster đầu tiên của mình. Bạn sẽ thấy bên dưới Docker Driver sẽ là lựa chọn mặc định cho nơi mà chúng ta sẽ chạy các node ảo hoá của mình. Tôi đã đề cập ở phần đầu của bài viết về các tuỳ chọn khác có sẵn, chúng sẽ hữu ích khi bạn muốn mở rộng Kubernetes cluster cục bộ này.
|
||||
|
||||
Một minikube cluster sẽ bao gồm một docker container trong instance đó và sẽ có control plane node và worker node chạy trong cùng một instance trong khi thông thường, bạn sẽ tách riêng các node đó. Chúng ta sẽ đề cập đến điều đó trong phần tiếp theo, nơi chúng ta sẽ xem qua các môi trường Kubernetes trên máy tính cá nhân nhưng gần hơn một chút với kiến trúc của môi trường sản xuất.
|
||||
|
||||

|
||||
|
||||
Tôi đã đề cập tới vấn đề này một vài lần, tôi thích minikube vì chúng có các add-ons sẵn có, khả năng triển khai một cluster bằng một lệnh đơn giản bao gồm tất cả các add-ons cần thiết ngay từ đầu giúp tôi triển khai cùng một thiết lập mọi lúc.
|
||||
|
||||
Bạn có thể thấy danh sách các add-ons ở dưới đây, tôi thường sử dụng add-on `CSI-host path-driver` và `volumesnapshots` nhưng bạn có thể xem danh sách đầy đủ ở dưới. Chắc chắn rằng các addon này thường có thể được triển khai bằng cách sử dụng Helm, thứ mà chúng ta sẽ đề cập sau trong phần Kubernetes, nó gíup mọi thứ đơn giản hơn nhiều.
|
||||
|
||||

|
||||
|
||||
Tôi cũng đang xác định trong dự án của mình một số cấu hình bổ sung, apiserver được cấu hình trên port 6433 thay vì một port API ngẫu nhiên, và tôi sẽ cấu hình container runtime sử dụng containerd dù docker là lựa chọn mặc định và CRI-O cũng có thể được lựa chọn. Tôi cũng cài đặt một phiên bản Kubernetes cụ thể.
|
||||
|
||||

|
||||
|
||||
Bây giờ, chúng ta đã sẵn sàng để triển khai Kubernetes cluster với minikube. Tôi đã đề cập trước đây rằng bạn sẽ cần `kubectl` để tương tác với cluster của bạn. Bạn có thể cài đặt nó với arkade bằng câu lệnh `arkade get kubectl`
|
||||
|
||||

|
||||
|
||||
hoặc bạn có thể tải xuống từ trang web chính thức cho các nền tảng
|
||||
|
||||
- [Linux](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux)
|
||||
- [macOS](https://kubernetes.io/docs/tasks/tools/install-kubectl-macos)
|
||||
- [Windows](https://kubernetes.io/docs/tasks/tools/install-kubectl-windows)
|
||||
|
||||
Khi bạn đã có kubectl, chúng ta có thể tương tác với cluster sử dụng câu lệnh đơn giản `kubectl get nodes`
|
||||
|
||||

|
||||
|
||||
### kubectl là gì?
|
||||
|
||||
kubectl là một CLI (Command line interface - giao diện dòng lệnh) giúp bạn tương tác với Kubernetes clusters, chúng ta đang sử dụng nó ở đây để tương tác với minikube cluster của mình nhưng chúng ta cũng có thể sử dụng kubectl để tương tác với các cluster của doanh nghiệp chạy trên các đám mây công cộng.
|
||||
|
||||
Chúng ta sử dụng kubectl để triển khai các ứng dụng cũng như kiểm tra và quản lý các tài nguyên của cluster. Bạn có thể đọc về [Tổng quan kubectl](https://kubernetes.io/docs/reference/kubectl/overview/) trên trang web chính thức của Kubernetes.
|
||||
|
||||
kubectl tương tác với máy chủ API được chạy trên control plan node đã được chúng ta đề cập ở bài viết trước.
|
||||
|
||||
### kubectl cheat sheet
|
||||
|
||||
Cùng với tài liệu chính thức, tôi cũng hay sử dụng trang web này để tìm kiếm các câu lệnh của [Unofficial Kubernetes](https://unofficial-kubernetes.readthedocs.io/en/latest/)
|
||||
|
||||
| Liệt kê các tài nguyên | |
|
||||
| ------------------------ | ------------------------------------------ |
|
||||
| kubectl get nodes | Liệt kê tất cả các nodes trong cluster |
|
||||
| kubectl get namespaces | Liệt kê tất cả các namespaces trong cluster |
|
||||
| kubectl get pods | Liệt kê tất cả các pods trong namespace mặc định của cluster |
|
||||
| kubectl get pods -n name | Liệt kê tất cả các pods trong namespace "name" |
|
||||
|
||||
| Tạo các tài nguyên | |
|
||||
| ----------------------------- | ------------------------------------------- |
|
||||
| kubectl create namespace name | Tạo một namespace với tên "name" |
|
||||
| kubectl create -f [filename] | Tạo một tài nguyên từ tệp JSON hoặc YAML: |
|
||||
|
||||
| Điều chỉnh các tài nguyên | |
|
||||
| ---------------------------- | ----------------- |
|
||||
| kubectl edit svc/servicename | Điều chỉnh một service |
|
||||
|
||||
| Thông tin chi tiết hơn về tài nguyên | |
|
||||
| ------------------------ | ------------------------------------------------------- |
|
||||
| kubectl describe nodes | hiển thị chi tết trạng thái của các nodes |
|
||||
|
||||
| Xoá tài nguyên | |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| kubectl delete pod | Xoá các tài nguyên, có thể tử stdin hoặc tệp |
|
||||
|
||||
Bạn có thể muốn biết các tên viết tắt của một số tài nguyên trên kubectl, ví dụ `-n` là tên viết tắt của `namespace` giúp bạn dễ dàng thao tác hơn và làm code của bạn trông gọn gàng hơn.
|
||||
|
||||
| Tên rút gọn | Tên đầy đủ |
|
||||
| ---------- | -------------------------- |
|
||||
| csr | certificatesigningrequests |
|
||||
| cs | componentstatuses |
|
||||
| cm | configmaps |
|
||||
| ds | daemonsets |
|
||||
| deploy | deployments |
|
||||
| ep | endpoints |
|
||||
| ev | events |
|
||||
| hpa | horizontalpodautoscalers |
|
||||
| ing | ingresses |
|
||||
| limits | limitranges |
|
||||
| ns | namespaces |
|
||||
| no | nodes |
|
||||
| pvc | persistentvolumeclaims |
|
||||
| pv | persistentvolumes |
|
||||
| po | pods |
|
||||
| pdb | poddisruptionbudgets |
|
||||
| psp | podsecuritypolicies |
|
||||
| rs | replicasets |
|
||||
| rc | replicationcontrollers |
|
||||
| quota | resourcequotas |
|
||||
| sa | serviceaccounts |
|
||||
| svc | services |
|
||||
|
||||
Điều cuối cùng cần bổ sung ở đây là tôi đã tạo một dự án khác xung quanh minikube để giúp tôi nhanh chóng tạo ra các môi trường demo để hiển thị các dịch vụ dữ liệu và bảo vệ các workload đó với Kasten K10, [Project Pace](https://github.com/MichaelCade/project_pace) có thể được tìm thấy ở đó và tôi luôn chào đón phản hồi và tương tác của bạn, nó cũng có bao gồm một số các tự động để triển khai các minikube cluster của bạn và tạo các ứng dụng dịch vụ dữ liệu khác nhau.
|
||||
|
||||
Tiếp theo, chúng ta sẽ triển kahi nhiều node vào các máy ảo bằng VirtualBox nhưng chúng ta sẽ chọn cách dễ hơn như các chúng ta đã làm trong tuần về Linux, sử dụng vagrant để tạo các máy ảo và triển khai các phần mềm theo cách chúng ta mong muốn.
|
||||
|
||||
Tôi đã thêm danh sách này vào bài viết ngày hôm qua, đó là các blog hướng dẫn mà tôi đã thực hành với các Kubernetes cluster đã được triển khai.
|
||||
|
||||
- [Kubernetes playground – How to choose your platform](https://vzilla.co.uk/vzilla-blog/building-the-home-lab-kubernetes-playground-part-1)
|
||||
- [Kubernetes playground – Setting up your cluster](https://vzilla.co.uk/vzilla-blog/building-the-home-lab-kubernetes-playground-part-2)
|
||||
- [Getting started with Amazon Elastic Kubernetes Service (Amazon EKS)](https://vzilla.co.uk/vzilla-blog/getting-started-with-amazon-elastic-kubernetes-service-amazon-eks)
|
||||
- [Getting started with Microsoft Azure Kubernetes Service (AKS)](https://vzilla.co.uk/vzilla-blog/getting-started-with-microsoft-azure-kubernetes-service-aks)
|
||||
- [Getting Started with Microsoft AKS – Azure PowerShell Edition](https://vzilla.co.uk/vzilla-blog/getting-started-with-microsoft-aks-azure-powershell-edition)
|
||||
- [Getting started with Google Kubernetes Service (GKE)](https://vzilla.co.uk/vzilla-blog/getting-started-with-google-kubernetes-service-gke)
|
||||
- [Kubernetes, How to – AWS Bottlerocket + Amazon EKS](https://vzilla.co.uk/vzilla-blog/kubernetes-how-to-aws-bottlerocket-amazon-eks)
|
||||
- [Getting started with CIVO Cloud](https://vzilla.co.uk/vzilla-blog/getting-started-with-civo-cloud)
|
||||
- [Minikube - Kubernetes Demo Environment For Everyone](https://vzilla.co.uk/vzilla-blog/project_pace-kasten-k10-demo-environment-for-everyone)
|
||||
- [Minikube - Deploy Minikube Using Vagrant and Ansible on VirtualBox](https://medium.com/techbeatly/deploy-minikube-using-vagrant-and-ansible-on-virtualbox-infrastructure-as-code-2baf98188847)
|
||||
|
||||
|
||||
### Những gì chúng ta sẽ đề cập trong loạt bài về Kubernetes
|
||||
|
||||
Chúng ta đã đề cập tới một số vấn đề ở dưới và sẽ thực hành nhiều hơn vào ngày mai với cluster thứ 2, nơi mà chúng ta sẽ triển khai ứng dụng của mình.
|
||||
|
||||
- Kiến trúc Kubernetes
|
||||
- Các câu lệnh kubectl
|
||||
- Kubernetes YAML
|
||||
- Kubernetes Ingress
|
||||
- Kubernetes Services
|
||||
- Helm Package Manager
|
||||
- Lưu trữ liên tục - Persistent Storage
|
||||
- Ứng dụng có trạng thái - Stateful Apps
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
|
||||
- [TechWorld with Nana - Kubernetes Tutorial for Beginners [FULL COURSE in 4 Hours]](https://www.youtube.com/watch?v=X48VuDVv0do)
|
||||
- [TechWorld with Nana - Kubernetes Crash Course for Absolute Beginners](https://www.youtube.com/watch?v=s_o8dwzRlu4)
|
||||
- [Kunal Kushwaha - Kubernetes Tutorial for Beginners | What is Kubernetes? Architecture Simplified!](https://www.youtube.com/watch?v=KVBON1lA9N8)
|
||||
- [Techbeatly - Deploy Minikube Using Vagrant and Ansible on VirtualBox](https://www.youtube.com/watch?v=xPLQqHbp9BM&t=371s)
|
||||
|
||||
Hẹn gặp lại vào [ngày 52](day52.md)
|
178
2022/vi/Days/day52.md
Normal file
178
2022/vi/Days/day52.md
Normal file
@ -0,0 +1,178 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Thiết lập Kubernetes cluster đa node - Ngày 52'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Thiết lập Kubernetes cluster đa node
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1049050
|
||||
---
|
||||
|
||||
## Thiết lập Kubernetes cluster đa node
|
||||
|
||||
Lúc đầu tôi đã tính để title của bài viết này là "Thiết lập Kubernetes cluster đa node với Vagrant" nhưng có thể nó hơi dài!
|
||||
|
||||
Trong bài viết ngày hôm qua, chúng ta đã sử dụng một dự án thú vị để triển khai Kubernetes cluster đầu tiên của mình và thực hành chúng với công cụ CLI quan trọng nhất mà bạn sẽ gặp khi sử dụng Kubernetes (kubectl)
|
||||
|
||||
Trong bài ngày hôm nay, chúng ta sẽ sử dụng VirtualBox làm cơ sở nhưng như đã đề cập ở lần trước khi chúng ta nói về Vagrant trong phần về Linux, chúng ta có thể sử dụng bất kỳ công cụ ảo hoá nào được hỗ trợ. Đó là [ngày 14](day14.md) khi chúng ta xem xét và triển khai máy chủ Ubuntu.
|
||||
|
||||
### Tóm tắt nhanh về Vagrant
|
||||
|
||||
Vagrant là một tiện ích CLI giúp quản lý vòng đời các máy ảo của bạn. Chúng ta có thể sử dụng vagrant để tạo, xoá các máy ảo trên nhiều nền tảng khác nhau bao gồm vSphere, Virtual Box và cả Docker. Nó có các nhà cung cấp khác nhưng chúng ta sẽ chọn Virtual Box ở đây.
|
||||
|
||||
Tôi sẽ sử dụng [bài viết và repository này](https://devopscube.com/kubernetes-cluster-vagrant/) để cấu hình hệ hống. Tuy nhiên, tôi khuyên rằng nếu đây là lần đầu tiên bạn triển khai một Kubernetes cluster thì bạn cũng có thể xem xét thực hiện điều này một cách thủ công để sau đó ít nhất thì bạn cũng biết nó trông như thế nào. Phải công nhận sau mỗi bản phát hành của Kubernetes, các tác vụ để setup ngày càng được tinh gọn và hiệu quả hơn. Tôi nhớ thời của VMware và ESX và cách bạn mấy 1 ngày để triển khai 3 ESX server, bây giờ chúng ta có thể làm trong 1 giờ. Chúng ta sẽ đi theo hướng đó khi nói đến Kubernetes.
|
||||
|
||||
### Môi trường Lab Kubernetes
|
||||
|
||||
Tôi đã tải lên trong [Kubernetes folder](../../Days/Kubernetes/) vagrantfile mà chúng ta sẽ sử dụng để xây dựng môi trường. Lấy tệp này và điều hướng đến thư mục trong terminal của bạn. Tôi đang sử dụng Windows nên Powershell là lựa chọn để thực hiện các lệnh trên máy trạm của mình với vagrant. Nếu bạn chưa có vagrant thì bạn có thể sử dụng arkade, hôm qua chúng ta đã đề cập đến nó khi cài đặt minikube và các công cụ khác. Chỉ sử dụng lệnh `arkade get vagrant` và bạn sẽ tải xuống và cài đặt phiên bản vagrant mới nhất.
|
||||
|
||||
Khi bạn đang ở trong thư mục của mình, chạy `vagrant up` và nếu tất cả được cấu hình chính xác thì bạn sẽ thấy phần khởi động sau trong terminal của mình.
|
||||
|
||||

|
||||
|
||||
Trong terminal, bạn sẽ thấy một số bước đang diễn ra, nhưng trong thời gian chờ đợi, hãy xem những gì chúng ta đang chuẩn bị ở đây.
|
||||
|
||||

|
||||
|
||||
Từ những điều trên, bạn có thể thấy rằng chúng ta sẽ xây dựng 3 máy ảo, chúng ta sẽ có một sẽ có một control plane node và 2 worker nodes. Nếu bạn qua lại [ngày 49](day49.md), bạn có thể đọc lại về những phần trong hình ảnh trên.
|
||||
|
||||
Cũng trong hình ảnh đó, chúng ta thấy truy cập kubectl sẽ đến từ bên ngoài cluster tới kube apiserver trong khi thực tế như một phần của việc triển khai vagrant, chúng ta sẽ có kubectl trên mỗi node để có thể truy cập cluster từ trong tất cả các nodes.
|
||||
|
||||
Quá trình thực hiện bài lab này có thể kéo dài từ 5 cho tới 30 phút phụ thuộc vào thiếp lập của bạn.
|
||||
|
||||
Tôi cũng sẽ sớm đề cập tới các tệp nhưng bạn sẽ nhận thấy nếu bạn xem qua vagrantfile bạn sẽ thấy 3 phần của triển khai và đó chính là nơi cluster được tạo ra. Chúng ta thấy việc sử dụng vagrant để triển khai các máy ảo và cài đặt hệ điều hành của mình dễ dàng như thế nào với các vagrant boxes cũng như khả năng chạy tập lệnh shell như một phần của quy trình triển khai là điều khá thú vị nếu chúng ta tự động hoá các bản dựng của các bài lab.
|
||||
|
||||
Sau khi hoàn tất, chúng ta có thể ssh tới một trong các node của mình `vagrant ssh master` từ terinal, username và password mặc định là `vagrant/vagrant`
|
||||
|
||||
Bạn cũng có thể sử dụng `vagrant ssh node01` và `vagrant ssh node02` để truy cập các worker nodes nếu bạn muốn.
|
||||
|
||||

|
||||
|
||||
Bây giờ chúng ta đang ở một trong các node trong cluster mới của chúng ta, có thể sử dụng `kubectl get nodes` để hiển thị 3 node cluster và trạng thái của chúng.
|
||||
|
||||

|
||||
|
||||
Tại thời điểm này, chúng ta có một cluster với 3 nodes đang chạy, với 1 control plane node và 2 worker nodes.
|
||||
|
||||
### Hướng dẫn về Vagrantfile và Shell Script
|
||||
|
||||
Nếu chúng ta xem tệp vagrantfile của mình, bạn sẽ thấy rằng chúng ta đang xác định một vài worker node, địa chỉ IP mạng cho mạng bắc cầu trong VirtualBox và sau đó là một số tên đặt. Một điều khác mà bạn cũng sẽ thấy là chúng ta đang gọi một số tập lệnh mà chúng ta muốn chạy trên các máy chủ cụ thể.
|
||||
|
||||
```
|
||||
NUM_WORKER_NODES=2
|
||||
IP_NW="10.0.0."
|
||||
IP_START=10
|
||||
|
||||
Vagrant.configure("2") do |config|
|
||||
config.vm.provision "shell", inline: <<-SHELL
|
||||
apt-get update -y
|
||||
echo "$IP_NW$((IP_START)) master-node" >> /etc/hosts
|
||||
echo "$IP_NW$((IP_START+1)) worker-node01" >> /etc/hosts
|
||||
echo "$IP_NW$((IP_START+2)) worker-node02" >> /etc/hosts
|
||||
SHELL
|
||||
config.vm.box = "bento/ubuntu-21.10"
|
||||
config.vm.box_check_update = true
|
||||
|
||||
config.vm.define "master" do |master|
|
||||
master.vm.hostname = "master-node"
|
||||
master.vm.network "private_network", ip: IP_NW + "#{IP_START}"
|
||||
master.vm.provider "virtualbox" do |vb|
|
||||
vb.memory = 4048
|
||||
vb.cpus = 2
|
||||
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
|
||||
end
|
||||
master.vm.provision "shell", path: "scripts/common.sh"
|
||||
master.vm.provision "shell", path: "scripts/master.sh"
|
||||
end
|
||||
|
||||
(1..NUM_WORKER_NODES).each do |i|
|
||||
config.vm.define "node0#{i}" do |node|
|
||||
node.vm.hostname = "worker-node0#{i}"
|
||||
node.vm.network "private_network", ip: IP_NW + "#{IP_START + i}"
|
||||
node.vm.provider "virtualbox" do |vb|
|
||||
vb.memory = 2048
|
||||
vb.cpus = 1
|
||||
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
|
||||
end
|
||||
node.vm.provision "shell", path: "scripts/common.sh"
|
||||
node.vm.provision "shell", path: "scripts/node.sh"
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
Hãy chia nhỏ những tập lệnh đang được chạy. Chúng ta có ba tập lệnh được liệt kê trong VAGRANTFILE để chạy trên các node cụ thể.
|
||||
|
||||
`master.vm.provision "shell", path: "scripts/common.sh"`
|
||||
|
||||
Tập lệnh trên sẽ tập trung vào việc chuẩn bị cho các nodes sẵn sàng, nó sẽ chạy trên 3 nodes của chúng ta và nó sẽ xoá tất cả các thành phần của Docker đang có và cài đặt lại Docker và ContainerD cũng như kubeadm, kubelet và kubectl. Tập lệnh này cũng sẽ cập nhật các gói phần mềm hiện có trên hệ thống.
|
||||
|
||||
`master.vm.provision "shell", path: "scripts/master.sh"`
|
||||
|
||||
Tập lệnh `master.sh` sẽ chỉ chạy trên control plane node, tập lệnh này sẽ tạo Kubernetes cluster sử dụng các lệnh kubeadm. Nó cũng sẽ chuẩn bị config context để truy cập vào cluster này, chúng ta sẽ nói đến sau đây.
|
||||
|
||||
`node.vm.provision "shell", path: "scripts/node.sh"`
|
||||
|
||||
Tập lệnh này chỉ đơn giản là lấy cấu hình do master tạo và kết nối các nodes của chúng ta vào Kubernetes cluster, quá trình kết nối này lại sử dụng kubeadmn và một tập lệnh khác có thể tìm thấy trong thư mục config.
|
||||
|
||||
### Truy cập vào Kubernetes cluster
|
||||
|
||||
Bây giờ chúng ta đã có hai cluster được triển khai, chúng ta có minikube cluster đã triển khai trong phần trước và có cluster 3 nodes mới mà chúng ta vừa triển khai trên VirtualBox.
|
||||
|
||||
Ngoài ra, tệp cấu hình cũng giúp bạn có quyền truy cập trên máy của bạn, bạn đã chạy vagrant bao gồm cách chúng ta có thể truy cập vào cluster từ máy trạm của mình.
|
||||
|
||||
Trước khi chúng ta nói đến điều đó, hãy nói qua về context.
|
||||
|
||||

|
||||
|
||||
Context rất quan trọng, khả năng truy cập Kubernetes cluster từ máy tính để bàn hoặc máy tính xách tay của bạn là cần thiết. Có rất nhiều lựa chọn khác nhau và mọi người sử dụng các hệ điều hành khác nhau được mọi người sử dụng hàng ngày.
|
||||
|
||||
Theo mặc định, ứng dụng Kubernetes CLI (kubectl) sử dụng C:\Users\username\.kube\config để lưu trữ các thông tin quan trọng của Kubernetes cluster, chẳng hạn như các endpoints và thông tin đăng nhập. Nếu bạn đã triển khai một cluster, bạn có thể thấy tệp này ở vị trí đó. Nhưng có thể bạn đang sử dụng node chính để chạy các lệnh kubectl của mình thông qua ssh hoặc các phương thức khác thì hi vọng bài viết này sẽ giúp bạn có thể kết nối từ máy trạm của mình.
|
||||
|
||||
Sau đó, chúng ta cần lấy tệp kubeconfig từ cluster hoặc chúng ta cũng có thể lấy tệp này từ tệp cấu hình của mình sau khi triển khai, lấy nội dung của tệp này qua SCP hoặc chỉ cần mở một console session tới node chúng của bạn và sao chép xuống máy windows cục bộ.
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng ta sẽ lấy một bản sao của tệp cấu hình đó và chuyển nó đến vị trí `$HOME/.kube/config`.
|
||||
|
||||

|
||||
|
||||
Bây giờ, từ máy trạm cục bộ của bạn, bạn có thể chạy `kubectl cluster-info` và `kubectl get nodes` để kiểm tra rằng bạn có quyền truy cập vào cluster của mình.
|
||||
|
||||

|
||||
|
||||
Điều này không chỉ cho phép kết nối và điểu khiển từ máy windows của bạn mà còn cho phép chúng ta thực hiện một số chuyển tiếp cổng để truy cập các dịch vụ nhất định từ máy tính windows của chúng ta.
|
||||
|
||||
Nếu bạn quan tâm đến cách quản lý nhiều cluster trên máy trạm của mình thì tôi có hướng dẫn chi tiết hơn [tại đây](https://vzilla.co.uk/vzilla-blog/building-the-home-lab-kubernetes-playground-part-6).
|
||||
|
||||
Tôi đã thêm danh sách các bài blog hướng dẫn mà tôi đã thực hiện với các Kubernetes cluster khác nhau đang được triển khai.
|
||||
|
||||
- [Kubernetes playground – How to choose your platform](https://vzilla.co.uk/vzilla-blog/building-the-home-lab-kubernetes-playground-part-1)
|
||||
- [Kubernetes playground – Setting up your cluster](https://vzilla.co.uk/vzilla-blog/building-the-home-lab-kubernetes-playground-part-2)
|
||||
- [Getting started with Amazon Elastic Kubernetes Service (Amazon EKS)](https://vzilla.co.uk/vzilla-blog/getting-started-with-amazon-elastic-kubernetes-service-amazon-eks)
|
||||
- [Getting started with Microsoft Azure Kubernetes Service (AKS)](https://vzilla.co.uk/vzilla-blog/getting-started-with-microsoft-azure-kubernetes-service-aks)
|
||||
- [Getting Started with Microsoft AKS – Azure PowerShell Edition](https://vzilla.co.uk/vzilla-blog/getting-started-with-microsoft-aks-azure-powershell-edition)
|
||||
- [Getting started with Google Kubernetes Service (GKE)](https://vzilla.co.uk/vzilla-blog/getting-started-with-google-kubernetes-service-gke)
|
||||
- [Kubernetes, How to – AWS Bottlerocket + Amazon EKS](https://vzilla.co.uk/vzilla-blog/kubernetes-how-to-aws-bottlerocket-amazon-eks)
|
||||
- [Getting started with CIVO Cloud](https://vzilla.co.uk/vzilla-blog/getting-started-with-civo-cloud)
|
||||
- [Minikube - Kubernetes Demo Environment For Everyone](https://vzilla.co.uk/vzilla-blog/project_pace-kasten-k10-demo-environment-for-everyone)
|
||||
|
||||
### Những gì chúng ta sẽ đề cập trong loạt bài về Kubernetes
|
||||
|
||||
- Kiến trúc Kubernetes
|
||||
- Các câu lệnh kubectl
|
||||
- Kubernetes YAML
|
||||
- Kubernetes Ingress
|
||||
- Kubernetes Services
|
||||
- Helm Package Manager
|
||||
- Lưu trữ liên tục - Persistent Storage
|
||||
- Ứng dụng có trạng thái - Stateful Apps
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
|
||||
- [TechWorld with Nana - Kubernetes Tutorial for Beginners [FULL COURSE in 4 Hours]](https://www.youtube.com/watch?v=X48VuDVv0do)
|
||||
- [TechWorld with Nana - Kubernetes Crash Course for Absolute Beginners](https://www.youtube.com/watch?v=s_o8dwzRlu4)
|
||||
- [Kunal Kushwaha - Kubernetes Tutorial for Beginners | What is Kubernetes? Architecture Simplified!](https://www.youtube.com/watch?v=KVBON1lA9N8)
|
||||
|
||||
Hẹn gặp lại vào [ngày 53](day53.md)
|
125
2022/vi/Days/day53.md
Normal file
125
2022/vi/Days/day53.md
Normal file
@ -0,0 +1,125 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Tổng quan về Rancher - Thực hành - Ngày 53'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Tổng quan về Rancher - Thực hành
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048742
|
||||
---
|
||||
|
||||
## Tổng quan về Rancher - Thực hành
|
||||
|
||||
Trong bài viết này, chúng ta sẽ đề cập tới Rancher, cho đến giờ, mọi thứ chúng ta làm đều dưới giao diện dòng lệnh sử dụng kubectl nhưng chứng ta có một số công cụ quản lý cluster với giao diện người dùng để các nhóm vận hành có thể quản lý các cluster một cách tốt hơn.
|
||||
|
||||
Rancher theo như [trang web của họ](https://rancher.com/)
|
||||
|
||||
> Rancher là phần mềm hoàn chỉnh dành cho các nhóm sử dụng containers. Nó giải quyết các vấn đề về vận hành và bảo mật trong việc quản lý các Kubernetes cluster trên bất kỳ cơ sở hạ tầng nào đồng thời cung cấp cho các nhóm DevOps các công cụ tích hợp để chạy các containerized workloads.
|
||||
|
||||
Rancher cho phép chúng ta triển khai các cụm Kubernetes theo tiêu chuẩn của môi trường production và sau đó cung cấp xác thực tập trung, kiểm soát truy cập và khả năng quan sát. Tôi đã đề cập trong phần trước rằng có rất nhiều lựa chọn khi nói đến Kubernetes và nơi bạn nên hoặc có thể chạy chúng, khi sử dụng Rancher, việc chạy chúng ở đâu không quan trọng.
|
||||
|
||||
### Triển khai Rancher
|
||||
|
||||
Điều đầu tiên chúng ta cần làm là triển khai Rancher trên máy trạm cục bộ của mình, có một số cách và vị trí bạn có thể chọn để làm điều này. Đối với tôi, tôi muốn sử dụng máy tính cá nhân của mình và chạy Rancher bằng một docker container. Bằng cách chạy lệnh bên dưới, chúng ta sẽ kéo container image và sau đó có quyền truy cập vào giao diện người dùng của Rancher.
|
||||
|
||||
Các phương pháp triển khai Rancher khác có tại [Rancher Quick-Start-Guide](https://rancher.com/docs/rancher/v2.6/en/quick-start-guide/deployment/)
|
||||
|
||||
`sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher`
|
||||
|
||||
Như bạn có thể thấy trong Docker Desktop của chúng ta, có một Rancher container đang chạy.
|
||||
|
||||

|
||||
|
||||
### Truy cập Rancher UI
|
||||
|
||||
Với container ở trên đang chạy, chúng ta có thể điều hướng tới nó thông qua một trang web. `https://localhost` sẽ hiển thị trang đăng nhập như ở dưới.
|
||||
|
||||

|
||||
|
||||
Thực hiện theo các hướng dẫn dưới đây để có được mật khẩu cần thiết. Vì tôi đang sử dụng Windows nên tôi đã chọn bash vì chúng ta cần lệnh grep.
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng ta có thể lấy mật khẩu ở trên và đăng nhập, trang tiếp theo là nơi chúng ta có thể xác định mật khẩu mới.
|
||||
|
||||

|
||||
|
||||
Khi chúng ta đã làm những điều trên, chúng ta sẽ đăng nhập và có thể thấy màn hình sau. Là một phần của triển khai Rancher, chúng ta cũng thấy một K3s cluster được tạo.
|
||||
|
||||

|
||||
|
||||
### Sử dụng rancher
|
||||
|
||||
Điều đầu tiên để chúng ta xem xét là K3S cluster được triển khai. Bạn có thể thấy như bên dưới để chúng ta có thể có được cái nhìn rõ ràng về những gì đang xảy ra bên trong cluster của chúng ta. Đây là triển khai mặc định và chúng ta chưa triển khai bất cứ thứ gì cho cluster này. Bạn có thể thấy nó được tạo thành từ 1 node và có 5 deployments. Sau đó, bạn cũng có thể thấy rằng có một số thông số về pods, cores và memory.
|
||||
|
||||

|
||||
|
||||
Trên menu bên trái, chúng ta cũng có tab "Apps & Marketplace", điều này cho phép chúng ta chọn các ứng dụng mà chúng ta muốn chạy trên các cluster của mình, như đã đề cập, Rancher cung cấp cho chúng ta khả năng chạy hoặc quản lý các clusters khác nhau. Với marketplace, chúng ta có thể triển khai các ứng dụng của mình rất dễ dàng.
|
||||
|
||||

|
||||
|
||||
Một điều khác cần đề cập tới là nếu bạn cần có quyền truy cập vào bất cứ cluster nào do Rancher quản lý, ở trên cùng bên phải, bạo có thể mở một kubectl shell tới cluster mà bạn chọn.
|
||||
|
||||

|
||||
|
||||
### Tạo một cluster mới
|
||||
|
||||
Trong hai ngày vừa qua, chúng ta đã tạo một minikube cluster và đã sử dụng Vagrant với VirtualBox để tạo một Kubernetes cluster gồm 3 nodes. Với Rancher, chúng ta cũng có thể tạo cluster. Trong [thư mục Rancher](../../../2022/Days/Kubernetes/Rancher/) bạn sẽ thấy các tệp vagrant tạo ra 3 nodes giống nhau nhưng không có các bước tạo Kubernetes cluster của chúng ta (chúng ta muốn Rancher làm điều này cho chúng ta)
|
||||
|
||||
Tuy nhiên, chúng ta muốn cài đặt docker và cập nhật hệ điều hành nên bạn vẫn sẽ thấy `common.sh` chạy trên các nodes của chúng ta. Nó cũng sẽ căif đặt Kubeadm, Kubectl,... Nhưng nó sẽ không chạy các lệnh Kubeadm để tạo và nối các nodes của chúng ta thành một cluster.
|
||||
|
||||
Chúng ta có thể điều hướng đến vị trì thư mục vagrant và chỉ cần chạy `vagrant up` và điều này sẽ bắt đầu quá trình tạo 3 máy ảo của chúng ta trong VirtualBox.
|
||||
|
||||

|
||||
|
||||
Bây giờ chúng ta đã có các nodes hoặc máy ảo sẵn sàng, sau đó chúng ta có thể sử dụng Rancher để tạo Kubernetes cluster mới của mình. Màn hình đầu tiên để tạo cluster của bạn cung cấp cho bạn một số tuỳ chọn về vị trí của cluster, ví dụ như các dịch vụ Kubernetes được quản lý trên đám mây công cộng, vSphere hoặc lựa chọn khác.
|
||||
|
||||

|
||||
|
||||
Chúng tôi sẽ chọn "custom" vì chúng ta không sử dụng một trong các nền tảng được tích hợp. Trang mở đầu là nơi bạn xác định tên cluster của mình (có ghi local ở dưới nhưng bạn không thể sử dụng local, cluster của chúng ta là vagrant). Bạn có thể xác định các phiên bản Kubernetes tại đây, nhà cung cấp mạng và một số tuỳ chọn cấu hình khác để khởi động và chạy cụm Kubernetes của bạn.
|
||||
|
||||

|
||||
|
||||
Trang tiếp theo sẽ cung cấp cho bạn mã đăng ký cần được chạy trên từng node của bạn với các dịch vụ phù hợp để được kích hoạt. etcd, control-plane và worker. Đối với master node, chúng ta muốn có etcd và control-plan nên có thể nhìn lệnh bên dưới.
|
||||
|
||||

|
||||
|
||||
```
|
||||
sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.6.3 --server https://10.0.0.1 --token mpq8cbjjwrj88z4xmf7blqxcfmwdsmq92bmwjpphdkklfckk5hfwc2 --ca-checksum a81944423cbfeeb92be0784edebba1af799735ebc30ba8cbe5cc5f996094f30b --etcd --controlplane
|
||||
```
|
||||
|
||||
Nếu mạng được định cấu hình chính xác thì bạn sẽ nhanh chóng thấy thông tin sau trong bảng điều khiển rancher của ình, cho biết rằng master node đầu tiên hiện đang được đăng ký và cluster đang được tạo.
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng ta có thể lặp lại quy trình này với các worker nodes bằng lệnh sau và sau một lúc, bạn sẽ thiết lập và chạy các ứng dụng của mình và có khả năng tận dụng marketplace để triển khai các ứng dụng của mình.
|
||||
|
||||
```
|
||||
sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.6.3 --server https://10.0.0.1 --token mpq8cbjjwrj88z4xmf7blqxcfmwdsmq92bmwjpphdkklfckk5hfwc2 --ca-checksum a81944423cbfeeb92be0784edebba1af799735ebc30ba8cbe5cc5f996094f30b --worker
|
||||
```
|
||||
|
||||

|
||||
|
||||
Trong 3 ngày vừa qua, chúng ta đã sử dụng một số cách khác nhau để thiết lập và chạy với Kubernetes cluster, trong những ngày còn lại, chúng tôi sẽ xem xét khía cạnh ứng dụng của nền tảng và nó được cho là phần quan trọng nhất. Chúng ta sẽ xem xét các dịch vụ và khả năng cung cấp cũng như sử dụng dịch vụ của chúng ta trong Kubernetes.
|
||||
|
||||
Tôi đã được nói rằng các yêu cầu xung quanh việc khởi động các rancher node yêu cầu các máy ảo phải có 4GB ram nếu không chúng sẽ gặp sự cố, tôi đã cập nhật vì các worker nodes của chúng ta chỉ có 2GB.
|
||||
|
||||
### Những gì chúng ta sẽ đề cập trong loạt bài về Kubernetes
|
||||
|
||||
- Kiến trúc Kubernetes
|
||||
- Các câu lệnh kubectl
|
||||
- Kubernetes YAML
|
||||
- Kubernetes Ingress
|
||||
- Kubernetes Services
|
||||
- Helm Package Manager
|
||||
- Lưu trữ liên tục - Persistent Storage
|
||||
- Ứng dụng có trạng thái - Stateful Apps
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
|
||||
- [TechWorld with Nana - Kubernetes Tutorial for Beginners [FULL COURSE in 4 Hours]](https://www.youtube.com/watch?v=X48VuDVv0do)
|
||||
- [TechWorld with Nana - Kubernetes Crash Course for Absolute Beginners](https://www.youtube.com/watch?v=s_o8dwzRlu4)
|
||||
- [Kunal Kushwaha - Kubernetes Tutorial for Beginners | What is Kubernetes? Architecture Simplified!](https://www.youtube.com/watch?v=KVBON1lA9N8)
|
||||
|
||||
Hẹn gặp lại vào [ngày 54](day54.md)
|
220
2022/vi/Days/day54.md
Normal file
220
2022/vi/Days/day54.md
Normal file
@ -0,0 +1,220 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Triển khai ứng dụng Kubernetes - Ngày 54'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Triển khai ứng dụng Kubernetes
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048764
|
||||
---
|
||||
|
||||
## Triển khai ứng dụng Kubernetes
|
||||
|
||||
Bây giờ, chúng ta cuối cùng cũng có thể triển khai một số ứng dụng vào trên các cluster của mình, một số người sẽ nói rằng đây là lý do Kubernetes tồn tại, để phân phối ứng dụng.
|
||||
|
||||
Ý tưởng ở đây là chúng ta có thể lấy các container images của mình và triển khai chúng dưới dạng các pods trên Kubernetes cluster của chúng ta để tận dùng Kubernetes như một bộ điều phối container.
|
||||
|
||||
### Trển khai ứng dụng trên Kubernetes
|
||||
|
||||
Có một số cách để chúng ta có thể triển khai các ứng dụng của mình trên Kubernetes cluster, chúng ta sẽ đề cập đến hai trong số các cách tiếp cận phổ biến nhất là tệp YAML mà Heml charts.
|
||||
|
||||
Chúng ta sẽ sử dụng minikube cluster cho các triển khai ứng dụng này. Chúng ta sẽ nhắc lại một số thành phần hoặc khối xây dựng đã đề cập tới trước đó của Kubernetes.
|
||||
|
||||
Xuyên suốt tuần này và trong tuần về Container, chúng ta đã thảo luận về images và lợi ích của Kubernetes cũng như cách chúng ta có thể xử lý việc mở rộng quy mô khác dễ dàng bằng nền tảng này.
|
||||
|
||||
|
||||
Trong bước đầu tiên này, chúng ta sẽ tạo một ứng dụng không trạng thái trong minikube cluster của mình. Chúng ta sẽ sử dụng một ứng dụng không trạng thái theo quy chẩn trong demo đầu tiên với Deployment của `nginx` sử dụng các pods của chúng ta, sau đó chúng ta cũng sẽ tạo một service cho phép chúng ta sử dụng một máy chủ web được phục vụ bởi nginx pod. Tất cả chúng sẽ nằm trong một namespace.
|
||||
|
||||

|
||||
|
||||
### Tạo tệp YAML
|
||||
|
||||
Trong demo đầu tiên, chúng ta muốn xác định mọi thứ chứng ta muốn làm bằng YAML, chúng ta có thể có nguyên một bài nói về YAML nhưng tôi sẽ lướt qua phần này và để lại một số tài nguyên ở cuối bài trình bày chi tiết về YAML.
|
||||
|
||||
Chúng ta có thể tạo các tệp sau dưới dạng một tệp YAML hoặc chúng ta có thể chia nhỏ tệp này cho từng phần của ứng dụng của mình, ví dụ: đây có thể là các tệp riêng biệt dành cho namespace, deployement và service nhưng trong file này, như bên dưới, chúng ta sử dụng `---` đề tách các phần trong một tệp. Bạn có thể tìm thấy tệp này ở [đây](../../../2022/Days/Kubernetes/nginx-stateless-demo.yaml)
|
||||
|
||||
```Yaml
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: nginx
|
||||
"labels": {
|
||||
"name": "nginx"
|
||||
}
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
namespace: nginx
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
replicas: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: nginx-service
|
||||
namespace: nginx
|
||||
spec:
|
||||
selector:
|
||||
app: nginx-deployment
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
```
|
||||
|
||||
### Kiểm tra cluster của chúng ta
|
||||
|
||||
Trước khi chúng ta triển khai bất cứ thứ gì, chúng ta chỉ cần đảm bảo rằng chúng ta không có một namespace nào là `nginx`. Có thể xác nhận việc này bằng cách chạy lệnh `kubectl get namespace` và như bạn có thể thấy dưới đây, chúng ta không có namespace nào là `nginx`.
|
||||
|
||||

|
||||
|
||||
### Triển khai ứng dụng của chúng ta
|
||||
|
||||
Bây giờ chúng ta đã sẵn sàng triển khai ứng dụng của mình lên minikube cluster, quy trình tương tự như thế này sẽ hoạt động trên bất kỳ Kubernetes cluster nào khác.
|
||||
|
||||
Chúng ta cần điều hướng tới vị trị tệp YAML của mình và chạy lệnh `kubectl create -f nginx-stateless-demo.yaml`, sau đó bạn có thể thấy 3 đối tượng đã được tạo và chúng ta có một namespace, deployment và service.
|
||||
|
||||

|
||||
|
||||
Hãy chạy lại lệnh để xem các namespaces có sẵn trong cluster của chúng ta `kubectl get namespace` và giờ bạn có thể thấy rằng chúng ta có namespace mới.
|
||||
|
||||

|
||||
|
||||
Sau đó, nếu chúng ta kiểm tra các pods cho namespace sử dụng lệnh `kubectl get pods -n nginx` bạn sẽ thấy rằng chúng ta có 1 pod sẵn sàng và đang trong trạng thái chạy.
|
||||
|
||||

|
||||
|
||||
Chúng ta cũng có thể kiểm tra service đã được tạo bằng câu lệnh `kubectl get service -n nginx`
|
||||
|
||||

|
||||
|
||||
Cuối cùng, chúng ta có thể kiểm tra xem deployment ở đâu và làm thể nào chúng ta giữ được cấu hình mong muốn của mình.
|
||||
|
||||

|
||||
|
||||
Ở trên có vài lệnh chúng ta cần biết nhưng cũng có thể sử dụng lệnh `kubectl get all -n nginx` để xem mọi thứ chúng ta đã triển khai với tệp YAML đó.
|
||||
|
||||

|
||||
|
||||
Bạn có thể nhận thấy như ở trên rằng chúng ta cũng có một replicaset, trong deployment của mình, chúng ta cấu hình số replicas của image mà chúng ta muốn triển khai. Ban đầu nó được đặt là 1, nhưng nếu muốn nhanh chóng mở rộng quy mô ứng dụng của mình thì chúng ta có thể làm theo những cách sau.
|
||||
|
||||
Chúng ta có thể chỉnh sửa tệp của mình sử dụng `kubectl edit deployment nginx-deployment -n nginx` sẽ mở trình soạn thảo văn bản trong terminal của bạn và cho phép bạn chỉnh sửa deployment của mình.
|
||||
|
||||

|
||||
|
||||
Khi lưu thay đổi bằng trình soạn thảo của bạn trong terrminal, nếu không có sự cố nào và cú pháp chính xác đã được sửu dụng thì bạn sẽ thấy một số tài nguyên được triển khai trong namespace.
|
||||
|
||||

|
||||
|
||||
Bạn cũng có thể thay đổi số lượng replicas sử dụng kubectl với câu lệnh `kubectl scale deployment nginx-deployment --replicas=10 -n nginx`
|
||||
|
||||

|
||||
|
||||
Chúng ta có thể sử dụng phương pháp này để giảm quy mô ứng dụng của mình xuống 1 bằng cả 2 phương pháp. Tôi đã sử dụng lựa chọn chỉnh sửa nhưng bạn cũng có thể sử dụng lệnh `scale` như trên.
|
||||
|
||||

|
||||
|
||||
Hy vọng rằng, bạn có thể thấy ở đây không chỉ việc triển khai ứng dụng siêu nhanh mà còn có khả năng tăng và giảm quy mô ứng dụng một cách nhanh chóng. Nếu đây là một máy chủ web, chúng ta có thể mở rộng quy mô khi có nhiều người sử dụng và giảm xuống khi tải được giảm.
|
||||
|
||||
### Truy cập ứng dụng của chúng ta
|
||||
|
||||
Nhưng làm thế nào để chúng ta có thể truy cập vào máy chủ web của mình?
|
||||
|
||||
Nếu bạn nhìn vào service của chúng ta ở trên, bạn sẽ thấy không có sẵn IP nào ở bên ngoài để chúng ta có thể mở trình duyệt web và truy cập nó. Để truy cập được, chúng ta có một số lựa chọn.
|
||||
|
||||
**ClusterIP** - IP mà bạn thấy là ClusterIP, IP này nằm trên mạng nội bộ của cluster, chỉ những thứ trong cluster mới có thể truy cập tới IP này.
|
||||
|
||||
**NodePort** - Expose dịch vụ trên cùng một cổng của các nodes được chọn trong cluster sử dụng NAT.
|
||||
|
||||
**LoadBalancer** -Tạo một bộ cân bằng tải bên ngoài trên đám mây hiện tại, chúng ta đang sử dụng minikube nhưng ví dụ nếu bạn đã xây dựng Kubernetes cluster của riêng mình trên VirtualBox, bạn cần triển khai một LoadBalancer chẳng hạn như metallb vào cluster của mình để có chức năng này.
|
||||
|
||||
**Port-Forward** - Chúng ta cũng có khả năng chuyển tiếp cổng, cho phép bạn truy cập và tương tác với các process của Kubernetes cluster từ localhost. Lựa chọn này chỉ dành cho kiểm thử và tìm lỗi.
|
||||
|
||||
Bây giờ chúng ta có một số lựa chọn dể chọn và Minikube có vài hạn chế hoặc khác biết so với một Kubernetes cluster thực tế.
|
||||
|
||||
Chúng ta có thể chỉ cần chạy lệnh sau để chuyển tiếp cổng để truy cập ứng dụng từ máy trạm cục bộ của mình.
|
||||
|
||||
`kubectl port-forward deployment/nginx-deployment -n nginx 8090:80`
|
||||
|
||||

|
||||
|
||||
Lưu ý rằng khi bạn chạy lệnh trên, terminal đó sẽ không sử dụng được vì nó sẽ thực hiện việc chuyển tiếp cổng tới máy và cổng cục bộ của bạn.
|
||||
|
||||

|
||||
|
||||
Bây giờ chúng ta sẽ xem xét cụ thể với Minikube về cách chúng ta có thể expose ứng dụng của mình. Chúng ta cũng có thể sử dụng minikube để tạo URL kết nối tới dịch vụ, [chi tiết cụ thể](https://minikube.sigs.k8s.io/docs/commands/service/)
|
||||
|
||||
Trước hết, chúng ta xoá service của mình bằng cách sử dụng `kubectl delete service nginx-service -n nginx`
|
||||
|
||||
Tiếp theo, chúng ta sẽ tạo một service mới sử dụng `kubectl expose deployment nginx-deployment --name nginx-service --namespace nginx --port=80 --type=NodePort` lưu ý ở đây rằng chúng ta sẽ sử dụng Expose và thay đổi type thành NodePort.
|
||||
|
||||

|
||||
|
||||
Cuối cùng trong terminal mới chạy `minikube --profile='mc-demo' service nginx-service --URL -n nginx` để tạo một tunnel cho service của chúng ta.
|
||||
|
||||

|
||||
|
||||
Mở trình duyệt và click vài liên kết trong terminal.
|
||||
|
||||

|
||||
|
||||
### Helm
|
||||
|
||||
Helm là một cách khác để chúng ta có thể triển khai các ứng dụng của mình. Được gọi là "Trình quản lý gói cho Kubernetes". Bạn có thể tìm hiểu thêm tại [đây](https://helm.sh/)
|
||||
|
||||
Helm là trình quản lý gói cho Kubernetes. Helm có thể được coi như yum hoặc apt cho Kubernetes. Heml triển khai các charts mà bạn có thể coi như một ứng dụng được đóng gói. Đây là một blueprint cho các tài nguyên ứng dụng được định cấu hình trước của bạn. Các charts này có thể được triển khai dưới dạng một easy-to-use chart. Sau đó, bạn có thể triển khai một phiên bản khác của chart với một bộ cấu hình khác.
|
||||
|
||||
Họ có một trang mà bạn có thể tham khảo tất cả các Heml charts có sẵ và đương nhiên, bạn có thể tạo biểu đồ của riêng mình. Tài liệu rất rõ ràng và ngắn gọn và không gây khó khăn như khi tôi bắt đầu nghe đến Helm.
|
||||
|
||||
Việc thiết lập và cài đặt Heml cực kỳ đơn giản. Bạn có thể tìm thấy các tệp nhị phân và liên kết tải xuống tại đây cho hầu hết các hệ điều hành, bao gồm cả các thiết bị RaspberryPi arm64.
|
||||
|
||||
Hoặc bạn có thể sử dụng tập lệnh cài đặt và có phiên bản mới nhất của Heml được tải xuống và cài đặt.
|
||||
|
||||
```Shell
|
||||
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
|
||||
|
||||
chmod 700 get_helm.sh
|
||||
|
||||
./get_helm.sh
|
||||
```
|
||||
|
||||
Cuối cùng, cũng có tuỳ trọng sử dụng trình quản lý gói của hệ điều hành,homebrew cho mac, chocolatey cho windows, apt với Ubuntu/Debian, hoặc snap hay pkg.
|
||||
|
||||
Cho tới nay, Helm dường như là cách tốt nhất để tải xuống và cài đặt các ứng dụng thử nghiệm khác nhau trong cluster của bạn.
|
||||
|
||||
Một tài nguyên tốt ở đây là [ArtifactHUB](https://artifacthub.io/) giúp tìm, cài đặt và công khai các gói Kubernetes. Cũng xin nhắc tới [KubeApps](https://kubeapps.com/) với giao diện người dùng để hiển thị các helm charts.
|
||||
|
||||
### Những gì chúng ta sẽ đề cập trong loạt bài về Kubernetes
|
||||
|
||||
- Kiến trúc Kubernetes
|
||||
- Các câu lệnh kubectl
|
||||
- Kubernetes YAML
|
||||
- Kubernetes Ingress
|
||||
- Kubernetes Services
|
||||
- Helm Package Manager
|
||||
- Lưu trữ liên tục - Persistent Storage
|
||||
- Ứng dụng có trạng thái - Stateful Apps
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
|
||||
- [TechWorld with Nana - Kubernetes Tutorial for Beginners [FULL COURSE in 4 Hours]](https://www.youtube.com/watch?v=X48VuDVv0do)
|
||||
- [TechWorld with Nana - Kubernetes Crash Course for Absolute Beginners](https://www.youtube.com/watch?v=s_o8dwzRlu4)
|
||||
- [Kunal Kushwaha - Kubernetes Tutorial for Beginners | What is Kubernetes? Architecture Simplified!](https://www.youtube.com/watch?v=KVBON1lA9N8)
|
||||
|
||||
Hẹn gặp lại vào [ngày 55](day55.md)
|
237
2022/vi/Days/day55.md
Normal file
237
2022/vi/Days/day55.md
Normal file
@ -0,0 +1,237 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - State và Ingress trong Kubernetes - Ngày 55'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - State và Ingress trong Kubernetes
|
||||
tags: 'DevOps, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048779
|
||||
---
|
||||
|
||||
## State và Ingress trong Kubernetes
|
||||
|
||||
Trong bài viết cuối cùng của Kubernetes, chúng ta sẽ xem xét State và Ingress.
|
||||
|
||||
Mọi thứ chúng ta đã nói cho tới nay là về phi trạng thái (stateless), phi trạng thái có nghĩa rằng các ứng dụng của chúng ta không quan tâm tới mạng nào đang được sử dụng và không cần bất cứ bộ lưu trữ vĩnh viễn nào. Trong khi các ứng dụng có trạng thái ví dụ như cơ sở dữ liệu, để các ứng dụng như vậy hoạt động chính xác, bạn sẽ cần đảm bảo rằng các pods có thể liên lạc với nhau thông qua một định danh duy nhất không thay đổi (hostnames, IPs,...) Ví dụ về các ứng dụng có trạng thái bao gồm các MySQL clusters, Redis, Kafka, MongoDB và các ứng dụng khác. Về cơ bản, bất kỳ ứng dụng nào lưu trữ dữ liệu.
|
||||
|
||||
### Ứng dụng có trạng thái
|
||||
|
||||
StatefulSets đại diện cho một tập hợp các pods có định danh duy nhất, không đổ và hostnames ổn định mà Kubernetes sẽ duy trì bất kể chúng được lập lịch chạy ở đâu. Thông tin trạng thái và dữ liệu có khả năng phục hồi khác cho bất kỳ Stateful Set Pod cụ thể nào được duy trì trong persistent disk storage (bộ lưu trữ đĩa) được liên kết với StatefulSet.
|
||||
|
||||
### Deployment với StatefulSet
|
||||
|
||||
- Việc tạo ra các bản sao của ứng dụng có trạng thái khó khăn hơn.
|
||||
- Việc tạo ra các bản sau của các pods trong một deployment (ứng dụng phi trạng thái) là giống hệt nhau và có thể hoán đổi.
|
||||
- Tạo ra các pods theo thứ tự ngẫu nhiên với các giá trị băm ngẫu nhiên.
|
||||
- Một Service cân bằng tải cho bất kỳ pod nào.
|
||||
|
||||
Khi nói đến StatefulSets hoặc ứng dụng có trạng thái, những điều trên trở nên khó khăn hơn.
|
||||
|
||||
- Không thể tạo hoặc xoá cùng một lúc.
|
||||
- Không thể được truy cập một cách ngẫu nhiên.
|
||||
- Các bản sao của pods không giống hệt nhau.
|
||||
|
||||
Bạn có thể thấy một số thứ trong demo của chúng ta ngay sau đây về việc mỗi pods có một định danh riêng. Với ứng dụng phi trạng thái, bạn sẽ thấy các tên ngẫu nhiên, ví dụ: `app-7469bbb6d7-9mhxd` trong khi ứng dụng có trạng thái sẽ được sắp xếp nghiêm chỉnh hơn với `mongo-0` và khi được mở rộng quy mô, nó sẽ ạo một pod mới có tên là `mongo-1`.
|
||||
|
||||
Các pods này được tạo từ cùng một cấu hình, nhưng chúng không thể hoán đổi cho nhau. Mỗi nhóm StatefulSet có một mã định danh cố định trong mọi lần lập lịch lại. Điều này là cần thiết bởi vì khi chúng ta yêu cầu các workloads có trạng thái ví dụ như cơ sở dữ liệu nơi chúng ta có các yêu cầu ghi và đọc, chúng ta không thể có hai pods cùng ghi một lúc mà không biết về việc này vì chúng sẽ khiến dữ liệu mất đi tính nhất quán. Chúng ta cần đảm bảo rằng chỉ một trong số các pods của chúng ta ghi vào cơ sở dữ liệu tại bất kỳ thời điểm nào, tuy nhiên, chúng tôi có thể có nhiều pods đọc dữ liệu đó.
|
||||
|
||||
Mỗi pod trong StatefulSet sẽ có quyền truy cập vào persistent volume và một bản sao của cơ sở dữ liệu để đọc từ đó, và nó sẽ được cập nhật liên tự từ bản gốc. Một điều thú vị khác cần lưu ý là mỗi pod cũng sẽ lưu trữ trạng thái pod của nó trong persistent volume này, nếu sau đó `mongo-0` bị chết thì một pod mới sẽ được cung cấp và nó sẽ tiếp quản trạng thái pod được lưu trong bộ lưu trữ.
|
||||
|
||||
TLDR; StatefulSets vs Deployments
|
||||
|
||||
- Tên nhóm có thể được dự đoán = `mongo-0`
|
||||
- DNS cố định
|
||||
- Định danh pod - giữ nguyên State, giữ nguyên Role
|
||||
- Tạo ra các bản sao của các ứng dụng có trạng thái rất phức tạp
|
||||
- Có rất nhiều việc bạn phải làm:
|
||||
- Định cấu hình cho các bản sao và đồng bộ hoá dữ liệu
|
||||
- Tạo các bộ nhớ được chia sẻ
|
||||
- Quản lý & sao lưu
|
||||
|
||||
### Persistant Volumes | Claims | StorageClass
|
||||
|
||||
Làm cách nào để duy trì dữ liệu trong Kubernetes?
|
||||
|
||||
Chúng ta đã đề cập ở trên nhắc tới ứng dụng có trạng thái, chúng ta phải lưu trữ trạng thái ở đâu đó và đây là lúc cần có volume (một ổ đĩa), Kubernetes không cup cấp tính bền vững.
|
||||
|
||||
Chúng ta yêu cầu lớp lưu trữ không phụ thuộc vào vòng đời của pod. Bộ lưu trữ này phải luôn có sẵn và truy cập được từ tất cả các Kubernetes nodes. Bộ lưu trữ cũng phải nằm ngoài Kubernetes cluster để có thể tồn tại độc lập ngay cả khi Kubernetes cluster gặp sự cố.
|
||||
|
||||
### Persistent Volume
|
||||
|
||||
- Một tài nguyên của cluster (như CPU và RAM) để lưu trữ dữ liệu
|
||||
- Được tạo thông qua một tệp YAML
|
||||
- Cần lưu trữ vật lý thực tế (Network-attached storage - NAS)
|
||||
- Tích hợp từ bên ngoài vào Kubernetes cluster của bạn
|
||||
- Bạn có thể có nhiều loại lưu trữ khi sử dụng các kho lưu trữ của mình
|
||||
- PVs không được chia theo các namespaces
|
||||
- Local storage khả dụng nhưng sẽ rành riêng cho một node trong cluster
|
||||
- Cơ sở dữ liệu yêu cầu tính bền vững nên sử dụng lưu trữ từ xa (NAS)
|
||||
|
||||
### Persistent Volume Claim
|
||||
|
||||
Một persistent volume có thể sẵn có và đảm bảo tính sẵn sàng nhưng nếu nó không được claim bởi một ứng dụng, nó sẽ không được sử dụng.
|
||||
|
||||
- Được tạo thông qua một tệp YAML
|
||||
- Persistent Volume Claim được sử dụng trong cấu hình pod (thuộc tính volumes)
|
||||
- PVCs ở trong cùng một namespace với pod
|
||||
- Volume được mount vào pod
|
||||
- Pods có thể có nhiều kiểu volume type khác nhau (ConfigMap, Secret, PVC)
|
||||
|
||||
Một cách khác để nghĩ về PVs và PVCs như sau:
|
||||
PVs được tạo bởi Kubernetes Admin
|
||||
PVCs được tạo bởi người dùng hoặc nhà phát triển ứng dụng
|
||||
|
||||
Cũng có 2 loại volumes khác mà chúng ta sẽ không đi vào chi tiết nhưng có được đề cập đến:
|
||||
|
||||
### ConfigMaps | Secrets
|
||||
|
||||
- Tệp cấu hình cho pod của bạn.
|
||||
- Tệp certificate cho pod của bạn.
|
||||
|
||||
### StorageClass
|
||||
|
||||
- Được tạo thông qua tệp YAML
|
||||
- Cung cấp Persistent Volumes một cách linh hoạt khi PVC yêu cầu nó
|
||||
- Mỗi storage backend có provisioner của nó
|
||||
- Storage bacned được định nghĩa bằng YAML (thông qua thuộc tính provisioner)
|
||||
- Trìu tượng hoá các nhà cung cấp lưu trữ ở dưới
|
||||
- Xác định các thông số cho lưu trữ đó
|
||||
|
||||
### Tổng kết
|
||||
|
||||
Trong bài viết ngày hôm qua, chúng ta đã được hướng dẫn cách tạo ứng dụng phi trạng thái, ở đây chúng ta sẽ làm điều tương tự nhưng sẽ triển khai workload có trạng thái sử dụng minikube cluster của mình.
|
||||
|
||||
Một bản tóm tắt về các lệnh minikube mà chúng ta sẽ sử dụng để có các chứ năng và các addons để sử dụng tính bền bỉ là `minikube start --addons volumesnapshots,csi-hostpath-driver --apiserver-port=6443 --container-runtime=containerd -p mc-demo --Kubernetes-version=1.21.2`
|
||||
|
||||
Lệnh này sử dụng CSI-hostpath-driver, thứ cung cấp cho chúng ta storageclass, thứ mà tôi sẽ trình bày sau.
|
||||
|
||||
Ứng dụng được xây dựng xong sẽ trông như sau:
|
||||
|
||||

|
||||
|
||||
Bạn có thể tìm thấy tệp cấu hình YAML cho ứng dụng này tại [pacman-stateful-demo.yaml](../../Days/Kubernetes/pacman-stateful-demo.yaml)
|
||||
|
||||
### Cấu hình StorageClass
|
||||
|
||||
Tuy nhiên, còn một bước nữa mà chúng ta nên chạy trước khi bắt đầu triển khai ứng dụng của mình và đó là đảm bảo storageclass của chúng ta (CSI-hostpath-sc) là lưu trữ mặc định của chúng ta. Trước tiên, chúng ta có thể kiểm tra điều này bằng cách chạy lệnh `kubectl get storageclass` nhưng minikube cluster sẽ hiển thị standard storageclass là mặc định, vì vậy chúng ta phải thay đổi điều đó bằng các lệnh dưới đây.
|
||||
|
||||
Lệnh đầu tiên này sẽ đặt CSI-hostpath-sc storageclass là mặc định.
|
||||
|
||||
`kubectl patch storageclass csi-hostpath-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'`
|
||||
|
||||
Lệnh này sẽ xoá chú thích mặc định khỏi standard StorageClass.
|
||||
|
||||
`kubectl patch storageclass standard -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'`
|
||||
|
||||

|
||||
|
||||
Chúng ta bắt đầu không có Pacman namespace trong cluster của mình `kubectl get namespace`
|
||||
|
||||

|
||||
|
||||
Chúng ta sau đó triểu khai tệp YAML của mình. `kubectl create -f pacman-stateful-demo.yaml` bạn có thể thấy từ lệnh này, chúng ta đã tạo một số đối tượng trong Kubernetes cluster.
|
||||
|
||||

|
||||
|
||||
Giờ đây chúng ta đã có namespace mới được tạo.
|
||||
|
||||

|
||||
|
||||
Sao đó, như bạn có thể thấy trong ảnh tiếp theo và lệnh `kubectl get all -n pacman` sẽ cho thấy có một số điều đang xảy ra trong namespace của mình. Chúng ta có các pods chạy frontend với NodeJS, chúng ta có mongo chạy backend cơ sở dữ liệu. Có các service cho Pacman và mongo truy cập vào. Chúng ta có một deployment cho Pacman và một statefulset cho mongo.
|
||||
|
||||

|
||||
|
||||
Chúng ta cũng có persistent volume và persistent volume claim, lệnh `kubectl get pv` sẽ cung cấp cho chúng ta persistent volumes trong mọi namespaces và lệnh `kubectl get pvc -n pacman` sẽ cung cấp cho chúng ta các persistent volume claims trong namespace pacman.
|
||||
|
||||

|
||||
|
||||
### Chơi game | Ý tôi là truy cập vào ứng dụng siêu quan trọng của chúng ta
|
||||
|
||||
Vì chúng ta đang sử dụng Minikube và như đã đề cập trong ứng dụng phi trạng thái, chúng ta có một số trở ngại cần vượt qua khi truy cập ứng dụng của mình. Tuy nhiên, chúng ta có quyền truy cập vào ingress hoặc load balancer trong cluster của mình, service được thiết lập để tự động nhận IP từ đó có thể truy cập từ bên ngoài (bạn có thể thấy điều này ở trên trong hình ảnh chụp các thành phần trong Pacman namespace).
|
||||
|
||||
Đối với demo này, chúng ta sẽ sử dụng phương thức chuyển tiếp cổng để truy cập ứng dụng của mình. Bằng cách mở một terminal và chạy lệnh `kubectl port-forward svc/pacman 9090:80 -n pacman`. Mở trình duyệt và giờ đây, chúng ta sẽ có quyền truy cập vào ứng dụng của mình. Nếu bạn đang chạy ứng dụng này trên AWS thì nó cũng sẽ báo vị trí trên đám mây cũng như máy chủ chạy pod của bạn trong Kubernetes, một lần nữa bạn có thể nhìn lại và thấy tên pod này trên những ảnh chụp màn hình của chúng ta ở trên.
|
||||
|
||||

|
||||
|
||||
Bây giờ chúng ta có thể chơi và ghi điểm số, sau đó nó sẽ được lưu trong cơ sở dữ liệu của chúng ta.
|
||||
|
||||

|
||||
|
||||
OK, thât tuyệt nếu chúng ta có thể có một điểm số cao nhưng điều gì sẽ xảy ra nếu chúng ta xoá pod `mongo-0`? Bằng lệnh ``kubectl delete pod mongo-0 -n pacman` tôi có thể xoá nó và nếu bạn vẫn ở trong ứng dụng, bạn sẽ thấy điểm số sẽ không khả dụng ít nhất trong vài giây.
|
||||
|
||||

|
||||
|
||||
Bây giờ, nếu tôi quay trở lại trò chơi của mình, tôi có thể tạo một trò chơi mới và xem điểm số cao nhất của mình. Tuy nhiên, cách duy nhất mà bạn có thể thực sự tin tôi là hãy tự mình thử và chia sẻ lên mạng xã hội về điểm số của mình!
|
||||
|
||||

|
||||
|
||||
Với việc triển khai, chúng ta có thể mở rộng quy mô ứng dụng này bằng cách sử dụng các lệnh trong phần trước nhưng nếu bạn muốn tổ chức một bữa tiệc Pacman siêu to khổng lồ, bạn có thể mở rộng quy mô bằng cách sử dụng lệnh `kubectl scale deployment pacman --replicas=10 -n pacman`
|
||||
|
||||

|
||||
|
||||
### Tìm hiểu về Ingress
|
||||
|
||||
Trước khi chúng ta kết thúc phần về Kubernetes, tôi cũng muốn đề cập đến một phần kiến thức lớn của Kubernetes, đó là ingress.
|
||||
|
||||
### Ingress là gì?
|
||||
|
||||
Cho tới nay, với các ví dụ của chúng ta, chúng ta sử dụng port-forward (chuyển tiếp cổng) hoặc chúng ta sử dụng cách lệnh cụ thể trong minikube để có quyền truy cập vào các ứng dụng của mình, nhưng điều này sẽ không hoạt động trong môi trường sản xuất (production). Chúng ta sẽ muốn có một cách tốt hơn để truy cập các ứng dụng của mình trên quy mô lớn với nhiều người dùng.
|
||||
|
||||
Chúng ta cũng đã nói về NodePort là một tuỳ chọn, nhưng một lần nữa, điều này chỉ dành cho mục đích thử nghiệm.
|
||||
|
||||
Ingress cung cấp cho chúng ta một cách tốt hơn để expose ứng dụng của mình, điều này cho phép xác định các quy tắc định tuyến trong Kubernetes cluster của mình.
|
||||
|
||||
Đối với ingress, chúng ta sẽ tạo một yêu cầu chuyển tiếp tới internal service của ứng dụng.
|
||||
|
||||
### Khi nào bạn cần ingress?
|
||||
|
||||
Nếu bạn đang sử dụng nhà cung cấp điện toán đám mây, một dịch vụ Kubernetes được quản lý rất có thể sẽ có tuỳ chọn ingress của họ hoặc họ sẽ cung cấp cho bạn tuỳ chọn cân bằng tải. Bạn không phải tự mình triển khai điều này, một trong những lợi ích của dịch vụ Kubernetes được quản lý.
|
||||
|
||||
Nếu bạn đang chạy cluster của mình thì bạn sẽ cần cấu hình một entrypoint
|
||||
If you are running your cluster then you will need to configure an entrypoint.
|
||||
|
||||
### Cấu hình Ingress với Minikube
|
||||
|
||||
Trên clsuter đang chạy của tôi với tên gọi mc-demo, tôi có thể chạy lệnh sau để bật tính năng ingress trên cluster của mình.
|
||||
|
||||
`minikube --profile='mc-demo' addons enable ingress`
|
||||
|
||||

|
||||
|
||||
Nếu chúng ta kiểm tra các namespace bây giờ, bạn sẽ thấy rằng chúng ta có một namespace mới với tên ingress-nginx `kubectl get ns`
|
||||
|
||||

|
||||
|
||||
Bây giờ, chúng ta phải tạo cấu hình YAML cho ingress để truy cập dịch vụ pacman. Tôi đã thêm tệp này vào repository này [pacman-ingress.yaml](../../Days/Kubernetes/pacman-ingress.yaml)
|
||||
|
||||
Sau đó, chúng ta có thể tạo nó trong ingress namespace của chúng ta với lệnh `kubectl create -f Pacman-ingress.yaml`
|
||||
|
||||

|
||||
|
||||
Sau đó, nếu chúng ta chạy `kubectl get ingress -n Pacman`
|
||||
|
||||

|
||||
|
||||
Sau đó, tôi được thông báo rằng vì chúng ta đang sử dụng minikube chạy trên WSL2 trong Windows nên chúng ta phải tạo minikube tunnel bằng cách sử dụng lệnh `minikube tunnel --profile=mc-demo`
|
||||
|
||||
Nhưng tôi vẫn không thể truy cập vào 192.168.49.2 và chơi game Pacman của mình.
|
||||
|
||||
Nếu bất kỳ ai có hoặc có thể làm cho điều này hoạt động trên Windows và WSL, tôi sẽ rất biết ơn nếu bạn bổ sung vào phần này. Tôi cảm thấy bài viết này sẽ giúp xác định nguyên nhân có thể khiến ingress không hoạt động với WSL [Configuring Ingress to run Minikube on WSL2 using Docker runtime](https://hellokube.dev/posts/configure-minikube-ingress-on-wsl2/)
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
Nếu bạn có tài liệu MIỄN PHÍ mà bạn đã sử dụng thì vui lòng thêm chúng vào đây thông qua PR cho repository này và tôi sẽ sẵn lòng thêm chúng vào.
|
||||
|
||||
- [Kubernetes StatefulSet simply explained](https://www.youtube.com/watch?v=pPQKAR1pA9U)
|
||||
- [Kubernetes Volumes explained](https://www.youtube.com/watch?v=0swOh5C3OVM)
|
||||
- [Kubernetes Ingress Tutorial for Beginners](https://www.youtube.com/watch?v=80Ew_fsV4rM)
|
||||
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
|
||||
- [TechWorld with Nana - Kubernetes Tutorial for Beginners [FULL COURSE in 4 Hours]](https://www.youtube.com/watch?v=X48VuDVv0do)
|
||||
- [TechWorld with Nana - Kubernetes Crash Course for Absolute Beginners](https://www.youtube.com/watch?v=s_o8dwzRlu4)
|
||||
- [Kunal Kushwaha - Kubernetes Tutorial for Beginners | What is Kubernetes? Architecture Simplified!](https://www.youtube.com/watch?v=KVBON1lA9N8)
|
||||
|
||||
Bài viết này kết thúc phần Kubernetes của chúng ta, có rất nhiều nội dung khác mà chúng ta có thể trình bày về Kubernetes và 7 ngày chỉ giúp chúng ta có được kiến thức cơ bản, mọi người có thể xem qua [100DaysOfKubernetes](https://100daysofkubernetes.io/overview.html) để có một cái nhìn đầy đủ hơn.
|
||||
|
||||
Tiếp theo, chúng ta sẽ xem xét đến Cơ sở hạ tầng dưới dạng mã (Infrastructure as Code - IaC) và tầm quan trọng của nó từ góc độ DevOps.
|
||||
|
||||
Hẹn gặp lại vào [ngày 56](day56.md)
|
@ -91,13 +91,13 @@ Cách nhanh nhất để liên lạc với tôi là thông qua Twitter tại [@M
|
||||
|
||||
### Kubernetes
|
||||
|
||||
- [✔️] ☸ 49 > [The Big Picture: Kubernetes](Days/day49.md)
|
||||
- [✔️] ☸ 50 > [Choosing your Kubernetes platform](Days/day50.md)
|
||||
- [✔️] ☸ 51 > [Deploying your first Kubernetes Cluster](Days/day51.md)
|
||||
- [✔️] ☸ 52 > [Setting up a multinode Kubernetes Cluster](Days/day52.md)
|
||||
- [✔️] ☸ 53 > [Rancher Overview - Hands On](Days/day53.md)
|
||||
- [✔️] ☸ 54 > [Kubernetes Application Deployment](Days/day54.md)
|
||||
- [✔️] ☸ 55 > [State and Ingress in Kubernetes](Days/day55.md)
|
||||
- [✔️] ☸ 49 > [Bức tranh toàn cảnh: Kubernetes](Days/day49.md)
|
||||
- [✔️] ☸ 50 > [Chọn nền tảng chạy Kubernetes](Days/day50.md)
|
||||
- [✔️] ☸ 51 > [Triển khai Kubernetes cluster đầu tiên](Days/day51.md)
|
||||
- [✔️] ☸ 52 > [Thiết lập Kubernetes cluster đa node](Days/day52.md)
|
||||
- [✔️] ☸ 53 > [Tổng quan về Rancher - Thực hành](Days/day53.md)
|
||||
- [✔️] ☸ 54 > [Triển khai ứng dụng Kubernetes](Days/day54.md)
|
||||
- [✔️] ☸ 55 > [State và Ingress trong Kubernetes](Days/day55.md)
|
||||
|
||||
### Học cơ sở hạ tầng dưới dạng mã (Infrastructure as Code)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user