Giới thiệu về Kubernetes

5 năm trước

 

Giới Thiệu

Kubernetes là một hệ thống mạnh mẽ, do Google phát triển, để quản lý các ứng dụng được chứa trong một môi trường nhóm. Nó nhằm mục đích cung cấp những cách tốt hơn để quản lý các thành phần liên quan, phân tán trên cơ sở hạ tầng đa dạng.

Trong hướng dẫn này, chúng ta sẽ thảo luận một số khái niệm cơ bản của Kubernetes. Chúng ta sẽ nói về kiến trúc của hệ thống, các vấn đề nó giải quyết, và mô hình mà nó sử dụng để xử lý các  phân phối và định tỷ lệ được container.

 

Yêu Cầu 

Bài viết này giả định một số kiến thức trước về công nghệ cluster hiện đại. Chúng ta sẽ thảo luận về cách nó liên quan đến các hệ thống như CoreOS.

Nếu bạn không quen thuộc với CoreOS, có thể hữu ích khi xem lại một số thông tin cơ bản về hệ thống CoreOS để hiểu các loại môi trường mà Kubernetes được triển khai trên đó.

Kubernetes là gì ?

Kubernetes, ở cấp độ cơ bản , là một hệ thống quản lý các ứng dụng được chứa qua một cluster của các node. Theo nhiều cách, Kubernetes được thiết kế để giải quyết sự ngắt kết nối giữa cách mà cơ sở hạ tầng hiện đại, nhóm được thiết kế và một số giả thuyết mà hầu hết các ứng dụng và dịch vụ có về môi trường của chúng.

Hầu hết các công nghệ phân cụm đều cố gắng cung cấp một nền tảng thống nhất để triển khai ứng dụng. Người dùng không cần phải quan tâm nhiều đến nơi công việc được lên kế hoạch. Đơn vị công việc được trình bày cho người dùng ở cấp độ "dịch vụ" và có thể được thực hiện bởi bất kỳ node thành viên nào.

Tuy nhiên, trong nhiều trường hợp, điều quan trọng là cơ sở hạ tầng cơ bản trông như thế nào. Khi Định tỉ lệ một ứng dụng, quản trị viên quan tâm rằng các trường hợp khác nhau của một dịch vụ không được gán cho cùng một máy chủ.

Mặt khác, nhiều ứng dụng phân phối được xây dựng với việc chia tỷ lệ trong trí nhớ thực sự được tạo thành từ các dịch vụ thành phần nhỏ hơn. Các dịch vụ này phải được lên lịch trên cùng một máy chủ như các thành phần liên quan nếu chúng được cấu hình theo một cách bình thường. Điều này trở nên quan trọng hơn khi chúng dựa vào các điều kiện mạng cụ thể để truyền đạt một cách thích hợp.

Mặc dù có thể với hầu hết các phần mềm phân cụm để thực hiện các loại quyết định lên lịch này, hoạt động ở cấp dịch vụ cá nhân không phải là lý tưởng. Các ứng dụng bao gồm các dịch vụ khác nhau vẫn nên được quản lý như một ứng dụng duy nhất trong hầu hết các trường hợp. Kubernetes cung cấp một lớp trên cơ sở hạ tầng để cho phép loại quản lý này.

 

Các thành phần chính

Các hệ thống cấp cơ sở hạ tầng như CoreOS cố gắng tạo ra một môi trường đồng nhất, nơi mỗi máy chủ dùng một lần và có thể hoán đổi cho nhau. Mặt khác,Kubernetes hoạt động với một mức chuyên môn nhất định.

Các dịch vụ điều khiển trong một cụm Kubernetes được gọi là master, hoặc control plane , các thành phần. Chúng hoạt động như các điểm liên lạc quản lý chính cho các quản trị viên, và cũng cung cấp nhiều hệ thống cluster-wide cho các node công nhân tương đối trì độn. Các dịch vụ này có thể được cài đặt trên một máy đơn lẻ hoặc được phân phối trên nhiều máy.

Các máy chủ chạy các thành phần này có một số dịch vụ độc nhất được sử dụng để quản lý khối lượng công việc của cụm và truyền thông trực tiếp trên toàn hệ thống. Dưới đây, chúng ta sẽ bao gồm các thành phần này.

Etcd

Một trong những thành phần cơ bản mà Kubernetes cần để hoạt động là một kho lưu trữ cấu hình có sẵn trên toàn cầu. Dự án etcd, được phát triển bởi nhóm CoreOS, là một kho lưu trữ giá trị khóa phân phối nhẹ có thể được phân bố trên nhiều nút.

Kubernetes sử dụng etcd để lưu trữ dữ liệu cấu hình có thể được sử dụng bởi từng nodes trong cụm. Điều này có thể được sử dụng để phát hiện dịch vụ và đại diện cho trạng thái của cụm mà mỗi thành phần tham chiếu đến cấu hình hoặc cấu hình lại chính chúng. Bằng cách cung cấp một API HTTP / JSON đơn giản, giao diện để thiết lập hoặc truy xuất các giá trị rất minh bạch.

Giống như hầu hết các thành phần khác trong control plane, etcd có thể được cấu hình trên một máy chủ chủ duy nhất hoặc trong các diễn tiến sản xuất, được phân phối trong một số máy. Yêu cầu duy nhất là nó có thể truy cập mạng vào mỗi máy Kubernetes.

API Server

Một trong những dịch vụ chính quan trọng nhất là một máy chủ API. Đây là điểm quản lý chính của toàn bộ cụm, vì nó cho phép người dùng định cấu hình nhiều khối lượng công việc và đơn vị tổ chức của Kubernetes. Nó cũng có trách nhiệm đảm bảo rằng kho lưu trữ etcd và các chi tiết dịch vụ của các deployed container được thỏa thuận. Nó hoạt động như cầu nối giữa các thành phần khác nhau để duy trì cluster heath và phổ biến thông tin và lệnh.

Máy chủ API thực hiện giao diện RESTful, có nghĩa là nhiều công cụ và thư viện khác nhau có thể dễ dàng giao tiếp với nó. Một khách hàng gọi kubecfg được đóng gói cùng với các server-side tools và có thể được sử dụng từ một máy tính cục bộ để tương tác với Kubernetes cluster.

Controller Manager Service

Controller manager service là một dịch vụ chung có nhiều trách nhiệm. Nó chịu trách nhiệm cho một số bộ điều khiển điều chỉnh trạng thái của cluster và thực hiện các tác vụ thông thường. Ví dụ, bộ điều khiển nhân bản đảm bảo rằng số lượng bản sao được xác định cho một dịch vụ phù hợp với số hiện đang được triển khai trên cluster. Các chi tiết của các hoạt động này được ghi vào etcd, nới mà trình quản lý bộ điều khiển giám sát các thay đổi thông qua máy chủ API.

Khi một thay đổi được nhìn thấy, bộ điều khiển đọc thông tin mới và thực hiện thủ tục đáp ứng trạng thái mong muốn. Điều này có thể liên quan đến việc mở rộng quy mô ứng dụng lên hoặc xuống, điều chỉnh điểm cuối, v.v.

Scheduler Service

Quá trình thực sự gán khối lượng công việc cho các node cụ thể trong clúter là lập lịch biểu. Điều này được sử dụng để đọc trong các yêu cầu hoạt động của dịch vụ, phân tích môi trường cơ sở hạ tầng hiện tại và đặt công việc trên một node hoặc node được chấp nhận.

Bộ lập lịch biểu có trách nhiệm theo dõi việc sử dụng tài nguyên trên mỗi máy chủ để đảm bảo rằng khối lượng công việc không được lên lịch vượt quá các tài nguyên có sẵn. Bộ lập lịch biểu phải biết tổng số tài nguyên có sẵn trên mỗi máy chủ, cũng như các tài nguyên được phân bổ cho khối lượng công việc hiện có được gán trên mỗi máy chủ.

 

Các thành phần máy chủ node

Trong Kubernetes, các máy chủ thực hiện công việc như nodes. Các máy chủ Node có một vài yêu cầu cần thiết để giao tiếp với các thành phần chính, cấu hình mạng cho các container và chạy các khối lượng công việc thực tế được gán cho chúng.

Docker chạy trên một Subnet chuyên dụng

Yêu cầu đầu tiên của mỗi máy chủ node riêng lẻ là docker. Dịch vụ docker được sử dụng để chạy các container ứng dụng đóng gói trong một môi trường hoạt động tương đối biệt lập nhưng nhẹ. Mỗi đơn vị công việc, ở cấp độ cơ bản của nó, được triển khai như mộtcontainer hàng loạt phải được triển khai.

Một giả định chính mà Kubernetes tạo ra là một subnet chuyên dụng có sẵn cho mỗi máy chủ node. Đây không phải là trường hợp với nhiều triển khai phân nhóm tiêu chuẩn. Ví dụ, với CoreOS, một loại tổ chức mạng riêng biệt gọi là flannel là cần thiết cho mục đích này. Docker phải được cấu hình để sử dụng điều này để nó có thể tìm thấy các cổng theo đúng cách.

 Kubelet Service

Điểm tiếp xúc chính cho mỗi node với cluster là thông qua một dịch vụ nhỏ gọi là kubelet. Dịch vụ này chịu trách nhiệm chuyển tiếp thông tin đến và đi từ các dịch vụ control plane, cũng như tương tác với kho lưu trữ etcd để đọc chi tiết cấu hình hoặc viết các giá trị mới.

Dịch vụ kubelet giao tiếp với các thành phần chính nhận lệnh và công việc. Công việc được nhận dưới dạng "tệp kê khai" xác định khối lượng công việc và các thông số vận hành. Quá trình kubelet sau đó giả định trách nhiệm cho việc duy trì trạng thái của công việc trên máy chủ node.

Proxy Service

Để đối phó với  máy chủ mạng con cá nhân và để làm cho các dịch vụ có sẵn cho các bên bên ngoài, một dịch vụ proxy nhỏ được chạy trên mỗi máy chủ node. Quá trình này chuyển tiếp các yêu cầu tới các container chính xác, làm cân bằng lượng tải gốc và chịu trách nhiệm đảm bảo môi trường mạng có thể dự đoán và truy cập được, nhưng bị cô lập.

 

Kubernetes Work Units

Trong khi các container được sử dụng để triển khai các ứng dụng, thì khối lượng công việc xác định từng loại công việc cụ thể cho Kubernetes. Chúng ta sẽ xem xét các loại "công việc" khác nhau có thể được chỉ định bên dưới.

Pods

 pod là đơn vị cơ bản mà Kubernetes giao dịch. Bản thân các container không được gán cho máy chủ. Thay vào đó, các container có liên quan chặt chẽ được nhóm lại với nhau trong một nhóm. Một nhóm thường đại diện cho một hoặc nhiều container cần được kiểm soát dưới dạng một "ứng dụng" đơn lẻ.

Sự liên hợp này dẫn tất cả các container có liên quan được lên lịch trên cùng một máy chủ. Chúng được quản lý như một đơn vị và  chia sẻ một môi trường. Điều này có nghĩa rằng chúng có thể chia sẻ khối lượng và không gian IP, và có thể được triển khai và thu nhỏ như một ứng dụng đơn lẻ. Bạn hãy nghĩ về các pod như một máy tính ảo duy nhất để khái niệm hóa tốt nhất cách thức các tài nguyên và lập lịch biểu nên hoạt động.

Các thiết kế chung của pods thường bao gồm các container chính đáp ứng mục đích chung của  pod, và tùy chọn một số helper containers  tạo thuận lợi cho các nhiệm vụ liên quan. Đây là những chương trình được hưởng lợi từ việc chạy và quản lý trong containerriêng của chúng, nhưng được gắn chặt với ứng dụng chính.

Chia tỷ lệ ngang thường không được khuyến khích ở cấp độ nhóm vì có các đơn vị khác phù hợp hơn cho tác vụ.

Services

Chúng ta đã sử dụng thuật ngữ "service" trong suốt hướng dẫn này theo cách rất mập mờ, nhưng Kubernetes thực sự có một định nghĩa rất cụ thể cho từ khi mô tả các đơn vị làm việc. Một service, khi được mô tả theo cách này, là một đơn vị hoạt động như một người cân bằng lượng tải cơ bản và đại diện cho các container khác. Một nhóm dịch vụ sưu tập pods cùng nhau thực hiện cùng một chức năng để thể hiện chúng như là một thực thể duy nhất.

Điều này cho phép bạn triển khai một đơn vị service nhận thức được tất cả các container phụ trợ để chuyển lưu lượng truy cập đến. Các ứng dụng bên ngoài chỉ cần lo nghĩ về  điểm truy cập duy nhất, nhưng được hưởng lợi từ một chương trình phụ trợ có thể mở rộng hoặc ít nhất một chương trình phụ trợ có thể được hoán đổi khi cần thiết. Địa chỉ IP của service vẫn ổn định, lấy ra mọi thay đổi đối với địa chỉ IP của nhóm có thể xảy ra khi các node chết hoặc pod được lên lịch lại.

Services là một giao diện cho một nhóm các container để người tiêu dùng không phải lo lắng về bất cứ điều gì ngoài một vị trí truy cập duy nhất. Bằng cách triển khai một dịch vụ, bạn dễ dàng có được khả năng khám phá và có thể đơn giản hóa các thiết kế container của bạn.

Replication Controllers

Một phiên bản phức tạp hơn của một pod là replicated pod. Chúng được xử lý bởi một loại đơn vị làm việc được gọi là replication controller.

Replication controller là một cơ cấu để xác định các pod được định nghĩa để chia tỉ lệ theo chiều ngang. Đơn vị làm việc, về bản chất, là một đơn vị lồng nhau. Một mẫu được cung cấp, về cơ bản là việc các định pod hoàn chỉnh. Điều này được bao bọc với các chi tiết bổ sung về công việc sao chép cần được thực hiện.

Replication controller được phân bổ trách nhiệm trong việc duy trì số bản sao mong muốn. Điều này có nghĩa rằng nếu một containertạm thời bị hỏng, bộ điều khiển nhân bản có thể khởi động một container khác. Nếu container đầu tiên trở lại trực tuyến, bộ điều khiển sẽ tiêu diệt một trong các container..

 

Labels

Một khái niệm tổ chức Kubernetes bên ngoài các đơn vị dựa trên công việc là ghi nhãn. Label về cơ bản là một thẻ tùy ý có thể được đặt trên các đơn vị công việc ở trên để đánh dấu chúng là một phần của một nhóm. Sau đó, chúng có thể được chọn cho mục đích quản lý và nhắm mục tiêu hành động.

Label là nền tảng cho cách hoạt động của cả hai service và replication controllers. Để có danh sách các máy chủ phụ trợ mà dịch vụ phải chuyển lưu lượng truy cập đến, nó thường chọn containerdựa trên label.

Tương tự, replication controllers cho tất cả các container được sinh ra từ các khuôn mẫu của chúng cùng label. Điều này giúp cho bộ điều khiển dễ dàng theo dõi từng trường hợp. Bộ điều khiển hoặc quản trị viên có thể quản lý tất cả các cá thể dưới dạng nhóm, bất kể có bao nhiêu container đã được sinh ra.

Label được cho là cặp khóa-giá trị. Mỗi đơn vị có thể có nhiều hơn một label, nhưng mỗi đơn vị chỉ có thể có một mục nhập cho mỗi khóa. Bạn có thể gắn với việc đưa pods một "name" khóa như một việc định danh mục đích chung, hoặc bạn có thể phân loại chúng theo các tiêu chí khác nhau như giai đoạn phát triển, khả năng truy cập công cộng, phiên bản ứng dụng, v.v.

Trong nhiều trường hợp, bạn sẽ muốn gán nhiều label để kiểm soát chi tiết. Sau đó bạn có thể chọn dựa trên một yêu cầu label đơn hoặc kết hợp.

 

Kết Luận 

Kubernetes là một dự án thú vị, thực hiện nhiều cải tiến chức năng trên cơ sở hạ tầng nhóm. Trong khi các công nghệ khác làm một công việc tuyệt vời trong việc xử lý các khía cạnh phân cụm, Kubernetes nhằm mục đích cung cấp một hệ thống quản lý tốt hơn.