Winston is a highly experienced digital marketing professional, specializing in Cybersecurity, IT services, and Software as a Service (SaaS).
Nếu bạn đang tìm hiểu về các điều phối các container trong Kubernetes, Pod là một khái nhiệm vô cùng quan trọng mà bạn cần phải nắm vững. Bài viết này sẽ giúp bạn hiểu rõ mọi thứ cần biết về Kubernetes Pods và vai trò của chúng trong việc quản lý các ứng dụng container hóa trên Kubernetes.
Pod là gì?
Pod là đơn vị nhỏ nhất có thể triển khai và quản lý trong Kubernetes. Mỗi K8s Pod bao gồm một hoặc nhiều container cùng với thông tin kỹ thuật về các container đó. Chúng cùng chia sẻ các tài nguyên như lưu trữ và mạng.
Các thành phần trong một Pod luôn ở cùng vị trí, lên lịch chạy cùng nhau và hoạt động trong một ngữ cảnh chung. Điều này giúp các container trong Pod có thể giao tiếp và chia sẻ dữ liệu dễ dàng hơn.
1. Pod tĩnh
Pod tĩnh (static) là loại pod được quản lý trực tiếp bởi kubelet trên một node cụ thể mà không cần một API server giám sát.
Khác với hầu hết các pod thông thường do control plane quản lý (ví dụ như Deployment), pod tĩnh được giám sát và khởi động lại trực tiếp bởi kubelet nếu gặp sự cố.
Pod tĩnh luôn gắn liền với một kubelet trên một node nhất định. Ứng dụng phổ biến của pod tĩnh là để chạy một control plane tự quản lý. Nói cách khác, kubelet sẽ giám sát từng thành phần riêng lẻ của control plane.
2. Pod với nhiều container
Pod được thiết kế để hỗ trợ nhiều tiến trình hoạt động cùng nhau dưới dạng các container, tạo thành một service đơn lẻ gắn kết.
Các container trong một Pod sẽ tự động được đặt cùng vị trí và lên lịch chạy trên cùng một máy vật lý hoặc máy ảo trong cluster. Chúng có thể chia sẻ tài nguyên và phụ thuộc, giao tiếp với nhau và phối hợp về thời điểm cũng như cách chúng kết thúc.
Trong một Kubernetes cluster, Pod được sử dụng theo hai cách chính:
- Pod chạy một container đơn lẻ: Đây là mô hình phổ biến nhất trong Kubernetes. Trong trường hợp này, Pod đóng vai trò như một lớp bọc bao quanh container. Kubernetes quản lý Pod thay vì quản lý trực tiếp container trong đó.
- Pod chạy nhiều container: Pod cũng có thể chứa một ứng dụng gồm nhiều container chung một vị trí, gắn kết chặt chẽ và cần chia sẻ tài nguyên với nhau. Các container này tạo thành một đơn vị thống nhất.
Nội dung liên quan: Tổng quan về Kiến trúc Kubernetes
Tạo một Pod
Thông thường, chúng ta không tạo Pod trực tiếp mà sử dụng các tài nguyên workload cấp cao hơn. Ví dụ như Deployment sẽ đảm nhiệm việc tạo Pod thay cho chúng ta. Lý do là vì Pod được thiết kế để có tính tạm thời và dễ dàng thay thế.
Tuy nhiên, nếu bạn cần tạo Pod để luyện tập hay kiểm tra, bạn có thể sử dụng file YAML sau. Đó là ví dụ về một Pod chứa một container chạy image nginx phiên bản 1.14.2:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Để tạo Pod từ file YAML trên, hãy chạy lệnh sau:
kubectl apply -f <https://k8s.io/examples/pods/simple-pod.yaml>
Lệnh này sẽ áp dụng cấu hình từ file YAML và tạo Pod trong cluster Kubernetes của bạn.
Quản lý Kubernetes Pods
Khi một Pod được tạo ra (trực tiếp hoặc gián tiếp thông qua một controller), nó sẽ được lên lịch để chạy trên một Node trong cluster của bạn. Pod sẽ tiếp tục chạy trên Node đó cho đến khi kết thúc, bị xóa, bị đẩy ra do thiếu tài nguyên, hoặc Node gặp sự cố.
Bạn có thể sử dụng các workload resource để tạo và quản lý nhiều Pod. Controller của resource sẽ xử lý việc nhân bản, triển khai và tự động khôi phục khi Pod gặp lỗi.
Ví dụ, nếu một Node bị lỗi, controller sẽ phát hiện các Pod trên Node đó đã ngừng hoạt động và sẽ tạo ra Pod thay thế. Scheduler sau đó sẽ đặt Pod thay thế lên một Node bình thường..
Dưới đây là một số workload resource có thể quản lý một hoặc nhiều Pod:
Các resource này giúp việc quản lý Pod trở nên dễ dàng và linh hoạt hơn so với việc tạo và quản lý từng Pod riêng lẻ.
1. Template
Các controller sẽ tạo ra các Pod dựa trên một pod template và quản lý chúng thay cho bạn. Đó là là các thông số kỹ thuật để tạo Pod. Chúng được bao gồm trong các workload resource như Deployment, Job và DaemonSet.
Mỗi controller của một resource sử dụng template bên trong đối tượng workload để tạo ra các Pod thực tế. Template là một phần của trạng thái mong muốn của tài nguyên workload mà bạn sử dụng để chạy ứng dụng. Khi tạo Pod, bạn có thể thêm các biến môi trường vào template cho các container chạy trong Pod đó.
Dưới đây là một file manifest ví dụ cho một Job đơn giản chứa template khởi động một container. Container trong Pod này sẽ in ra một thông báo rồi tạm dừng.
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
# This is the pod templatespec:
containers:
-name: hello
image: busybox:1.28
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
restartPolicy: OnFailure
# The pod template ends here
Việc sửa đổi template hoặc chuyển sang một template mới không ảnh hưởng trực tiếp đến các Pod đã tồn tại. Nếu bạn thay đổi pod template cho một workload resource, resource đó sẽ cần tạo ra các Pod thay thế sử dụng template đã cập nhật. Mỗi workload resource có cách riêng để xử lý các thay đổi trong template.
2. Cập nhật và thay thế Pod
Kubernetes cho phép bạn quản lý trực tiếp các Pod. Bạn có thể cập nhật một số trường của Pod đang chạy. Tuy nhiên, các thao tác cập nhật Pod như patch và replace có một số hạn chế:
Hầu hết metadata của Pod không thể thay đổi được. Ví dụ, bạn không thể sửa các trường namespace, name, hay uid. Trường generation là ngoại lệ duy nhất và nó cũng chỉ chấp nhận việc tăng giá trị hiện tại.
Tương tự, khi cập nhật Pod, bạn chỉ có thể thay đổi một số trường: spec.containers[].image, spec.initContainers[].image, spec.activeDeadlineSeconds hoặc spec.tolerations. Với spec.tolerations, bạn chỉ được phép thêm mục mới.
Đối với trường spec.activeDeadlineSeconds, chỉ có hai kiểu cập nhật được cho phép:
- Đặt giá trị dương cho trường chưa được gán.
- Cập nhật từ một số dương sang một số không âm nhỏ hơn.
Xem thêm: Chứng chỉ CKA và những điều bạn nên biết
Chia sẻ tài nguyên và giao tiếp giữa các Kubernetes Pods
1. Lưu trữ trong Pod
Pod có thể chỉ định một tập hợp các volume lưu trữ được chia sẻ. Tất cả các container trong Pod đều có thể truy cập các volume này để chia sẻ dữ liệu với nhau. Volume cũng giúp dữ liệu trong Pod được lưu giữ ngay cả khi một container cần được khởi động lại.
2. Mạng trong Pod
Mỗi Pod được gán một địa chỉ IP duy nhất cho mỗi họ địa chỉ. Tất cả các container trong một Pod đều chia sẻ không gian tên mạng, bao gồm địa chỉ IP và cổng mạng. Bên trong Pod, các container có thể giao tiếp với nhau qua localhost.
Khi container trong Pod giao tiếp với bên ngoài, chúng phải điều phối với nhu việc sử dụng tài nguyên mạng chung như cổng. Trong cùng một Pod, các container chia sẻ địa chỉ IP và không gian cổng.
Các container trong Pod còn có thể giao tiếp qua các cơ chế IPC tiêu chuẩn như semaphore SystemV hoặc bộ nhớ chia sẻ POSIX. Tuy nhiên, container ở các Pod khác nhau có địa chỉ IP riêng biệt và không thể giao tiếp qua IPC cấp hệ điều hành nếu không có thiết lập đặc biệt.
Nếu muốn tương tác với container ở Pod khác, container có thể sử dụng mạng IP để giao tiếp.
Bảo mật
Để thiết lập các ràng buộc bảo mật cho Pod và container, bạn có thể sử dụng trường securityContext trong đặc tả Pod. Nó cho phép chúng ta kiểm soát chi tiết những gì một Pod hoặc từng container có thể thực hiện.
Ví dụ, bạn có thể:
- Loại bỏ một số tính năng cụ thể trong Linux để tránh tác động của lỗ hổng bảo mật.
- Bắt buộc tất cả các tiến trình trong Pod chạy dưới quyền người dùng thông hường (không phải root) hoặc dưới một người dùng/nhóm cụ thể.
- Cấu hình các tùy chọn bảo mật trên Windows, chẳng hạn như cho phép container chạy dưới dạng HostProcess hay không.
Những cài đặt này giúp tăng cường bảo mật cho ứng dụng chạy trong Kubernetes bằng cách hạn chế quyền truy cập và khả năng thực thi của Pod/container.
Lời kết
Pod là một khái niệm khá đơn giản nhưng quan trọng trong Kubernetes. Trong hầu hết các trường hợp, bạn có thể xem Pod tương tự như container. Tuy nhiên, Pod cung cấp thêm chức năng khác khi cần thiết, giúp mở rộng khả năng của ứng dụng của bạn. Locker hy vọng bài viết này đã giúp bạn hiểu rõ hơn về Kubernetes Pods.
Tìm hiểu thêm các kiến thức cho devops về bảo mật hệ thống.