Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container

Theo yêu cầu của chúng tôi, Habr đã tạo một trung tâm Kubernetes và chúng tôi hân hạnh đặt ấn phẩm đầu tiên trong đó. Đặt mua!

Kubernetes thật dễ dàng. Tại sao các ngân hàng trả cho tôi rất nhiều tiền để làm việc trong lĩnh vực này, trong khi bất kỳ ai cũng có thể làm chủ công nghệ này chỉ trong vài giờ?

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container

Nếu bạn nghi ngờ Kubernetes có thể được học quá nhanh, tôi khuyên bạn nên thử tự mình làm điều đó. Cụ thể, sau khi thành thạo tài liệu này, bạn sẽ có thể chạy một ứng dụng dựa trên các dịch vụ siêu nhỏ trong cụm Kubernetes. Tôi có thể đảm bảo điều này, bởi vì tôi sử dụng phương pháp tương tự ở đây để dạy khách hàng cách làm việc với Kubernetes. Điều gì làm cho hướng dẫn này khác với những hướng dẫn khác? Trên thực tế, rất nhiều thứ. Vì vậy, hầu hết các tài liệu này đều bắt đầu bằng phần giải thích về những điều đơn giản - các khái niệm về Kubernetes và các tính năng của lệnh kubectl. Tác giả của những bài báo này giả định rằng người đọc của họ đã quen thuộc với việc phát triển ứng dụng, vi dịch vụ và vùng chứa Docker. Chúng ta sẽ đi con đường khác. Đầu tiên, hãy nói về cách chạy một ứng dụng dựa trên microservice trên máy tính. Sau đó, chúng ta sẽ xem xét việc xây dựng hình ảnh vùng chứa cho từng dịch vụ siêu nhỏ. Và sau đó, chúng ta sẽ làm quen với Kubernetes và phân tích việc triển khai một ứng dụng dựa trên microservice trong một cụm do Kubernetes quản lý.

Cách tiếp cận này, với cách tiếp cận dần dần đối với Kubernetes, sẽ mang lại sự hiểu biết sâu sắc về những gì đang xảy ra mà một người bình thường cần để hiểu mọi thứ được sắp xếp đơn giản như thế nào trong Kubernetes. Kubernetes chắc chắn là một công nghệ đơn giản, miễn là bất kỳ ai muốn thành thạo nó đều biết nó được sử dụng ở đâu và như thế nào.

Bây giờ, không cần phải chần chừ thêm nữa, hãy bắt tay vào làm việc và nói về ứng dụng mà chúng ta sẽ làm việc cùng.

ứng dụng thử nghiệm

Ứng dụng của chúng tôi sẽ chỉ thực hiện một chức năng. Nó lấy một câu làm đầu vào, sau đó, sử dụng các công cụ phân tích văn bản, nó thực hiện phân tích tình cảm của câu này, thu được đánh giá về thái độ tình cảm của tác giả câu đối với một đối tượng nhất định.

Đây là giao diện của cửa sổ chính của ứng dụng này.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Ứng dụng web phân tích tình cảm

Từ quan điểm kỹ thuật, ứng dụng bao gồm ba dịch vụ siêu nhỏ, mỗi dịch vụ giải quyết một nhóm nhiệm vụ nhất định:

  • SA-Frontend là một máy chủ web Nginx phục vụ các tệp tĩnh React.
  • SA-WebApp là một ứng dụng web được viết bằng Java để xử lý các yêu cầu từ giao diện người dùng.
  • SA-Logic là một ứng dụng Python thực hiện phân tích tình cảm văn bản.

Điều quan trọng cần lưu ý là microservice không tồn tại một cách cô lập. Họ thực hiện ý tưởng "tách nhiệm vụ", nhưng đồng thời họ cần tương tác với nhau.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Luồng dữ liệu trong ứng dụng

Trong sơ đồ trên, bạn có thể thấy các giai đoạn được đánh số của hệ thống, minh họa các luồng dữ liệu trong ứng dụng. Hãy phá vỡ chúng:

  1. Trình duyệt yêu cầu tệp từ máy chủ index.html (lần lượt tải gói ứng dụng React).
  2. Người dùng tương tác với ứng dụng, điều này gây ra cuộc gọi đến ứng dụng web dựa trên Spring.
  3. Ứng dụng web chuyển tiếp yêu cầu phân tích cú pháp văn bản tới ứng dụng Python.
  4. Ứng dụng Python phân tích tình cảm của văn bản và trả về kết quả dưới dạng phản hồi cho yêu cầu.
  5. Ứng dụng Spring gửi phản hồi đến ứng dụng React (ứng dụng này sẽ hiển thị kết quả của văn bản được phân tích cú pháp cho người dùng).

Mã cho tất cả các ứng dụng này có thể được tìm thấy đây. Tôi khuyên bạn nên sao chép kho lưu trữ này cho chính mình ngay bây giờ, vì có rất nhiều thử nghiệm thú vị với nó ở phía trước.

Chạy ứng dụng dựa trên microservice trên máy cục bộ

Để ứng dụng hoạt động, chúng ta cần khởi động cả ba dịch vụ siêu nhỏ. Hãy bắt đầu với thứ đẹp nhất trong số chúng - ứng dụng giao diện người dùng.

▍Thiết lập React để phát triển cục bộ

Để chạy ứng dụng React, bạn cần cài đặt khung Node.js và NPM trên máy tính của mình. Sau khi bạn cài đặt tất cả những thứ này, hãy sử dụng thiết bị đầu cuối vào thư mục dự án sa-frontend và chạy lệnh sau:

npm install

Bằng cách thực hiện lệnh này trong thư mục node_modules các phụ thuộc của ứng dụng React sẽ được tải, các bản ghi của chúng nằm trong tệp package.json. Sau khi tải xuống các phụ thuộc trong cùng một thư mục, hãy chạy lệnh sau:

npm start

Đó là tất cả. Ứng dụng React hiện đang chạy và có thể được truy cập bằng cách điều hướng đến địa chỉ trình duyệt localhost:3000. Bạn có thể thay đổi điều gì đó trong mã của anh ấy. Bạn sẽ thấy ngay tác dụng của những thay đổi này trên trình duyệt. Điều này có thể thực hiện được nhờ vào cái gọi là sự thay thế "nóng" của các mô-đun. Nhờ đó, quá trình phát triển front-end trở thành một trải nghiệm đơn giản và thú vị.

▍Chuẩn bị ứng dụng React để sản xuất

Với mục đích thực sự sử dụng ứng dụng React, chúng ta cần chuyển đổi nó thành một tập hợp các tệp tĩnh và phân phát chúng cho các máy khách sử dụng máy chủ web.

Để xây dựng ứng dụng React, một lần nữa sử dụng thiết bị đầu cuối, điều hướng đến thư mục sa-frontend và chạy lệnh sau:

npm run build

Điều này sẽ tạo một thư mục trong thư mục dự án build. Nó sẽ chứa tất cả các tệp tĩnh cần thiết để ứng dụng React hoạt động.

▍Cung cấp tệp tĩnh với Nginx

Trước tiên, bạn cần cài đặt và chạy máy chủ web Nginx. Здесь bạn có thể tải xuống và tìm hướng dẫn cài đặt và chạy nó. Sau đó, bạn cần sao chép nội dung của thư mục sa-frontend/build vào thư mục [your_nginx_installation_dir]/html.

Với phương pháp này, tệp được tạo trong quá trình lắp ráp ứng dụng React index.html sẽ có sẵn tại [your_nginx_installation_dir]/html/index.html. Theo mặc định, đây là tệp mà máy chủ Nginx phát hành khi truy cập nó. Máy chủ được cấu hình để lắng nghe trên một cổng 80, nhưng bạn có thể tùy chỉnh nó theo cách bạn muốn bằng cách chỉnh sửa tệp [your_nginx_installation_dir]/conf/nginx.conf.

Bây giờ hãy mở trình duyệt của bạn và truy cập localhost:80. Bạn sẽ thấy trang ứng dụng React.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Ứng dụng React được cung cấp bởi máy chủ Nginx

Nếu bây giờ bạn nhập nội dung nào đó vào trường Type your sentence và nhấn nút Send - sẽ không có chuyện gì đâu. Tuy nhiên, nếu bạn nhìn vào bảng điều khiển, bạn có thể thấy các thông báo lỗi ở đó. Để hiểu chính xác những lỗi này xảy ra ở đâu, hãy phân tích mã ứng dụng.

▍Phân tích mã của ứng dụng giao diện người dùng

Nhìn vào mã của tập tin App.js, chúng ta có thể thấy rằng việc nhấp vào nút Send gọi một phương thức analyzeSentence(). Mã cho phương pháp này được hiển thị bên dưới. Đồng thời, hãy chú ý đến thực tế là đối với mỗi dòng có nhận xét về hình thức # Номер, có một lời giải thích được đưa ra bên dưới mã. Theo cách tương tự, chúng tôi sẽ phân tích các đoạn mã khác.

analyzeSentence() {
    fetch('http://localhost:8080/sentiment', {  // #1
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
                       sentence: this.textField.getValue()})// #2
    })
        .then(response => response.json())
        .then(data => this.setState(data));  // #3
}

1. URL mà yêu cầu POST được thực hiện. Địa chỉ này được coi là một ứng dụng đang chờ các yêu cầu đó.

2.Cơ thể yêu cầu được gửi đến ứng dụng. Đây là một phần thân yêu cầu ví dụ:

{
    sentence: "I like yogobella!"
}

3.Khi nhận được phản hồi cho yêu cầu, trạng thái của thành phần được cập nhật. Điều này làm cho thành phần kết xuất lại. Nếu chúng tôi nhận được dữ liệu (nghĩa là đối tượng JSON chứa dữ liệu đã nhập và điểm văn bản được tính toán), chúng tôi sẽ xuất thành phần Polaritymiễn là các điều kiện được đáp ứng. Đây là cách chúng tôi mô tả thành phần:

const polarityComponent = this.state.polarity !== undefined ?
    <Polarity sentence={this.state.sentence} 
              polarity={this.state.polarity}/> :
    null;

Mã dường như hoạt động khá tốt. Điều gì là sai ở đây, dù sao? Nếu bạn cho rằng tại địa chỉ mà ứng dụng đang cố gửi yêu cầu POST tới, chưa có gì có thể chấp nhận và xử lý yêu cầu này, thì bạn hoàn toàn đúng. Cụ thể, để xử lý các yêu cầu đến địa chỉ http://localhost:8080/sentiment, chúng ta cần chạy một ứng dụng web dựa trên Spring.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Chúng tôi cần một ứng dụng Spring có thể chấp nhận yêu cầu POST

▍Thiết lập ứng dụng web dựa trên Spring

Để triển khai ứng dụng Spring, bạn cần JDK8 và Maven và các biến môi trường được định cấu hình đúng cách. Sau khi bạn cài đặt tất cả những thứ này, bạn có thể tiếp tục làm việc với dự án của chúng tôi.

▍Đóng ứng dụng vào file jar

Điều hướng, sử dụng thiết bị đầu cuối, đến thư mục sa-webapp và nhập lệnh sau:

mvn install

Sau khi thực hiện lệnh này trong thư mục sa-webapp thư mục sẽ được tạo target. Đây là nơi sẽ chứa ứng dụng Java, được đóng gói trong một tệp jar, được đại diện bởi tệp sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍Khởi chạy ứng dụng Java

Đi tới thư mục target và chạy ứng dụng bằng lệnh sau:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar

Sẽ xảy ra lỗi khi thực hiện lệnh này. Để bắt đầu sửa nó, chúng ta có thể phân tích các chi tiết ngoại lệ trong dữ liệu theo dõi ngăn xếp:

Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"

Đối với chúng tôi, điều quan trọng nhất ở đây là đề cập đến việc không thể làm rõ ý nghĩa sa.logic.api.url. Hãy phân tích mã nơi xảy ra lỗi.

▍Phân tích mã ứng dụng Java

Đây là đoạn mã nơi xảy ra lỗi.

@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
    @Value("${sa.logic.api.url}")    // #1
    private String saLogicApiUrl;
    @PostMapping("/sentiment")
    public SentimentDto sentimentAnalysis(
        @RequestBody SentenceDto sentenceDto) 
    {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.postForEntity(
                saLogicApiUrl + "/analyse/sentiment",    // #2
                sentenceDto, SentimentDto.class)
                .getBody();
    }
}

  1. trong SentimentController có một lĩnh vực saLogicApiUrl. Giá trị của nó được đặt bởi thuộc tính sa.logic.api.url.
  2. Chuỗi saLogicApiUrl nối với giá trị /analyse/sentiment. Chúng cùng nhau tạo thành một địa chỉ để thực hiện cuộc gọi đến microservice thực hiện phân tích văn bản.

▍Đặt giá trị thuộc tính

Trong Spring, nguồn giá trị thuộc tính mặc định là một tệp application.properties, có thể được tìm thấy tại sa-webapp/src/main/resources. Nhưng sử dụng nó không phải là cách duy nhất để đặt giá trị thuộc tính. Bạn cũng có thể làm điều này bằng lệnh sau:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL

Giá trị của thuộc tính này phải trỏ đến địa chỉ của ứng dụng Python của chúng ta.

Bằng cách định cấu hình nó, chúng tôi cho ứng dụng web Spring biết nơi nó cần đến để thực hiện các yêu cầu phân tích cú pháp văn bản.

Để không làm phức tạp cuộc sống của chúng tôi, chúng tôi sẽ quyết định rằng ứng dụng Python sẽ có sẵn tại localhost:5000 và cố gắng không quên nó. Kết quả là lệnh khởi động ứng dụng Spring sẽ như sau:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Hệ thống của chúng tôi đang thiếu một ứng dụng Python

Bây giờ chúng ta chỉ cần chạy ứng dụng Python và hệ thống sẽ hoạt động như mong đợi.

▍Thiết lập ứng dụng Python

Để chạy ứng dụng Python, bạn phải cài đặt Python 3 và Pip, đồng thời bạn phải đặt chính xác các biến môi trường phù hợp.

▍Cài đặt phụ thuộc

Chuyển đến thư mục dự án sa-logic/sa và chạy các lệnh sau:

python -m pip install -r requirements.txt
python -m textblob.download_corpora

▍Khởi chạy ứng dụng

Với các phụ thuộc được cài đặt, chúng tôi đã sẵn sàng chạy ứng dụng:

python sentiment_analysis.py

Sau khi thực hiện lệnh này, chúng ta sẽ được thông báo như sau:

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Điều này có nghĩa là ứng dụng đang chạy và chờ yêu cầu tại localhost:5000/

▍Nghiên cứu mã

Hãy xem mã ứng dụng Python để hiểu cách nó phản hồi các yêu cầu:

from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__)                                   #1
@app.route("/analyse/sentiment", methods=['POST'])      #2
def analyse_sentiment():
    sentence = request.get_json()['sentence']           #3
    polarity = TextBlob(sentence).sentences[0].polarity #4
    return jsonify(                                     #5
        sentence=sentence,
        polarity=polarity
    )
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)                #6

  1. Khởi tạo đối tượng Flask.
  2. Chỉ định địa chỉ để thực hiện các yêu cầu POST tới nó.
  3. Truy xuất tài sản sentence từ cơ thể yêu cầu.
  4. Khởi tạo đối tượng ẩn danh TextBlob và nhận giá trị polarity cho đề xuất đầu tiên nhận được trong phần nội dung của yêu cầu (trong trường hợp của chúng tôi, đây là đề xuất duy nhất được gửi để phân tích).
  5. Trả về một phản hồi, phần nội dung chứa văn bản của ưu đãi và chỉ báo được tính cho nó polarity.
  6. Khởi chạy ứng dụng Flask, sẽ có sẵn tại 0.0.0.0:5000 (bạn cũng có thể truy cập nó bằng cách sử dụng cấu trúc của biểu mẫu localhost:5000).

Giờ đây, các vi dịch vụ tạo nên ứng dụng đang chạy. Chúng được thiết lập để tương tác với nhau. Đây là sơ đồ ứng dụng trông như thế nào ở giai đoạn làm việc này.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Tất cả các dịch vụ siêu nhỏ tạo nên ứng dụng được đưa về trạng thái khỏe mạnh

Bây giờ, trước khi chúng ta tiếp tục, hãy mở ứng dụng React trong trình duyệt và cố gắng phân tích cú pháp một số câu với nó. Nếu mọi thứ được thực hiện chính xác - sau khi nhấn nút Send bạn sẽ thấy kết quả phân tích bên dưới hộp văn bản.

Trong phần tiếp theo, chúng ta sẽ nói về cách chạy vi dịch vụ của mình trong bộ chứa Docker. Điều này là cần thiết để chuẩn bị ứng dụng chạy trong cụm Kubernetes.

Bộ chứa docker

Kubernetes là một hệ thống để tự động hóa việc triển khai, mở rộng quy mô và quản lý các ứng dụng được đóng gói. Nó còn được gọi là "bộ điều phối container". Nếu Kubernetes hoạt động với các thùng chứa, thì trước khi sử dụng hệ thống này, trước tiên chúng ta cần lấy các thùng chứa này. Nhưng trước tiên, hãy nói về container là gì. Có lẽ câu trả lời tốt nhất cho câu hỏi nó là gì có thể được tìm thấy trong tài liệu đến Docker:

Hình ảnh vùng chứa là một gói nhẹ, độc lập, có thể thực thi được, chứa ứng dụng, bao gồm mọi thứ cần thiết để chạy ứng dụng đó: mã ứng dụng, môi trường thời gian chạy, công cụ hệ thống và thư viện, cài đặt. Các chương trình được đóng gói có thể được sử dụng trong cả môi trường Linux và Windows và sẽ luôn hoạt động như nhau bất kể cơ sở hạ tầng.

Điều này có nghĩa là các bộ chứa có thể chạy trên bất kỳ máy tính nào, bao gồm cả máy chủ sản xuất và trong bất kỳ môi trường nào, các ứng dụng chứa trong chúng sẽ hoạt động theo cùng một cách.

Để khám phá các tính năng của vùng chứa và so sánh chúng với các cách khác để chạy ứng dụng, hãy xem ví dụ về việc cung cấp ứng dụng React bằng máy ảo và vùng chứa.

▍Cung cấp các tệp tĩnh của ứng dụng React bằng máy ảo

Cố gắng tổ chức duy trì các tệp tĩnh bằng máy ảo, chúng ta sẽ gặp phải những nhược điểm sau:

  1. Sử dụng tài nguyên không hiệu quả, vì mỗi máy ảo là một hệ điều hành hoàn chỉnh.
  2. Nền tảng phụ thuộc. Những gì hoạt động trên một số máy tính cục bộ có thể không hoạt động trên máy chủ sản xuất.
  3. Mở rộng quy mô chậm và tốn nhiều tài nguyên của một giải pháp máy ảo.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Máy chủ web Nginx phục vụ các tệp tĩnh chạy trong máy ảo

Nếu các thùng chứa được sử dụng để giải quyết một vấn đề tương tự, thì so với các máy ảo, có thể lưu ý những điểm mạnh sau:

  1. Sử dụng tài nguyên hiệu quả: làm việc với hệ điều hành sử dụng Docker.
  2. Nền tảng độc lập. Vùng chứa mà nhà phát triển có thể chạy trên máy tính của chính họ sẽ chạy ở mọi nơi.
  3. Triển khai nhẹ thông qua việc sử dụng các lớp hình ảnh.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Máy chủ web Nginx phục vụ các tệp tĩnh chạy trong vùng chứa

Chúng tôi chỉ so sánh máy ảo và vùng chứa ở một vài điểm, nhưng ngay cả điều đó cũng đủ để cảm nhận về điểm mạnh của vùng chứa. Здесь Bạn có thể tìm thấy thông tin chi tiết về Docker container.

▍Tạo hình ảnh vùng chứa cho ứng dụng React

Khối xây dựng cơ bản của bộ chứa Docker là tệp Dockerfile. Ở phần đầu của tệp này, một hình ảnh cơ sở của vùng chứa được ghi lại, sau đó, một chuỗi hướng dẫn được bao gồm cho biết cách tạo vùng chứa đáp ứng nhu cầu của ứng dụng.

Trước khi chúng tôi bắt đầu làm việc với tệp Dockerfile, hãy nhớ những gì chúng ta đã làm để chuẩn bị các tệp của ứng dụng React để tải lên máy chủ Nginx:

  1. Xây dựng gói ứng dụng React (npm run build).
  2. Khởi động máy chủ Nginx.
  3. Sao chép nội dung của một thư mục build từ thư mục dự án sa-frontend vào thư mục máy chủ nginx/html.

Dưới đây, bạn có thể thấy sự tương đồng giữa việc tạo vùng chứa và các hành động trên được thực hiện trên máy tính cục bộ.

▍Chuẩn bị Dockerfile cho Ứng dụng SA-Frontend

Hướng dẫn đưa vào Dockerfile cho ứng dụng SA-Frontend, chỉ bao gồm hai lệnh. Thực tế là nhóm phát triển Nginx đã chuẩn bị một một hình ảnh cho Nginx mà chúng tôi sẽ sử dụng để xây dựng hình ảnh của mình. Đây là hai bước chúng ta cần mô tả:

  1. Bạn cần đặt hình ảnh Nginx làm cơ sở của hình ảnh.
  2. Nội dung thư mục sa-frontend/build cần sao chép vào thư mục hình ảnh nginx/html.

Nếu chúng ta đi từ mô tả này đến tệp Dockerfile, sau đó nó sẽ trông như thế này:

FROM nginx
COPY build /usr/share/nginx/html

Như bạn có thể thấy, mọi thứ ở đây rất đơn giản, trong khi nội dung của tệp thậm chí còn khá dễ đọc và dễ hiểu. Tập tin này yêu cầu hệ thống lấy hình ảnh nginx với mọi thứ mà nó đã có và sao chép nội dung của thư mục build đến thư mục nginx/html.

Ở đây bạn có thể có một câu hỏi liên quan đến việc làm thế nào tôi biết chính xác nơi để sao chép các tập tin từ thư mục build, tức là đường dẫn đến từ đâu /usr/share/nginx/html. Trên thực tế, không có gì phức tạp ở đây cả. Thực tế là các thông tin liên quan có thể được tìm thấy trong Sự miêu tả hình ảnh.

▍Kết hợp hình ảnh và tải nó lên kho lưu trữ

Trước khi chúng tôi có thể làm việc với một hình ảnh đã hoàn thành, chúng tôi cần gửi nó tới kho lưu trữ hình ảnh. Để làm điều này, chúng tôi sẽ sử dụng nền tảng lưu trữ hình ảnh dựa trên đám mây miễn phí Docker Hub. Ở giai đoạn này của công việc, bạn cần phải làm như sau:

  1. Tải về phu bến tàu.
  2. Đăng ký trên trang Docker Hub.
  3. Đăng nhập vào tài khoản của bạn bằng cách chạy lệnh sau trong thiết bị đầu cuối:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

Bây giờ bạn cần, sử dụng thiết bị đầu cuối, vào thư mục sa-frontend và chạy lệnh sau ở đó:

docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .

Ở đây và bên dưới trong các lệnh tương tự $DOCKER_USER_ID nên được thay thế bằng tên người dùng của bạn trên Docker Hub. Ví dụ: phần này của lệnh có thể trông như thế này: rinormaloku/sentiment-analysis-frontend.

Trong trường hợp này, lệnh này có thể được rút ngắn bằng cách xóa khỏi nó -f Dockerfile, vì thư mục mà chúng tôi thực hiện lệnh này đã có tệp này.

Để gửi hình ảnh đã hoàn thành vào kho lưu trữ, chúng ta cần lệnh sau:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Sau khi hoàn thành, hãy kiểm tra danh sách kho lưu trữ của bạn trên Docker Hub để xem hình ảnh đã được đẩy thành công lên bộ lưu trữ đám mây chưa.

▍Khởi động vùng chứa

Giờ đây, bất kỳ ai cũng có thể tải xuống và chạy hình ảnh được gọi là $DOCKER_USER_ID/sentiment-analysis-frontend. Để thực hiện việc này, bạn cần chạy chuỗi lệnh sau:

docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

Bây giờ vùng chứa đang chạy và chúng tôi có thể tiếp tục làm việc bằng cách tạo các hình ảnh khác mà chúng tôi cần. Nhưng trước khi tiếp tục, hãy hiểu thiết kế 80:80, được tìm thấy trong lệnh để chạy hình ảnh và có vẻ khó hiểu.

  • Số đầu tiên 80 là số cổng của máy chủ (nghĩa là máy tính cục bộ).
  • Số thứ hai 80 là cổng của vùng chứa mà yêu cầu sẽ được chuyển hướng đến.

Hãy xem xét hình minh họa sau đây.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Cổng chuyển tiếp

Hệ thống chuyển tiếp yêu cầu từ cổng <hostPort> đến cảng <containerPort>. Đó là, truy cập cổng 80 máy tính được chuyển hướng đến một cổng 80 thùng đựng hàng.

kể từ cảng 80 được mở trên máy tính cục bộ, bạn có thể truy cập ứng dụng từ máy tính này tại localhost:80. Nếu hệ thống của bạn không hỗ trợ Docker, bạn có thể chạy ứng dụng trên máy ảo Docker, địa chỉ của ứng dụng sẽ giống như <docker-machine ip>:80. Để biết địa chỉ IP của máy ảo Docker, bạn có thể sử dụng lệnh docker-machine ip.

Tại thời điểm này, sau khi vùng chứa ứng dụng giao diện người dùng đã khởi chạy thành công, bạn sẽ có thể mở trang của vùng chứa đó trong trình duyệt.

▍.dockerignore tập tin

Xây dựng hình ảnh ứng dụng SA-Frontend, chúng tôi có thể nhận thấy rằng quá trình này cực kỳ chậm. Điều này là do bối cảnh xây dựng hình ảnh phải được gửi đến daemon Docker. Thư mục đại diện cho bối cảnh xây dựng được đưa ra làm đối số cuối cùng cho lệnh docker build. Trong trường hợp của chúng tôi, có một dấu chấm ở cuối lệnh này. Điều này dẫn đến cấu trúc sau được bao gồm trong bối cảnh lắp ráp:

sa-frontend:
|   .dockerignore
|   Dockerfile
|   package.json
|   README.md
+---build
+---node_modules
+---public
---src

Nhưng trong tất cả các thư mục có ở đây, chúng ta chỉ cần một thư mục build. Tải xuống bất cứ thứ gì khác là một sự lãng phí thời gian. Bạn có thể tăng tốc quá trình xây dựng bằng cách cho Docker biết thư mục nào cần bỏ qua. Để làm điều này, chúng tôi cần một tập tin .dockerignore. Bạn, nếu bạn đã quen thuộc với tập tin .gitignore, cấu trúc của tệp này có thể sẽ trông quen thuộc. Nó liệt kê các thư mục mà hệ thống xây dựng hình ảnh có thể bỏ qua. Trong trường hợp của chúng tôi, nội dung của tệp này trông như thế này:

node_modules
src
public

hồ sơ .dockerignore phải nằm trong cùng thư mục với tệp Dockerfile. Bây giờ việc lắp ráp hình ảnh sẽ mất vài giây.

Bây giờ chúng ta hãy xử lý hình ảnh cho một ứng dụng Java.

▍Xây dựng hình ảnh vùng chứa cho ứng dụng Java

Bạn biết những gì và bạn đã học mọi thứ bạn cần để tạo hình ảnh vùng chứa. Đó là lý do tại sao phần này sẽ rất ngắn.

Mở tập tin Dockerfile, nằm trong thư mục dự án sa-webapp. Nếu bạn đọc văn bản của tệp này, thì trong đó bạn sẽ chỉ gặp hai cấu trúc mới bắt đầu bằng từ khóa ENV и EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000
…
EXPOSE 8080

Từ khóa ENV cho phép bạn khai báo các biến môi trường bên trong Docker container. Đặc biệt, trong trường hợp của chúng tôi, nó cho phép bạn đặt URL để truy cập API của ứng dụng thực hiện phân tích văn bản.

Từ khóa EXPOSE cho phép bạn yêu cầu Docker mở một cổng. Chúng tôi sẽ sử dụng cổng này trong khi làm việc với ứng dụng. Ở đây bạn có thể thấy điều đó trong Dockerfile cho ứng dụng SA-Frontend không có lệnh như vậy. Điều này chỉ dành cho mục đích tài liệu, nói cách khác, cấu trúc này dành cho người đọc Dockerfile.

Xây dựng hình ảnh và đẩy nó vào kho lưu trữ giống hệt như ví dụ trước. Nếu bạn chưa tự tin lắm vào khả năng của mình, bạn có thể tìm thấy các lệnh tương ứng trong tệp README.md trong thư mục sa-webapp.

▍Xây dựng hình ảnh vùng chứa cho ứng dụng Python

Nếu bạn xem nội dung của tập tin Dockerfile trong thư mục sa-logicbạn sẽ không tìm thấy bất cứ điều gì mới ở đó. Các lệnh để xây dựng hình ảnh và đẩy hình ảnh vào kho lưu trữ cũng sẽ quen thuộc với bạn, nhưng, giống như trường hợp của các ứng dụng khác của chúng tôi, chúng có thể được tìm thấy trong tệp README.md trong thư mục sa-logic.

▍Thử nghiệm các ứng dụng trong container

Bạn có thể tin tưởng một cái gì đó mà bạn đã không kiểm tra? Tôi cũng không thể. Hãy kiểm tra các thùng chứa của chúng tôi.

  1. Hãy bắt đầu vùng chứa ứng dụng sa-logic và định cấu hình nó để nghe trên một cổng 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. Hãy bắt đầu vùng chứa ứng dụng sa-webapp và định cấu hình nó để nghe trên một cổng 8080. Ngoài ra, chúng ta cần đặt cổng mà ứng dụng Python sẽ lắng nghe các yêu cầu từ ứng dụng Java bằng cách gán lại biến môi trường SA_LOGIC_API_URL:
    $ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

Để tìm hiểu cách tìm ra địa chỉ IP của bộ chứa hoặc Docker VM, hãy tham khảo tệp README.

Hãy bắt đầu vùng chứa ứng dụng sa-frontend:

docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

Bây giờ mọi thứ đã sẵn sàng để điều hướng trong trình duyệt đến địa chỉ localhost:80 và kiểm tra ứng dụng.

Xin lưu ý rằng nếu bạn thay đổi cổng cho sa-webapphoặc nếu bạn đang chạy Docker VM, bạn sẽ cần chỉnh sửa tệp App.js từ thư mục sa-frontendbằng cách thay đổi địa chỉ IP hoặc số cổng trong phương thức analyzeSentence()bằng cách thay thế thông tin hiện tại thay vì dữ liệu lỗi thời. Sau đó, bạn cần lắp ráp lại hình ảnh và sử dụng nó.

Đây là những gì sơ đồ ứng dụng của chúng tôi trông giống như bây giờ.

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container
Microservices chạy trong container

Tóm tắt: tại sao chúng ta cần một cụm Kubernetes?

Chúng tôi vừa xem xét các tập tin Dockerfile, đã nói về cách xây dựng hình ảnh và đẩy chúng vào kho lưu trữ Docker. Ngoài ra, chúng tôi đã học cách tăng tốc độ lắp ráp hình ảnh bằng tệp .dockerignore. Do đó, các dịch vụ siêu nhỏ của chúng tôi hiện đang chạy trong bộ chứa Docker. Tại đây, bạn có thể có một câu hỏi hoàn toàn chính đáng về lý do tại sao chúng ta cần Kubernetes. Câu trả lời cho câu hỏi này sẽ được dành cho phần thứ hai của tài liệu này. Trong khi chờ đợi, hãy xem xét câu hỏi sau:
Giả sử rằng ứng dụng web phân tích văn bản của chúng ta đã trở nên phổ biến trên toàn thế giới. Hàng triệu yêu cầu đến với anh ấy mỗi phút. Điều này có nghĩa là microservice sa-webapp и sa-logic sẽ bị căng thẳng rất nhiều. Làm cách nào để thay đổi quy mô vùng chứa chạy vi dịch vụ?

Hướng dẫn Kubernetes Phần 1: Ứng dụng, microservice và Container

Nguồn: www.habr.com

Thêm một lời nhận xét