
⚙️ Dễ dàng tạo tệp kê khai ứng dụng Argo CD YAML cho các dịch vụ vi mô FastAPI
🏗 Tệp kê khai ứng dụng — Tại sao lại quan trọng Một dịch vụ vi mô FastAPI thường chạy bên trong một vùng chứa (container), nhưng nếu không có đối tượng ứng dụng Argo CD, bộ điều khiển GitOps không thể điều hòa trạng thái mong muốn. Tệp kê khai dưới đây xác định kho lưu trữ nguồn, cụm đích và không gian tên, cho phép phân phối liên tục cho dịch vụ. 📑 Mục lục 🏗 Tệp kê khai ứng dụng — Tại sao lại quan trọng 📦 Hình ảnh và bản dựng vùng chứa — Cách đóng gói 🐍 Lệnh Docker Build ⚙️ Tài nguyên Kubernetes — Xác định triển khai và dịch vụ 🚀 Chi tiết triển khai 🌐 Tiếp xúc dịch vụ 🔗 Cài đặt đồng bộ hóa Argo CD — Điều khiển
🏗 Tệp kê khai ứng dụng — Tại sao nó quan trọng
Một microservice FastAPI thường chạy bên trong một container, nhưng nếu không có đối tượng Argo CD Application, bộ điều khiển GitOps không thể điều hòa trạng thái mong muốn. Tệp kê khai dưới đây định nghĩa kho lưu trữ nguồn, cụm đích và không gian tên, cho phép phân phối liên tục cho dịch vụ.
📑 Mục lục
🏗 Tệp kê khai ứng dụng — Tại sao nó quan trọng
📦 Hình ảnh container & Xây dựng — Cách đóng gói
🐍 Lệnh Docker Build
⚙️ Tài nguyên Kubernetes — Định nghĩa triển khai và dịch vụ
🚀 Chi tiết triển khai
🌐 Tiếp xúc dịch vụ
🔗 Cài đặt đồng bộ Argo CD — Kiểm soát hành vi đồng bộ
🟩 Suy nghĩ cuối cùng
❓ Câu hỏi thường gặp
Làm cách nào để đưa dịch vụ FastAPI ra internet?
Tôi có thể sử dụng Helm thay vì YAML thô cho các tệp kê khai không?
Điều gì sẽ xảy ra nếu tôi cần thay đổi thẻ hình ảnh container mà không cần cập nhật toàn bộ kho lưu trữ?
📚 Tài liệu tham khảo & Đọc thêm
📦 Hình ảnh container & Xây dựng — Cách đóng gói
Một hình ảnh Docker đóng gói mã FastAPI, các phụ thuộc của nó và máy chủ ASGI. Xây dựng hình ảnh từ nguồn đảm bảo rằng mọi môi trường đều nhận được cùng một tạo phẩm, loại bỏ sự trôi lệch phiên bản.
# Dockerfile
FROM python:3.11-slim # Cài đặt các phụ thuộc xây dựng
RUN apt-get update && apt-get install -y -no-install-recommends gcc && rm -rf /var/lib/apt/lists/* # Tạo người dùng không phải root
RUN useradd -m appuser
WORKDIR /app
COPY requirements.txt .
RUN pip install -no-cache-dir -r requirements.txt # Sao chép mã ứng dụng
COPY ./app ./app # Chuyển sang người dùng không phải root
USER appuser # Mở cổng được sử dụng bởi uvicorn
EXPOSE 8000 # Chạy máy chủ ASGI
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
Điều này làm gì:
FROM python:3.11-slim: cung cấp một cơ sở tối thiểu với trình thông dịch chính xác.
RUN apt-get … gcc: cài đặt một trình biên dịch cần thiết cho các bánh xe yêu cầu tiện ích mở rộng gốc.
RUN useradd …: tạo một người dùng không phải root để cải thiện bảo mật container.
COPY requirements.txt & pip install: phân lớp các phụ thuộc riêng biệt với mã nguồn để bộ nhớ đệm tốt hơn.
COPY ./app: sao chép gói FastAPI vào hình ảnh.
EXPOSE 8000: khai báo cổng được mong đợi bởi Dịch vụ.
CMD uvicorn …: khởi động ứng dụng với máy chủ ASGI.
Xây dựng từ nguồn đảm bảo rằng phiên bản mã chính xác được đóng gói và bước xây dựng có thể được kiểm tra để tuân thủ bảo mật.
🐍 Lệnh Docker Build
$ docker build -t ghcr.io/example/fastapi:latest .
Đang gửi ngữ cảnh xây dựng đến Docker daemon 45.6MB
Bước 1/12: FROM python:3.11-slim --> 1a2b3c4d5e6f
...
Đã xây dựng thành công 9f8e7d6c5b4a
Đã gắn thẻ thành công ghcr.io/example/fastapi:latest
Đầu ra xác nhận rằng Docker đã tạo hình ảnh và gắn thẻ nó để đẩy sau này.
⚙️ Tài nguyên Kubernetes — Định nghĩa triển khai và dịch vụ
Triển khai quản lý vòng đời pod; Dịch vụ cung cấp mạng ổn định. Cùng nhau, chúng đảm bảo microservice FastAPI mở rộng quy mô và vẫn có thể truy cập được trong cụm.
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: fastapi-deployment labels: app: fastapi
spec: replicas: 3 selector: matchLabels: app: fastapi template: metadata: labels: app: fastapi spec: containers: - name: fastapi image: ghcr.io/example/fastapi:latest ports: - containerPort: 8000 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi"
Điều này làm gì:
replicas: 3: tạo ba pod giống hệt nhau để phân phối tải.
selector.matchLabels: liên kết Triển khai với các pod có cùng nhãn.
containers.image: tham chiếu đến Docker image đã được xây dựng trước đó.
resources.requests/limits: thông báo cho bộ lập lịch về kỳ vọng CPU/bộ nhớ, cho phép thực thi QoS.
Điểm chính: Các triển khai (Deployment) bao gồm một vòng lặp điều khiển tự phục hồi; nếu một pod gặp sự cố, bộ điều khiển sẽ tự động tạo một pod thay thế.
🚀 Chi tiết triển khai
Xác minh triển khai:
$ kubectl get deployment fastapi-deployment -n fastapi-prod
NAME READY UP-TO-DATE AVAILABLE AGE
fastapi-deployment 3/3 3 3 2m
🌐 Tiếp xúc dịch vụ
# service.yaml
apiVersion: v1
kind: Service
metadata: name: fastapi-service labels: app: fastapi
spec: selector: app: fastapi ports: - protocol: TCP port: 80 targetPort: 8000 type: ClusterIP
Chức năng:
type: ClusterIP: tạo một bộ cân bằng tải nội bộ chỉ có thể truy cập được bên trong cụm.
port 80 → targetPort 8000: ánh xạ lưu lượng HTTP bên ngoài đến cổng container FastAPI.
selector.app: liên kết Dịch vụ (Service) với các pod được tạo bởi Triển khai (Deployment).
Một Dịch vụ LoadBalancer sẽ phát sinh thêm chi phí đám mây và bỏ qua bộ điều khiển Ingress thực hiện chấm dứt TLS. (Đọc thêm: ⚙️ Dễ dàng thiết lập Kubernetes HPA cho ứng dụng FastAPI)
Kiểm tra Dịch vụ:
$ kubectl get svc fastapi-service -n fastapi-prod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
fastapi-service ClusterIP 10.96.12.34 80/TCP 1m
🔗 Cài đặt đồng bộ Argo CD — Kiểm soát hành vi đồng bộ
Các chính sách đồng bộ hóa quy định cách Argo CD áp dụng các thay đổi từ Git vào cụm. Một syncPolicy được điều chỉnh tốt sẽ giảm thiểu sự sai lệch đồng thời tránh khởi động lại không cần thiết.
# application-sync.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata: name: fastapi-app
spec: syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true - PruneLast=true retry: limit: 5 backoff: duration: 5s factor: 2 maxDuration: 3m
Chức năng:
prune: true: loại bỏ các tài nguyên không còn được định nghĩa trong Git.
selfHeal: true: phát hiện các thay đổi ngoài luồng và khôi phục trạng thái đã khai báo.
syncOptions.CreateNamespace=true: tự động tạo không gian tên đích trong lần đồng bộ đầu tiên.
retry.limit & backoff: triển khai cơ chế lùi lũy thừa (exponential back-off) cho các lỗi tạm thời.
Theo tài liệu của Argo CD, việc bật selfHeal là khuyến nghị mặc định cho các khối lượng công việc sản xuất vì nó đảm bảo rằng các chỉnh sửa thủ công không tồn tại ngoài ý muốn.
Kích hoạt đồng bộ thủ công để xem chính sách hoạt động:
$ argocd app sync fastapi-app
SYNCING: fastapi-app
STATUS: Synced
Điểm chính: Đồng bộ tự động với tính năng cắt tỉa (pruning) và tự phục hồi (self-heal) giúp cụm luôn được căn chỉnh một cách khai báo.
Nguồn tin: Dev.to Machine Learning — Tác giả: Python-T Point. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.