Kubernetes Pod là gì? Tìm hiểu chi tiết về Kubernetes Pod
Trong bài viết này, hãy cùng Bizfly Cloud tìm hiểu về một khái niệm quan trọng trong Kubernetes - Kubernetes Pod là gì?. Đây là một khái niệm cơ bản và quan trọng trong việc triển khai ứng dụng trên nền tảng Kubernetes.
Kubernetes Pod là gì?
Kubernetes Pod là một đơn vị cơ bản trong hệ thống Kubernetes (K8s). Nó là một nhóm các container được triển khai cùng nhau trên cùng một máy chủ vật lý hoặc máy ảo để chia sẻ tài nguyên và môi trường chung. Một Pod có thể chứa một hoặc nhiều container, nhưng chúng chia sẻ cùng một không gian địa chỉ IP và tài nguyên mạng.
Các thành phần của Pod
Pod được tạo bằng cách sử dụng lệnh kubectl gọi tới API của Kubernetes hoặc được lưu lại dưới dạng file yaml và được cài đặt vào Kubernetes.
Dưới đây là mẫu ví dụ khai báo Pod dưới dạng yaml:
Thành phần chính của Pod ở root level bao gồm:
- Kind: Nơi phân loại tài nguyên
- Metadata: Nơi chứa thông tin metadata của Pod (tên, nhãn,...)
- Spec: Nơi chứa thông tin khai báo của Pod và container của Pod
Một số tham số trong spec của Pod:
- HostAliases: Phần khai báo cho Pod
- InitContainers: Phần khai báo thông tin của initContainer
- Container: Thông tin chi tiết về Container trong Pod
- Volumes: Phần khai báo volume của Pod
- RestartPolicy: Có 3 giá trị là Always, OnFailure, và Never
- Affinity: Phần khai báo các thuộc tính liên quan tới schedule Pod
Đặc điểm của Kubernetes Pod
Kubernetes Pod có 3 đặc điểm chính:
- Chứa một hoặc nhiều container: Một Pod có thể chứa một hoặc nhiều hơn một container đã được lên lịch và triển khai cùng trên một node.
- Dùng chung tài nguyên, không giản: Các container trong Pod hoạt động trên cùng một không gian tên ạng và có thể giao tiếp với như bằng localhost.
- Chia sẻ lưu trữ và khối lượng: Pod có thể chia sẻ khối lượng lưu trữ, cho phép chia sẻ dữ liệu và duy trì tính nhất quán giữa các container trong cùng một Pod.
Vai trò chính của Kubernetes Pod
Kubernetes Pod có vai trò như nền móng cho Kubernetes, trừu tượng hóa quá trình quản lý và mở rộng ứng dụng. Chúng là nơi chứa các container, đồng thời quản lý và phân phối chúng trên nhiều node trong một Cluster.
Pods đóng vai trò quan trọng trong việc mở rộng quy mô, sao chép và phân bổ tài nguyên trong Kubernetes. Chúng cho phép chúng ta mở rộng quy mô theo chiều ngang bằng cách tạo nhiều bản sao của nhóm, giúp xử lý công việc tăng lên một cách hiệu quả.
Pod hoạt động như thế nào?
Vòng đời của Pod
Bộ điều khiển quản lý các pod dựa trên trạng thái của chúng. Tất cả các pod trong Kubernetes đều có một trường trạng thái trong đối tượng API PodStatus, trong đó chúng công bố trạng thái của mình trong trường Phase. Trạng thái phase tóm tắt trạng thái hiện tại của pod.
Trạng thái của một pod trong Kubernetes có thể là một trong các trạng thái sau:
- Đang chờ xử lý (Pending): Tạo thành công Pod trong Cluster, nhưng một hoặc nhiều container không chạy.
- Đang chạy (Running): Pod đã được nhúng vào một nút với tất cả các container của nó được tạo, chạy hoặc khởi động lại.
- Thành công (Succeeded): Các container của pod đã hoàn thành. Sau khi kết thúc, các pod sẽ không khởi động lại.
- Không thành công (Failed): Một container trong các pod không thể kết thúc hoặc xóa. Tất cả các pod đã kết thúc sẽ có trạng thái bằng không. Bất kỳ trạng thái khác được coi là thất bại.
- Không xác định (Unknown): Bộ điều khiển không thể xác định trạng thái của pod.
Bộ điều khiển
Trong Kubernetes, Bộ điều khiển (Controller) được đặt trong Controller Manager - một tiến trình chạy ngầm (daemon) nhúng các vòng lặp điều khiển được cung cấp cùng Kubernetes. Bộ điều khiển thông qua các tiến trình theo dõi trạng thái của các Cluster, từ đó gửi yêu cầu đến máy chủ API để thực hiện các thay đổi theo trạng thái của Pod. Mục đích của bộ điều khiển là duy trì Cluster gần hơn với trạng thái mong muốn.
Ví dụ, khi một pod gặp sự cố hoặc không phản hồi, bộ điều khiển sẽ nhận được thông báo về trạng thái đó và sẽ nhanh chóng gửi yêu cầu để tạo một pod sao chép thay thế cho pod bị lỗi. Do Pod không thể tự tạo, sửa chữa hoặc tự xóa chính nó. Trong hầu hết các trường hợp, bộ điều khiển sẽ gửi thông điệp đến máy chủ API và API sẽ gửi các tín hiệu để áp dụng vào pod Kubernetes để đảm bảo ứng dụng hoạt động liên tục.
Bộ điều khiển cũng có thể sử dụng các tài nguyên bên ngoài để Pod đạt được trạng thái mong muốn, sau đó quay lại báo cáo trạng thái mới với máy chủ API của Cluster.
Kubernetes có các bộ điều khiển tích hợp sẵn chạy trong Controller Manager. Các bộ điều khiển này bao gồm:
- Bộ điều khiển công việc (Job controller): Đảm bảo một tác vụ cụ thể được thực hiện đến khi hoàn thành.
- Bộ điều khiển triển khai (Deployment): Quản lý các ứng dụng không có trạng thái như máy chủ web (máy chủ HTTP).
- Bộ điều khiển StatefulSet: Quản lý các ứng dụng có trạng thái và bền vững như cơ sở dữ liệu.
Pod Templates
Trong Kubernetes, các controllers có một trường gọi là Pod Template chứa thông số kỹ thuật để Pod hoạt động. Các thông số này hiển thị dung lượng được sử dụng và tên, hình ảnh của các container chạy trong Pod.
Để tạo ra các pod mới và duy trì trạng thái mong muốn của chúng trong các cluster, các controllers sử dụng pod templates. PodTemplate sẽ có các tài nguyên khối lượng công việc như DaemonSets, Jobs và Deployments sau khi có được thông số kỹ thuật để tạo Pod. Tóm lại, một pod template là một bản thiết kế được sử dụng để xây dựng các pod sao cho bất kỳ thay đổi nào được thực hiện trên template cũng sẽ ảnh hưởng đến các pod mới được tạo từ nó.
Pod Template có thể sử dụng để cập nhật các tính năng mới của ứng dụng. Khi Pod Template thay đổi, bộ điều khiển sẽ ngăn ko cho Pod tiếp nhận các tín hiệu hay yêu cầu mới, sau đó thu nhỏ chúng lại đến khi kết thúc hoàn toàn. Pod Template được cập nhật sẽ tạo các Pod mới, với những tính năng mới.
Pod Storage
Volume là các thư mục các pod dùng để lưu trữ dữ liệu. Trong một pod Kubernetes, tất cả các container đều có quyền truy cập vào dữ liệu. Mặc dù volume ở các Pod sẽ khác nhau nhưng nhìn chung volume dữ liệu tạm thời và volume dữ liệu liên tục là những loại phổ biến nhất. Volume dữ liệu liên tục được sử dụng nhiều hơn vì chúng có thể được khôi phục trong trường hợp pod gặp sự cố. Còn khối lượng dữ liệu tạm thời sẽ bị xóa bỏ sau khi Pod không còn tồn tại.
Hệ thống PersistentVolume trong Kubernetes cung cấp cho người quản trị một API để truyền thông tin lưu trữ. Vòng đời của các volume lưu trữ là khác biệt so với vòng đời của các pod sử dụng chúng.
Việc khai báo container mà volume sẽ được cài đặt là điều cần thiết. Vì volume được gắn kết tại các đường dẫn đã được xác định trước, mỗi container trong một Kubernetes Pod sẽ có một đường dẫn duy nhất đến volume mà nó cần truy cập.
Pod Networking
Trong Kubernetes, mỗi pod có một địa chỉ IP riêng sử dụng để giao tiếp. Các container trong pod có thể giao tiếp với nhau thông qua localhost vì chúng chia sẻ cùng một không gian mạng, địa chỉ IP và cổng mạng. Tuy nhiên, chúng cũng có thể sử dụng bộ nhớ chung và các semaphores SystemV để tương tác giữa các tiến trình.
Ngoài ra, các container cũng có thể giao tiếp với các container khác đang hoạt động trong các pod Kubernetes khác nhau. Vì mỗi pod có một địa chỉ IP riêng biệt và ngăn chặn giao tiếp cấp hệ điều hành nên nếu muốn giao tiếp chúng phải sử dụng mạng IP.
Cách làm việc với Pod
Nhận Pod
Sử dụng lệnh kubectl get pods để lấy dữ liệu từ các pod trong Kubernetes khi cần thiết. Bạn có thể xem dữ liệu dưới dạng bảng về các tài nguyên trong một pod bằng lệnh này. Để lấy thông tin về một pod cụ thể, chạy lệnh kubectl get pods tên_pod.
Sử dụng bộ lọc nhãn (label selectors) trong lệnh kubectl api-resources để lọc dữ liệu dựa trên yêu cầu của người dùng. Kết quả trả về cuối cùng là tóm tắt về tất cả các tài nguyên được hỗ trợ trong Cluster.
Tạo pod
Sử dụng lệnh $ kubectl create -f FILENAME để tạo Pod. Tuy nhiên Kubernetes không khuyến khích người dùng tạo Pod bằng cách này. Nguyên nhân là do tất cả dữ liệu ứng dụng đều có nguy cơ bị lỗi do Pod chỉ tồn tại trong một khoảng thời gian nhất định.
Cách tốt nhất để bạn tạo Pod là sử dụng bộ điều khiển. Các bộ điều khiển như Deployment, Jobs và StatefulSets sẽ đảm bảo quá trình sao chép Pod, khối lượng Pod và việc Pod hoạt động.
Cập nhật hoặc thay thế Pod (nếu cần)
Các thông tin như metadata, trường, tên và một số thông số kỹ thuật trên Kubernetes Pod sẽ không thể thay đổi nên việc cập nhật hay thay thế Pod sẽ có những hạn chế nhất định. Với những trường hợp không thể cập nhật hoặc thay thế Pod, Kubernetes sẽ đề xuất chỉnh sửa Pod Template và sử dụng chính Pod Template đó để tạo Pod mới.
Xóa Pod
Muốn xóa Pod, hãy sử dụng lệnh $ kubectl delete -f ./mypod.yaml. Các Pod sẽ có khoảng 30 giây để chấm dứt. Không nên xóa các Pod chứa bộ nhớ, API hoặc tên. Việc xóa các Pod có thể ảnh hưởng đến chu trình hoạt động của ứng dụng, dẫn đến sự không nhất quán và lỗi dữ liệu.
Nếu người dùng không xóa các nhóm, Kubernetes cũng sẽ tự động xóa chúng. Sau khi xóa một Pod, Kubernetes sẽ tự động vô hiệu hóa bộ nhớ đệm khám phá. Quá trình này mất khoảng 10 phút để hoàn thành. Hoặc người dùng có thể chạy kubectl api-resources nếu không muốn mất 10 phút chờ đợi.
Giám sát Pod hoạt động
Bằng cách theo dõi các chỉ số hiệu suất, số lượng tài nguyên và hoạt động trong cụm, việc giám sát Kubernetes cung cấp thông tin về tình trạng của cụm. Để phản ứng nhanh chóng với các vấn đề khi chúng phát sinh, bạn phải luôn luôn cảnh giác.
Tuy nhiên, việc ghi log và giám sát các thành phần của Kubernetes trở nên khó khăn hơn do tính phức tạp của nền tảng này. Sẽ cần có một phương pháp chi tiết và một hệ thống theo dõi từng thành phần, chẳng hạn như tài nguyên trong một Kubernetes deployment hoặc tình trạng của các pod đã triển khai, để thực hiện việc giám sát trong môi trường Kubernetes.
Cách tạo Kubernetes Pod như thế nào
Tạo Pod bằng lệnh kubectl
Sử dụng lệnh kubectl sau để tạo Pod
kubectl run nginx-pod --image=nginx --port=80
Đây là câu lệnh để tạo một Pod có tên "nginx-pod" từ image là "nginx" và listen ở port 80.
Trước khi cho apply vào hệ thống, hãy gen ra file yaml trước để kiểm tra, sử dụng câu lệnh sau:
kubectl run nginx-pod --image=nginx --port=80 --dry-run=client -oyaml
Mỗi lần chạy lệnh hãy gen ra file yaml nhằm kiểm tra, đến khi nào ổn thì mới up lên hệ thống bằng dòng lệnh:
kubect apply -f [pod-yaml-file]
Tạo một container trên một Pod
Để tạo một container trên một Pod, có hai cách sau đây:
Cách 1: Chạy lệnh:
$ kubectl run <tên của nhóm> -- image=<tên của hình ảnh từ sổ đăng ký>
Cách 2: Khai báo:
apiPhiên bản: v1
loại: Pod
metadata:
tên: <tên nhóm>
thông số kỹ thuật:
hộp đựng:
- tên: <tên container>
image: <tên của image từ sổ đăng ký>
cổng:
- Cảng container: 7500
imagePullPolicy: Luôn luôn
Lưu tệp này với tên pod.yaml và chạy dòng lệnh sau:
$ kubectl tạo –f pod.yaml
Tạo nhiều container Pod
Sử dụng tệp YAML-
apiPhiên bản: v1
loại: Pod
metadata:
tên: <tên nhóm>
thông số kỹ thuật:
hộp đựng:
- Tên: <tên container 1>
hình ảnh: <tên của hình ảnh>
cổng:
- Cảng container: 7500
imagePullPolicy: Luôn luôn
-name: <tên container 2>
hình ảnh: <tên của hình ảnh>
Cổng:
- Cảng container: 7501
imagePullPolicy: Luôn luôn
Lưu tệp này với tên multicontainer.yaml và chạy dòng lệnh sau:
$ kubectl tạo –f multicontainer.yaml
Hy vọng qua bài viết này, bạn đã có cái nhìn tổng quan về Kubernetes Pod là gì và hiểu rõ hơn về vai trò quan trọng của nó trong việc triển khai ứng dụng trên nền tảng Kubernetes. Với kiến thức này, bạn có thể sử dụng Kubernetes Pod một cách hiệu quả để quản lý và vận hành các ứng dụng của mình trên môi trường Kubernetes.
>> Có thể bạn quan tâm: Tìm hiểu mối liên kết giữa Kubernetes Cluster, Node vs Pod