Docker và Kubernetes có cung cấp Kiến trúc tốt nhất không?

Xin chào, tôi trở lại với một bài viết khác. Nhưng lần này, tôi đang trong tâm trạng giải quyết một số huyền thoại.

Thế giới đang thay đổi từng giây và công nghệ cũng vậy. Về Docker và Kubernetes, bạn phải lắng nghe rất nhiều điều. Đặc biệt, sự so sánh giữa kiến ​​trúc của họ. Rất nhiều người tự hỏi rằng cái nào tốt hơn?

Có rất nhiều câu hỏi khác và tôi đang đề cập đến tất cả chúng. Tại sao? Lý do duy nhất là nó sẽ giúp bạn hiểu Kubernetes và Docker. Vậy Docker và Kubernetes đã thay đổi sự phát triển phần mềm như thế nào? Có ai trong số họ cung cấp một kiến ​​trúc mạnh mẽ? Có thể thống nhất các quá trình phát triển và tích hợp? Nếu có, những hạn chế là gì? Điều này sẽ làm giảm các biến chứng cho các nhà phát triển?

Trước hết, hãy hiểu rằng so sánh giữa Docker và Kubernetes không dễ như bạn nghĩ. Cái gì tốt hơn Docker hay Kubernetes? Tôi tin rằng không có loại nào tốt hơn vì cả hai đều khác nhau. Docker là xe buýt trong khi Kubernetes là cổng xe buýt. Vậy điều gì là quan trọng? Chắc chắn, cả hai đều quan trọng. Bạn cần cả hai.

Vì vậy, trong bài viết này, chúng ta sẽ đi từ cuộc sống thực đến các quá trình phát triển đến kiến ​​trúc và trở lại cuộc sống thực.

Hơn nữa, chúng tôi sẽ xác định các thành phần và nguyên tắc khác nhau là một phần của kiến ​​trúc. Cuối cùng, kết luận có thể làm bạn ngạc nhiên hoặc làm hài lòng bạn. Nó phụ thuộc vào nhận thức và kinh nghiệm của bạn với Docker và Kubernetes.

Bước đầu tiên từ cuộc sống thực đến quy trình phát triển

Bạn có biết tại sao các quá trình phát triển là quan trọng? Nếu không có quá trình phát triển, không có cách tiếp cận tổng quát có định hướng tốt. Một quá trình phát triển làm giảm thời gian từ khi sinh ra một ý tưởng để phân phối nó. Nó đơn giản hóa quá trình và duy trì chất lượng.

Có hai loại ý tưởng, một loại tốt và loại kia là xấu. Không có loại thứ ba của một ý tưởng trung gian trong phát triển. Ý tưởng có thể tốt hoặc xấu nhưng nó chỉ có thể được đo lường bằng cách thực hiện. Nếu đó là một ý tưởng tồi, bạn thực hiện và rollback! Nếu đó là một ý tưởng tốt, bạn chỉ cần thực hiện. Việc khôi phục được điều khiển bởi robot tự động, tức là tự động hóa.

Trong số này, hệ thống tích hợp và phân phối liên tục đã nổi lên như một cứu cánh. Nó đã làm cho mọi thứ dễ dàng hơn. Nếu bạn có một ý tưởng và mã, hãy thực hiện nó! Nhưng có một vấn đề nhỏ với hệ thống tích hợp và phân phối. Quá trình này rất khó để chính thức hóa tách biệt khỏi quy trình công nghệ và kinh doanh, dành riêng cho công ty của bạn.

Vậy vấn đề này đã được giải quyết như thế nào?

Bây giờ vấn đề này đã được giải quyết với sự giúp đỡ của Docker và Kubernetes. Cả hai đều xuất hiện dưới dạng Messiahs. Mức độ trừu tượng và cách tiếp cận ý thức hệ đã giải quyết gần 80% vấn đề. Xin lưu ý, 80% là một tỷ lệ rất tốt trong lĩnh vực phát triển. 20% vẫn còn đó và người ta cần trở thành một thiên tài sáng tạo để giải quyết nó. Nó phụ thuộc vào loại ứng dụng và cách bạn giải quyết nó.

Docker giải quyết vấn đề của quy trình phát triển. Docker cung cấp một quy trình đơn giản và đủ cho hầu hết các môi trường làm việc.

Nguồn hình ảnh: https://cdn-images-1.medium.com/max/800/0*nDrc_jeOKTMS7akB.

Với sự giúp đỡ của phương pháp này, người ta có thể tự động hóa và thống nhất mọi thứ.

Giới thiệu về môi trường phát triển

Trước hết, dự án phải bao gồm một tệp docker-compose.yml. Ưu điểm của tệp này là nó sẽ loại bỏ gánh nặng chạy ứng dụng / dịch vụ trên máy cục bộ. Nhà phát triển không cần phải suy nghĩ về nó. Trong thực tế, chỉ cần một lệnh soạn thảo docker đơn giản là đủ để khởi động ứng dụng của bạn. Lệnh này cũng xử lý các phụ thuộc, điền vào cơ sở dữ liệu các đồ đạc, tải lên mã cục bộ bên trong container, cho phép theo dõi mã và phản hồi tại cổng dự kiến.

Ngoài tất cả những điều này, bạn cũng không cần phải lo lắng về việc bắt đầu, cam kết thay đổi, lựa chọn khung, v.v ... Mỗi và mọi thứ đều được mô tả trong các hướng dẫn tiêu chuẩn trước đó. Nó được quyết định bởi các mẫu dịch vụ theo các thiết lập như frontend, backend và worker.

Thời gian để kiểm tra tự động

Bạn đã nghe nói về hộp đen hộp hay chưa? Nó ghi lại mọi thứ, thậm chí là những giây cuối cùng trước khi máy bay rơi. Chuyện gì đã xảy ra? Chuyện đã xảy ra như thế nào? Tất cả điều này được lấy từ hộp đen. Tương tự, có một hộp đen ở đây.

Nguồn hình ảnh: https://cdn-images-1.medium.com/max/800/0*B5Qn9D5W4lscB86h.

Giống như hộp đen ban đầu, hộp đen container của chúng tôi lưu trữ mọi thứ. Tất cả dữ liệu nhị phân, 1 hoặc 0, vv được lưu trữ trong hộp đen. Vậy tự động hóa xảy ra như thế nào? Thật dễ dàng, bạn có một bộ lệnh và docker-compose.yml mô tả tất cả các phụ thuộc của nó. Điều này dẫn đến tự động hóa và thử nghiệm thống nhất. Không cần phải tập trung vào các chi tiết thực hiện.

Hệ thống giao hàng

Nguồn hình ảnh: https://cdn-images-1.medium.com/max/800/0*DC5Ubn7Y5seJPeSO.

Vị trí và thời gian để cài đặt dự án don don của bạn. Không có sự khác biệt nào về phần nào của toàn bộ hệ sinh thái mà bạn sẽ cài đặt. Kết quả của quá trình cài đặt sẽ luôn giống nhau. Điều quan trọng nhất là sự bình tĩnh của người Hồi giáo. Từ phía bạn, chỉ định các biến kiểm soát cài đặt.

Có một thuật toán cho tất cả điều này. Hãy để chúng tôi liệt kê nó xuống từng bước.

(1) Thu thập hình ảnh từ Dockerfiles.

(2) Sử dụng một siêu dự án để cung cấp hình ảnh. Chúng nên được phân phối Kubernetes thông qua API Kube. Các tham số đầu vào cần có là:

(a) Điểm cuối API Kube

(b) Một đối tượng bí mật khác nhau cho các bối cảnh khác nhau (địa phương / phòng trưng bày / dàn dựng / sản xuất)

Tên hệ thống và các thẻ của hình ảnh Docker cho các hệ thống này.

Ví dụ, hãy xem xét một siêu dự án bao gồm tất cả các hệ thống và dịch vụ. Điều này có nghĩa là dự án mô tả sự sắp xếp của hệ sinh thái và nó cũng mô tả cách các bản cập nhật được gửi đến nó. Đối với điều này, tôi sẽ sử dụng các Playbook Ansible để tích hợp với API Kube. Nhưng, có những lựa chọn khác là tốt! Nhìn chung, bạn cần suy nghĩ theo hướng tập trung để quản lý kiến ​​trúc. Một khi bạn tự tin với nó, bạn có thể thuận tiện quản lý các dịch vụ / hệ thống.

Việc cài đặt môi trường là bắt buộc trong phòng trưng bày (để kiểm tra thủ công và gỡ lỗi hệ thống), dàn dựng (cho môi trường gần và tích hợp) và sản xuất (môi trường thực tế cho người dùng cuối).

Giao hàng & tích hợp liên tục

Bạn là một người hạnh phúc nếu bạn đang theo một cách thống nhất để kiểm tra các hình ảnh Docker. Nó sẽ giúp bạn tích hợp liền mạch nhánh tính năng trong nhánh ngược dòng hoặc nhánh chính của kho git. Điều duy nhất cần được quan tâm là duy trì chuỗi tích hợp và phân phối. Nếu không có bản phát hành, làm thế nào bạn có thể ngăn chặn tình trạng chủng tộc trên một hệ thống với một số tính năng song song?

vậy giải pháp là gì? Quá trình nên bắt đầu khi không có cạnh tranh.

Các bước:

(1) Cập nhật nhánh tính năng lên thượng nguồn.

(2) Xây dựng hình ảnh.

(3) Kiểm tra các hình ảnh được xây dựng.

(4) Bắt đầu và đợi cho đến khi bước 2 hoàn thành và hình ảnh được gửi.

(5) Nếu bước 4 không thành công, hãy đưa hệ sinh thái trở lại bước trước.

(6) Kết hợp nhánh tính năng ở thượng nguồn. Gửi nó đến kho lưu trữ.

Nếu bất kỳ bước nào ở trên không thành công, quy trình giao hàng sẽ chấm dứt ngay lập tức. Nhiệm vụ được trả lại cho nhà phát triển cho đến khi nó được giải quyết. Quá trình tương tự có thể làm việc với nhiều hơn một kho lưu trữ. Mỗi bước nên được thực hiện theo cách tương tự, nhưng đối với mỗi kho lưu trữ. Ví dụ: bước 1 cho kho A và bước cho kho B, v.v.

Kubernetes cho phép bạn tự do tung ra các bản cập nhật theo từng phần. Nhiều xét nghiệm AB có thể triển khai và trải qua phân tích rủi ro. Kubernetes nội bộ tách các dịch vụ và ứng dụng.

Các hệ thống rollback

Trong số một số khả năng quan trọng nhất của khung kiến ​​trúc mạnh mẽ, một là khả năng phục hồi. Có một số sắc thái rõ ràng và tiềm ẩn. Chúng ta hãy xem chúng:

(1) Dịch vụ sẽ có thể thiết lập môi trường của nó và cả rollback.

(2) Nếu rollback là không thể, dịch vụ sẽ là đa hình. Nó nên hỗ trợ cả phiên bản cũ và phiên bản mới của mã.

(3) Cần có khả năng tương thích ngược cho bất kỳ dịch vụ nào sau khi khôi phục.

Trong cụm Kubernetes, rất dễ để quay lại trạng thái. Nhưng nó sẽ chỉ hoạt động nếu dự án meta của bạn chứa thông tin của ảnh chụp nhanh này. Các thuật toán rollback phân phối phức tạp không được khuyến khích nhưng là cần thiết.

Vậy trong trường hợp nào cơ chế rollback nên được kích hoạt?

(1) Khi tỷ lệ lỗi ứng dụng cao sau khi phát hành.

(2) Khi bạn bắt đầu nhận tín hiệu từ các điểm giám sát chính.

(3) Khi thử nghiệm khói thất bại.

(4) Nó có thể được thực hiện bằng tay.

Các biện pháp an ninh

Làm cho hệ sinh thái chống đạn isn dễ dàng. Nó có thể được thực hiện bằng cách chỉ theo một quy trình công việc duy nhất. Khung kiến ​​trúc phải đủ an toàn để giải quyết mọi vấn đề. Kubernetes đi kèm với một số cơ chế tích hợp tốt để kiểm soát truy cập, chính sách mạng, kiểm toán các sự kiện, v.v. Có một số công cụ để bảo mật thông tin và chúng đã được chứng minh là tuyệt vời về mặt bảo vệ.

Bước tiếp theo, từ quy trình phát triển đến kiến ​​trúc

Một khung kiến ​​trúc cung cấp tính linh hoạt, khả năng mở rộng, tính sẵn sàng, độ tin cậy, bảo vệ chống lại các mối đe dọa, vv là gần như bắt buộc. Đây là một điều rất quan trọng. Trong thực tế, nhu cầu này đã dẫn đến một khái niệm mới. Đoán nào? Vâng, DevOps. Nó dẫn đến khái niệm cơ sở hạ tầng hoàn toàn tự động hóa và tối ưu hóa.

Bây giờ, đã đến lúc thay đổi kiến ​​trúc từ Monolithic sang microservice. Nó cung cấp những lợi ích to lớn của một kiến ​​trúc hướng dịch vụ. Ít nhất là đối với Docker và Kubernetes, việc sử dụng một kiến ​​trúc nguyên khối là sai lầm về mặt ý thức hệ. Tôi chắc chắn sẽ thảo luận về một số điểm của kiến ​​trúc microservice. Để có kiến ​​thức chuyên sâu về DevOps, vui lòng đọc bài viết này về DevOps.

Bây giờ, chúng tôi sẽ nhanh chóng thảo luận về các thành phần quan trọng chính và các giải pháp của một kiến ​​trúc tốt.

Các thành phần quan trọng

Số 1- Dịch vụ nhận dạng:

Microservice nhận dạng đề cập đến danh tính của người dùng như là một dịch vụ microservice. Các dịch vụ rất nhẹ. Nó cung cấp tính mô-đun và cho phép linh hoạt cho ứng dụng. Microservice nhận dạng là mạnh mẽ và có quyền truy cập vào tất cả các dữ liệu hồ sơ. Nó có khả năng cung cấp mọi thứ cần thiết ở cốt lõi của tất cả các ứng dụng.

Nếu bạn muốn trở thành khách hàng của các nền tảng doanh nghiệp lớn như IBM, Google, Microsoft, v.v., quyền truy cập sẽ được xử lý bởi các dịch vụ của nhà cung cấp. Nhưng nếu bạn muốn giải pháp của riêng bạn thì sao? Danh sách trong phần sắp tới sẽ giúp bạn quyết định nó.

Số 2- Cung cấp dịch vụ tự động:

Các dịch vụ được xây dựng là độc lập với nhau. Điều này dẫn đến sự phát triển dễ dàng và ít lỗi hơn. Nó cũng giúp tìm kiếm các dịch vụ khác theo mô hình động và tự động.

Kubernetes làm giảm sự cần thiết cho các thành phần bổ sung. Tuy nhiên, người ta cần tự động hóa việc bổ sung các máy móc mới. Dưới đây là danh sách các công cụ:

(1) KOPS - Giúp bạn cài đặt một cụm trên AWS hoặc GCE.

(2) Teraform - Giúp bạn quản lý cơ sở hạ tầng cho mọi môi trường.

(3) Ansible - Cung cấp tự động hóa dưới mọi hình thức.

Cá nhân tôi khuyên dùng Ansible vì nó giúp bạn làm việc với cả máy chủ cũng như các đối tượng Kubernetes.

Số 3- Kho lưu trữ Git và theo dõi tác vụ:

Với kho Git, các tác vụ có thể được xử lý dễ dàng. Ý tưởng cơ bản là có một kho lưu trữ nhỏ. Nó phục vụ như là một theo dõi môi trường. Nội dung bao gồm loại phiên bản sẽ được sử dụng cho các dịch vụ khác nhau. Hệ thống kiểm soát nguồn ưa thích cho việc này là trực tuyến.

Cần có một nơi làm việc thích hợp để làm việc nhóm và lưu trữ mã cho tất cả các cuộc thảo luận quan trọng. Nếu bạn muốn có một dịch vụ miễn phí, hãy đến Redmine. Khác, Jira là một dịch vụ trả tiền và khá hữu ích. Đối với kho lưu trữ mã, Gerrit là một lựa chọn tuyệt vời, miễn phí!

Số 4- Sổ đăng ký Docker:

Đăng ký docker là một loại hệ thống lưu trữ và phân phối nội dung. Nó giữ tên của hình ảnh Docker và có sẵn trong các phiên bản được gắn thẻ khác nhau. Để tương tác với một sổ đăng ký, người dùng nên bắn các lệnh đẩy và kéo.

Hệ thống quản lý hình ảnh docker là khá quan trọng. Hệ thống cũng nên hỗ trợ truy cập cho người dùng và một nhóm người dùng. Đối với điều này, chọn một giải pháp đám mây hoặc một số dịch vụ lưu trữ riêng. Một lựa chọn tốt là Vmware Harbor.

Số 5- CI / CD và cung cấp dịch vụ:

Chỉ có dịch vụ tích hợp và phân phối liên tục kết nối các thành phần được thảo luận trước đó. Giao hàng liên tục đề cập đến dịch vụ đơn giản và không có logic. Dịch vụ CI / CD chỉ nên phản ứng với các sự kiện thế giới bên ngoài như thay đổi trong kho git, v.v.

Dịch vụ tích hợp chịu trách nhiệm kiểm tra dịch vụ tự động, cung cấp dịch vụ, khôi phục, xóa dịch vụ và xây dựng hình ảnh.

Số 6- Thu thập và phân tích nhật ký:

Trong bất kỳ ứng dụng microservice nào, việc theo dõi vấn đề rất quan trọng. Theo dõi là có thể với sự giúp đỡ của đăng nhập. Vì vậy, đăng nhập và giám sát cung cấp cho bạn một cái nhìn toàn diện về hệ thống.

Nhật ký được truy cập bằng cách ghi chúng vào STDOUT hoặc STDERR của tiến trình root. Các dữ liệu nhật ký nên có sẵn khi cần thiết. Nó cũng nên chứa các hồ sơ từ quá khứ.

Số 7- Truy tìm, theo dõi và cảnh báo:

Các công cụ như Opentracing và Zipkin giúp bạn hiểu sai lầm. Giống như bạn đã đi sai ở đâu? Những công cụ này sẽ giúp bạn trả lời những câu hỏi như vậy. Thất bại xảy ra và truy tìm chúng là quan trọng.

Hơn nữa, giám sát được chia thành ba cấp độ. Đây là cấp độ vật lý, cấp độ cụm và cấp độ dịch vụ. Không có phạm vi cho các lỗi trong giám sát. Các công cụ như Prometheus và OpsGenie đã được chứng minh là khá hữu ích để theo dõi. OpsGenie cũng cảnh báo và thông báo về các vấn đề ở tất cả các cấp. Vì vậy, theo dõi, giám sát và cảnh báo không bao giờ nên được xem nhẹ. Họ là phần phòng thủ của ứng dụng.

Số 8- Cổng API với Đăng nhập một lần:

Trong microservice, tất cả các cuộc gọi chỉ nên đi qua Cổng API. Nó giúp duy trì an ninh. Nó cũng chịu trách nhiệm định tuyến các yêu cầu API. Vì vậy, API Gateway là một điểm vào cho tất cả các dịch vụ siêu nhỏ tương ứng. Đăng nhập một lần đề cập đến một phiên. Nó là một số loại dịch vụ xác thực người dùng. Theo tên, thông tin đăng nhập được đặt một lần hoặc một lần duy nhất. Sau đó, nó có thể được sử dụng để truy cập nhiều ứng dụng.

Người ta cần một dịch vụ đáng tin cậy để xử lý các tác vụ như ủy quyền, xác thực, đăng ký người dùng, đăng nhập một lần, v.v. Dịch vụ tích hợp với API Gateway và mọi thứ được xử lý thông qua nó.

Số 9- Xe buýt sự kiện:

Nếu hệ sinh thái có hàng trăm dịch vụ, chúng cần được xử lý cẩn thận. Truyền thông nội bộ là bắt buộc và không có phạm vi cho lỗi. Luồng dữ liệu nên được sắp xếp hợp lý. Một xe buýt sự kiện đề cập đến một luồng sự kiện được định hướng tốt từ một dịch vụ siêu nhỏ đến các dịch vụ khác.

Số 10- Cơ sở dữ liệu và dịch vụ nhà nước:

Trong một ứng dụng dựa trên microservice, thông thường, có rất nhiều dịch vụ. Các yêu cầu lưu trữ dữ liệu cho tất cả là khác nhau, theo vai trò dịch vụ. Vì vậy, một số dịch vụ tốt với cơ sở dữ liệu quan hệ và những dịch vụ khác có thể cần cơ sở dữ liệu NoQuery như MongoDB.

Docker đã thay đổi các quy tắc của trò chơi. Cơ sở dữ liệu chiếm không gian trung tâm quan trọng trong thế giới lưu trữ. Vì vậy, bất kể giải pháp là gì, nó sẽ có thể hoạt động trong môi trường Kubernetes một cách dễ dàng.

Trở lại với thực tế, từ kiến ​​trúc đến đời thực

Tôi sẽ khá trung thực với bạn trong việc chia sẻ quan điểm của tôi. Tôi tin rằng trong tương lai, toàn bộ kiến ​​trúc sẽ được coi là thất bại. Các nguyên tắc thiết kế, các nguyên tắc cơ bản, vv tất cả mọi thứ đang thay đổi! Nhưng bạn cần phải ở trên đỉnh của trò chơi. Đối với điều này, hòa nhập vào cộng đồng chuyên nghiệp. Sớm hay muộn, bạn sẽ phải thích nghi với những thay đổi này. Vậy thì tại sao không bắt đầu ngay bây giờ?

Có rất nhiều cơ hội nhưng chỉ khi bạn cập nhật cho mình những cập nhật công nghệ mới.

Bây giờ trở lại với tiêu đề của bài viết này. Docker và Kubernetes có kiến ​​trúc tốt nhất? Còn bây giờ, chắc chắn là Có Có. Nhưng đây có thể chỉ là kiến ​​trúc tốt nhất trong thời điểm hiện tại. Phấn đấu nhiều hơn, phấn đấu xây dựng một kiến ​​trúc tốt hơn, tốt hơn tốt nhất!

Tôi đang chia sẻ một vài liên kết hữu ích với tất cả các bạn.

Bài viết về Docker: Hướng dẫn về Docker: Container, VM và Docker cho người mới bắt đầu

Docker Video Hướng dẫn: Series Hướng dẫn Video Docker

Bài viết Kubernetes: Kinh thánh Kubernetes cho người mới bắt đầu & nhà phát triển

Hướng dẫn bằng video Kubernetes: Loạt bài hướng dẫn về video của Kubernetes