Nghiên Cứu Cơ Chế Vận Hành Của Pod Và Hạ Tầng Mạng Trong Kubernetes

1. Tổng Quan Về Khái Niệm Pod

Pod được xem là thành phần nhỏ nhất có thể triển khai trên hệ thống Kubernetes. Đây là một đơn vị logic để đóng gói một hoặc nhiều quá trình ứng dụng (container) chạy cùng nhau với tài nguyên dùng chung.

1.1. Vai Trò Của Container Pause

Mỗi Pod luôn bao gồm ít nhất một container đặc biệt gọi là pause. Chức năng chính của container này không phải là chạy nghiệp vụ mà hỗ trợ hạ tầng cho các ứng dụng khác:

  • Tổng quan: Khi một Pod được tạo ra, container pause là tiến trình đầu tiên bắt đầu thực thi. Nó chịu trách nhiệm thiết lập môi trường mạng ảo cho các container con.
  • Xử lý tiến trình chết: Container pause đảm nhận vai trò tiến trình cha (PID 1) để thu gom các zombie processes do các ứng dụng phụ thuộc sinh ra khi bị terminate bất thường.
  • Chia sẻ không gian tên (Namespace): Các ứng dụng chạy trong cùng Pod sẽ chia sẻ mạng, IPC và PID thông qua container pause này, giúp chúng giao tiếp nội bộ qua localhost mà không cần expose port ra ngoài.

1.2. Bản Chất Logic Của Pod

Pod không tồn tại dưới dạng vật lý cố định mà là một sự trừ tượng hóa. Bạn không thể "bấm" vào một Pod riêng lẻ, mà chỉ tương tác với các container nằm bên trong nó hoặc các tài nguyên liên kết (lưu trữ, mạng) mà nó cấp quyền truy cập.


2. Thiết Lập Môi Trường Thử Nghiệm Với Rocky Linux

Để thực hiện các bài giảng về mạng container, việc chuẩn bị một máy chủ ảo (VM) ổn định là cần thiết. Dưới đây là quy trình cài đặt hệ điều hành Rocky Linux và tối ưu hóa môi trường.

2.1. Tạo Máy Ảo Trong VMware

  1. Khởi tạo máy ảo mới với chế độ tùy chỉnh (Custom).
  2. Cấu hình phần cứng: 2 CPU với tổng cộng 2 nhân mỗi socket, RAM 4GB, ổ cứng SCSI dung lượng 100GB.
  3. Sử dụng chế độ mạng Host-only (chỉ kết nối với mạng nội bộ máy chủ).
  4. Gắn file ISO Rocky Linux 9.5 vào cổng CD/DVD.

2.2. Quá Trình Cài Đặt Hệ Điều Hành

Khi boot từ đĩa cài đặt, người dùng cần phân vùng lưu trữ thủ công theo mô hình sau:

  • /boot: 800MB dành cho kernel.
  • swap: 4GB bộ nhớ đệm swap.
  • /: Còn lại dành cho hệ thống gốc.

Thiết lập mật khẩu root và kích hoạt đăng nhập SSH bằng password. Sau khi cài xong, khởi động lại và chụp ảnh hệ thống (snapshot) để quay lại trạng thái sạch nếu cần.

2.3. Tối Ưu Hóa Cấu Hình Mạng

Để đảm bảo tính ổn định trong quá trình vận hành, cần thiết lập địa chỉ IP tĩnh cho adapter mạng (ví dụ: ens33). File cấu hình nằm tại /etc/NetworkManager/system-connections/. Thay vì DHCP, ta chuyển sang chế độ manual với IP cụ thể (ví dụ: 192.168.100.50/24).

[ipv4]
method=manual
address1=192.168.100.50/24, 192.168.100.1

[connection]
type=ethernet
interface-name=ens33

Vận hành lệnh restart network manager để áp dụng thay đổi:

systemctl restart NetworkManager

2.4. Chuẩn Bị Môi Trường Phần Mềm

Trước khi cài đặt các công cụ container, cần cấu hình nguồn YUM và tắt các dịch vụ tường lửa mặc định để tránh xung đột:

  • Thay thế mirror list của Rocky bằng nguồn mirror Alibaba uy tín hơn để tốc độ tải nhanh hơn.
  • Bỏ sử dụng firewalld và thay thế bằng iptables services truyền thống để dễ quản lý rule tĩnh.
  • Tắt hoàn toàn SELinux để giảm thiểu các lỗi liên quan đến context bảo mật trong giai đoạn testing.

Lệnh gỡ bỏ và vô hiệu hóa dịch vụ không cần thiết:

systemctl stop firewalld
systemctl disable firewalld
# Cài đặt iptables
yum install -y iptables-services
systemctl start iptables
iptables -F

Điều chỉnh tham số Kernel liên quan đến cầu nối và转发 gói tin:

echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

3. Mô Phỏng Pod Sử Dụng Docker Engine

Dù Kubernetes sử dụng các container runtime phức tạp hơn (như ContainerD hay CRI-O), nhưng cốt lõi của việc chia sẻ tài nguyên vẫn giống hệt Docker. Ta có thể dùng Docker để minh họa cơ chế hoạt động của Pod.

3.1. Cài Đặt Docker

Cần cài đặt các gói tiền đề như bridge-utils và module kernel br_netfilter để đảm bảo mạng cầu hoạt động đúng cách. Sau đó tiến hành thêm kho chứa Docker CE qua Yum Repo của Alibaba Cloud.

Cấu hình Daemon JSON để tùy chỉnh driver Cgroups thành systemd (phù hợp với systemd unit files) và chỉ định thư mục lưu trữ dữ liệu riêng biệt:

{
  "default-ipc-mode": "shareable",
  "data-root": "/var/lib/docker_data",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "registry-mirrors": ["https://internal-docker-proxy.example.com"]
}

3.2. Thực Thi Mô Phỏng Chia Sẻ Tài Nguyên

We sẽ khởi động ba container: pause, nginx, và ghost.

  1. Khởi động Pause Container: Đây là container gốc giữ mạng và tiến trình chính.
docker run --name my-pause-base -d pause:3.1
  1. Khởi động Ứng Dụng Chia Sẻ: Hai ứng dụng nginx và ghost sẽ được chạy với cờ chia sẻ mạng và PID với container pause.
# Container Nginx sử dụng mạng của my-pause-base
docker run --name app-nginx \
  --net=container:my-pause-base \
  --pid=container:my-pause-base \
  -v /path/to/nginx.conf:/etc/nginx/nginx.conf \
  -d nginx:latest

# Container Ghost tương tự
docker run --name app-ghost \
  --net=container:my-pause-base \
  --ipc=container:my-pause-base \
  -d ghost:5.0.0

Lưu ý quan trọng:

Việc sử dụng container chuyên dụng (pause) thay vì chỉ share trực tiếp giữa các container app mang lại lợi ích lớn về độ bền. Nếu container app (như nginx) crash, container pause vẫn sống sót duy trì trạng thái mạng, giúp kiểm soát rác và giữ cho hệ thống ổn định lâu dài.


4. Kiến Trúc Mạng Kubernetes Và CNI

Kubernetes yêu cầu một mạng lưới phẳng (Flat Network), nơi mọi Pod trên mọi node đều có thể giao tiếp trực tiếp với nhau qua IP mà không cần qua NAT. Để đạt được điều này, tiêu chuẩn CNI (Container Network Interface) được sử dụng rộng rãi.

4.1. Nguyên Tắc Giao Tiếp

  1. Một Pod có thể talk tới bất kỳ Pod nào khác trên cluster mà không cần NAT.
  2. Một Pod có thể talk tới bất kỳ Service/IP trên node host đang chạy.
  3. Mỗi Pod sở hữu một IP duy nhất.

4.2. Giải Pháp Định Tuyến Calico

Calico là giải pháp mạng phổ biến, cung cấp khả năng bảo mật và định tuyến linh hoạt thông qua kiến trúc Agent (Felix, Bird) và Datastore (etcd).

4.2.1. Cơ Chế Overlays

Calico hỗ trợ nhiều cơ chế encapsulation tùy theo nhu cầu mạng lưới vật lý:

  • VXLAN: Sử dụng UDP để đóng gói packet Layer 2 qua Layer 3. Phù hợp với mạng không cần tối ưu hóa băng thông cao nhất. Cấu hình bật tính năng này cần thiết lập CALICO_IPV4POOL_VXLAN="Always".
  • IPIP: Đóng gói IP trong IP trực tiếp qua giao thức Tunnel tunl0. Tương thích tốt với IPv4, giảm overhead so với UDP nhưng vẫn cần xử lý packet ở mức Kernel.
  • BGP (Border Gateway Protocol): Không đóng gói (No Encapsulation). Sử dụng protocol định tuyến chuẩn để quảng bá routes của từng Pod tới switch vật lý hoặc router. Hiệu suất cao nhất nhưng đòi hỏi thiết bị mạng hỗ trợ BGP Speaker hoặc cấu hình Static Route phức tạp.

4.2.2. So Sánh Hiệu Năng

Mô Hình Đóng Gói (Encap) Hiệu Suất Phức Tạp Cấu Hình
VXLAN Có (UDP) Trung bình Thấp (Tự động)
IPIP Có (IP-in-IP) Trung bình-Khá Thấp
BGP Không Cao Nhất Cao (Yêu cầu thiết bị mạng)

4.2.3. Xác Minh Trạng Thái

Dùng các công cụ đi kèm của Calico để kiểm tra phiên bản node và trạng thái peer:

calicoctl get node -o wide
calicoctl node status

Các lệnh này giúp admin xác nhận xem kết nối vật lý đã đồng bộ với layer logic chưa, đặc biệt quan trọng khi chuyển đổi giữa các mode VXLAN và BGP.

Thẻ: Kubernetes Pod Networking CNI calico

Đăng vào ngày 22 tháng 8 lúc 01:09