在Kubernetes环境中,FastAPI微服务通常以容器方式运行,但若GitOps流程中缺少Argo CD Application对象,控制器便无法感知并协调期望状态,持续交付会直接瘫痪。Argo CD Application声明了源仓库、目标集群和命名空间,是连接代码与运行环境的“最后一公里”。以下通过一个完整示例,拆解构建、推送、部署三个关键环节。 ## 一、Argo CD Application:GitOps的入口 没有Application对象,即使镜像已推送到仓库,Argo CD也不会自动同步。一个最小的Application清单需要指定仓库地址、目标集群和路径。随后Argo CD会周期性对比Git中的期望状态与集群实际状态,发现偏差即自动修复,或触发人工审批。这一步通常放在独立的`applications`目录中,与业务代码分离。 ## 二、Dockerfile:从源码构建不可变镜像 镜像必须包含FastAPI代码、第三方依赖和ASGI服务器。直接从源码构建可以保证每个环境拿到的工件完全一致,避免“在我机器上能跑”的版本漂移问题。以下Dockerfile基于Python 3.11-slim,并创建非root用户以提升安全性: ```dockerfile # Dockerfile FROM python:3.11-slim # Install build dependencies RUN apt-get update && apt-get install -y --no-install-recommends gcc && rm -rf /var/lib/apt/lists/* # Create a non-root user RUN useradd -m appuser WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Copy application code COPY ./app ./app # Switch to non-root user USER appuser # Expose the port used by uvicorn EXPOSE 8000 # Run the ASGI server CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] ``` 每条指令都有明确目的:先装编译依赖,再创建用户,随后复制依赖清单并安装,最后以非root身份启动服务。这样构建出的镜像层缓存更高效,且避免了容器内以root运行的潜在风险。 ## 三、构建并推送镜像 执行以下命令即可生成带标签的镜像: ```bash $ docker build -t ghcr.io/example/fastapi:latest . Sending build context to Docker daemon 45.6MB Step 1/12: FROM python:3.11-slim --> 1a2b3c4d5e6f ... Successfully built 9f8e7d6c5b4a Successfully tagged ghcr.io/example/fastapi:latest ``` 输出中的`Successfully tagged`表明镜像已按要求命名。之后需要推送镜像到仓库,Argo CD才能在部署阶段拉取

打开网易新闻 查看精彩图片