Kubernetes

Ngày 7: Tổng quan về Kubernetes

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.

Nếu bạn muốn tìm hiểu kĩ càng hơn về Kubernetes hãy xem qua series Kubernetes dành cho người mới bắt đầu của tôi.

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

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.

Xem thêm: Tổng quan các thành phần của Kubernetes

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).

Xem thêm: Làm việc với Node trên K8S

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.

Xem thêm: Kubernetes Pods

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

Xem thêm: Kubernetes Deployment and 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.

Xem thêm: Kubernetes Service

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.

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í.

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 để 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.

Cách 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 để 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-drivervolumesnapshots 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

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 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

Liệt kê các tài nguyên

kubectl get nodesLiệt kê tất cả các nodes trong cluster
kubectl get namespacesLiệt kê tất cả các namespaces trong cluster
kubectl get podsLiệt kê tất cả các pods trong namespace mặc định của cluster
kubectl get pods -n nameLiệt kê tất cả các pods trong namespace “name”

Tạo các tài nguyên

kubectl create namespace nameTạ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

Đ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

Thông tin chi tiết hơn về tài nguyên

kubectl describe nodeshiển thị chi tết trạng thái của các nodes

Xoá tài nguyên

kubectl delete podXoá 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ọnTên đầy đủ
csrcertificatesigningrequests
cscomponentstatuses
cmconfigmaps
dsdaemonsets
deploydeployments
ependpoints
evevents
hpahorizontalpodautoscalers
ingingresses
limitslimitranges
nsnamespaces
nonodes
pvcpersistentvolumeclaims
pvpersistentvolumes
popods
pdbpoddisruptionbudgets
psppodsecuritypolicies
rsreplicasets
rcreplicationcontrollers
quotaresourcequotas
saserviceaccounts
svcservice

Đ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 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.

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 2 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 để 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 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.

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 node01vagrant 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 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.

1 2Next page

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button