K8s trong bóng tối: Đóng gói Stack bảo mật với Zarf

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Thực tế Sneakernet lúc 2 giờ sáng

Hãy tưởng tượng cảnh này: Đã 2 giờ sáng trong một phòng SCIF không cửa sổ. Điện thoại của bạn mất sóng hoàn toàn, tủ server đang kêu rú, và hoàn toàn không có đường kết nối nào ra internet công cộng.

Đây chính là môi trường “air-gap”. Nhiệm vụ của bạn là triển khai một stack gồm 20 microservice lên một cụm Kubernetes chưa từng biết đến Google DNS. Trước đây, điều này đồng nghĩa với một cơn ác mộng của các lệnh docker save, các shell script mỏng manh và nỗi lo sợ thường trực về việc quên mất một phụ thuộc (dependency) nhỏ nào đó. Nếu bạn bỏ lỡ dù chỉ một image 50MB, toàn bộ quá trình triển khai sẽ bị đình trệ, buộc bạn phải lái xe hai tiếng đồng hồ quay lại văn phòng để sửa lỗi manifest.

Làm chủ các môi trường không kết nối này là điều phân biệt các kỹ sư platform cấp cao với phần còn lại. Việc chuyển từ thiết lập “chạy tốt trên máy tôi” sang một đám mây hoàn toàn độc lập đòi hỏi một bộ công cụ khác. Đó là lúc Zarf xuất hiện. Được phát triển bởi Defense Unicorns, Zarf là một công cụ mã nguồn mở giúp gom các image, binary và Helm chart vào một tệp .zst nén duy nhất. Nó xử lý hiệu quả toàn bộ stack ứng dụng của bạn như một artifact di động duy nhất.

Bắt đầu nhanh: Xây dựng Package đầu tiên trong 5 phút

Bạn sẽ cần Zarf CLI trên một máy có kết nối internet để tải các phụ thuộc ban đầu. Sau khi package được tạo xong, bạn có thể mang nó vào môi trường cách ly của mình bằng một ổ cứng mã hóa phần cứng.

1. Cài đặt CLI

# Trên macOS/Linux sử dụng Homebrew
brew install zarf

# Hoặc tải trực tiếp binary cho Linux
curl -s https://api.github.com/repos/defenseunicorns/zarf/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep Linux_amd64 | xargs curl -L -o zarf
chmod +x zarf
sudo mv zarf /usr/local/bin/

2. Định nghĩa tệp zarf.yaml

Tệp zarf.yaml đóng vai trò như bản khai báo (manifest). Nó chỉ dẫn cho công cụ chính xác những gì cần thu thập từ web trước khi bạn ngắt kết nối.

kind: ZarfPackageConfig
metadata:
  name: secure-nginx-demo
  description: "Triển khai Nginx trong môi trường air-gap"

components:
  - name: web-server
    required: true
    manifests:
      - name: nginx-deployment
        files:
          - nginx-deployment.yaml
    images:
      - nginx:1.25.3-alpine

3. Đóng gói và Vận chuyển

Chạy lệnh create để tải các image và đóng gói chúng lại. Một package Nginx điển hình thường nặng khoảng 20-30MB, nhưng một stack đầy đủ có thể dễ dàng lên tới 5GB hoặc hơn.

# Tạo package
zarf package create .

# Di chuyển tệp .zst sang máy ngoại tuyến của bạn

# Khởi tạo cluster (thiết lập registry nội bộ)
zarf init

# Triển khai package
zarf package deploy zarf-package-secure-nginx-demo-amd64.tar.zst

Cách Zarf giải quyết vấn đề Registry

Việc chạy zarf init không chỉ đơn thuần là cài đặt một binary. Nó triển khai một container registry cục bộ và một Mutating Webhook bên trong cluster của bạn. Đây là cơ chế cốt lõi giúp việc triển khai ngoại tuyến trở nên liền mạch.

Trong môi trường tiêu chuẩn, các node K8s cố gắng kéo nginx:latest từ Docker Hub. Trong một trang web air-gap, yêu cầu đó sẽ hết hạn (timeout) sau 30 giây. Zarf Agent sẽ chặn các yêu cầu “pull” này. Nó tự động chuyển hướng node đến registry Zarf nội bộ đang chạy trên cluster. Bạn không cần phải sửa thủ công 50 tệp YAML khác nhau để trỏ về một địa chỉ IP cục bộ. Zarf xử lý việc chuyển đổi này ngay tức thì.

Quản lý trạng thái ngoại tuyến

Zarf theo dõi chính xác phiên bản component nào đang chạy trong môi trường của bạn. Nếu việc triển khai thất bại lúc 3 giờ sáng, bạn có thể chạy zarf package list. Lệnh này cung cấp cho bạn cái nhìn rõ ràng về môi trường không kết nối mà không cần phải lục lọi trong log K8s thô hoặc các manifest khó hiểu.

Xử lý các Helm Chart phức tạp

Các stack hiện đại hiếm khi chỉ dựa vào một Pod duy nhất. Thông thường, bạn sẽ làm việc với các Helm chart chứa hàng tá phụ thuộc. Zarf xuất sắc ở điểm này bằng cách xác định đệ quy mọi image được đề cập trong chart và đưa nó vào gói bundle.

components:
  - name: database-layer
    charts:
      - name: postgresql
        url: https://charts.bitnami.com/bitnami
        version: 12.1.0
    images:
      - bitnami/postgresql:15.2.0-debian-11-r0
  
  - name: config-assets
    files:
      - source: ./scripts/init-db.sh
        target: /usr/local/bin/init-db.sh
        executable: true

Trong kịch bản này, Zarf tải Helm chart của Bitnami và image Postgres cụ thể. Khi bạn triển khai ngoại tuyến, Zarf sẽ “gắn thẻ lại” (re-tag) các giá trị Helm. Điều này đảm bảo cluster kéo image Postgres nặng 800MB từ registry Zarf cục bộ thay vì cố gắng kết nối internet.

Kinh nghiệm xương máu từ thực tế

Sau nhiều năm vật lộn với các hệ thống không kết nối, tôi học được rằng một sơ suất nhỏ nhất cũng có thể làm hỏng cả quá trình triển khai. Dưới đây là cách tránh các lỗi phổ biến:

  • Cắt giảm phần dư thừa: Container image rất nặng. Nếu bạn sử dụng tag “latest” hoặc các image dựa trên Ubuntu cồng kềnh, tệp .zst của bạn sẽ phình to. Chuyển từ image Python tiêu chuẩn (900MB) sang image dựa trên Alpine (50MB) giúp tiết kiệm đáng kể thời gian truyền tải.
  • Xác minh mã Hash: Lỗi dữ liệu thường xảy ra khi di chuyển tệp qua USB hoặc chuyển dữ liệu giữa các vùng mạng khác nhau. Zarf thực hiện các kiểm tra nội bộ, nhưng bạn nên luôn chạy sha256sum trên package của mình trước khi bắt đầu quá trình zarf package deploy.
  • Module hóa các thành phần: Tránh đưa toàn bộ hạ tầng của bạn vào một component khổng lồ duy nhất. Sử dụng cờ required: false cho các công cụ không thiết yếu như Prometheus hoặc Grafana. Điều này cho phép bạn bỏ qua việc giám sát tiêu tốn tài nguyên nếu phần cứng cục bộ không đủ mạnh.
  • Khởi tạo nhẹ nhàng: Lệnh zarf init cài đặt mặc định một số dịch vụ. Nếu bạn đang triển khai cho một thiết bị edge nhỏ chỉ có 4GB RAM, hãy sử dụng cờ --components để bỏ qua stack logging và tiết kiệm tài nguyên hệ thống.

Việc triển khai trong môi trường air-gap từng là một công việc cực nhọc tiêu tốn cả cuối tuần. Bằng cách áp dụng một công cụ khai báo như Zarf, bạn biến một quy trình thủ công, dễ sai sót thành một luồng công việc có thể lặp lại và được quản lý phiên bản. Lần tới khi bạn thấy mình trong phòng server yên tĩnh đó, bạn sẽ thấy may mắn vì mình có một tệp duy nhất thực sự chứa mọi thứ bạn cần.

Share: