
谷歌云上用 Claude 搭建部署应用这句话拆开来看其实是两个问题Claude Code 这类 AI 辅助编程工具能不能在云端稳定运行以及基于 Claude API 的业务应用能不能被正确部署、对外提供服务。很多人把这两件事混在一起工具装完、跑通一个对话就以为部署完成了等到真正要做一个带接口、带缓存、能对外访问的服务时才发现链路里全是坑。这篇文章按一套完整的实操顺序来拆先讲适合云端部署的场景再讲谷歌云虚拟机准备、Claude Code 安装、示例应用部署最后用 Kubernetes 把应用和 Redis 一起编排起来。每一步都会写判断标准方便你照着验证自己的环境。1. 先判断这个主题的价值Claude 上云部署到底解决什么问题1.1 Claude Code 和 Claude API 是两件不同的事很多人第一次接触谷歌云上用 Claude 搭建部署应用时容易把两个概念混在一起。Claude Code 是 Anthropic 官方的命令行编程助手属于 Agent 型工具。它能在终端里读取项目文件、调用 Claude 模型帮你改代码、分析报错、生成新文件。简单说它是给你这个开发者用的写代码助手。Claude API 是模型推理接口。你的业务应用通过官方 SDK 或 HTTP 请求调用它把用户输入发给 Claude 模型拿到返回结果。简单说这是给业务产品用的推理能力。两者的关系是你可以在本地或服务器上用 Claude Code 辅助写代码然后把这个代码部署成线上服务。服务内部通过 Claude API 对外提供能力。我下面会按这条链路完整走一遍。1.2 什么样的场景才值得放到云端判断要不要上云核心标准不是云更高级而是看应用形态。本地开发适合这些情况一次性实验、学习调参、短任务、不需要公网访问、只有你自己用。本地跑 Claude Code 通常只需要一个终端和一个能访问 API 的网络环境。云端部署真正解决的是这几类问题服务要 7x24 小时运行不能依赖某台个人电脑是否开机。团队多人共用同一个环境需要在同一套依赖、同一份配置下协作。应用要对外提供接口需要固定的公网入口和稳定的网络带宽。后续要做扩容、回滚、监控本地环境很难闭环。定时任务、批处理任务需要脱离人工值守持续执行。对应到具体项目如果你只是想在谷歌云上装一个 Claude Code 终端环境或者想把一个 Claude 问答 Demo 变成正式产品下面这套流程都适用。有一点先说清楚Claude API 的推理是在 Anthropic 模型服务侧完成的不是在你自己的机器上跑模型。所以云端服务器不需要 GPU也没必要一上来就选很高的机型。普通 CPU 实例负责应用逻辑、网络 IO 和数据处理就够了。很多人在这里多花了成本。2. 谷歌云环境准备先把地基打稳2.1 账号、项目和区域选择在谷歌云上部署应用第一步不是急着开服务器而是把账号、项目、结算和区域确认好。你需要一个谷歌云账号并在控制台里创建一个项目。项目是资源隔离的单位后面创建的虚拟机、网络、存储都会挂在这个项目下面。创建项目后记下项目 ID后面很多命令行操作都要用到它。结算账户必须提前开通否则创建实例会直接失败。不开通也没关系谷歌云不一定第一时间扣费但没有有效结算账户VM 是拉不起来的。区域选择要注意几个点按用户所在地就近选区域延迟会更低。不同区域的实例价格有差异同等规格下成本可能差不少。同一个区域内的可用区可以换但区域基本定了就很难改迁移要重做镜像和网络配置。常见选择是 us-central1、asia-east1、asia-southeast1 这类主区域。如果你的用户主要在国内asia-east1 或 asia-southeast1 往返延迟通常更均衡。如果只是学习测试选哪个区域差别不大。我一般会先查一下该区域当前有哪些机型可用避免选了规格却提示资源不足。2.2 创建虚拟机实例创建虚拟机的方式有两种控制台点选或者用 gcloud 命令行。日常调试用控制台没问题但如果你后面要写脚本、做自动化建议从命令行开始。下面是一个通用创建命令示例gcloud compute instances create claude-dev \ --project你的项目ID \ --zoneus-central1-a \ --machine-typee2-standard-2 \ --image-familyubuntu-2204-lts \ --image-projectubuntu-os-cloud \ --boot-disk-size50GB \ --tagshttp-server参数含义拆开看claude-dev实例名称建议起得有意义后面 SSH 和资源查询都要用它。--zone可用区要和区域匹配不能乱写。--machine-type机器规格。e2 系列是通用入门型成本低适合跑 Claude Code 和轻量业务服务。--image-family操作系统镜像。Ubuntu 22.04 LTS 是常见选择软件源稳定社区资料多。--boot-disk-size系统盘大小。Claude Code 本身不大但 npm 依赖、Docker 镜像、日志会慢慢占空间50GB 起步比较稳妥。--tags网络标签。后面防火墙规则可以用这个标签批量放行端口。机型规格建议按这个级别选场景推荐规格说明只跑 Claude Code 终端调试e2-small2GB 内存以内够用但别跑重任务部署一个 Node/Python 应用e2-standard-22 vCPU 8GB 内存最常用应用里要跑 Redis、队列、批处理e2-standard-44 vCPU 16GB 内存留余量创建完成后确认一下状态gcloud compute instances list gcloud compute instances describe claude-dev --zoneus-central1-a状态字段是RUNNING才算创建成功。拿到外部 IP 后先不要急着对外暴露任何端口等应用就绪再配防火墙。2.3 SSH 登录与基础环境谷歌云有两种登录方式浏览器 SSH 和 gcloud 命令行 SSH。我习惯用命令行因为后面要执行长命令、传文件、改配置终端更顺手。gcloud compute ssh claude-dev --zoneus-central1-a首次登录会自动生成密钥并写入项目元数据。登录后先做三件事。第一更新软件源sudo apt update sudo apt upgrade -y第二安装基础工具sudo apt install -y curl git unzip jq第三确认磁盘和内存df -h free -h nprocdf -h看根分区空间free -h看内存nproc看 CPU 核数。这一步的意义是建立基线后面出问题时有参照。到这里谷歌云的基础环境才算落地。还没装任何 Claude 相关组件但系统的网络、账号、权限、磁盘都已经可用了。3. 安装 Claude Code 和运行环境3.1 安装 Node.js 与 Claude CodeClaude Code 是基于 Node.js 的命令行工具所以第一步先把 Node.js 装好。安装 Node.js 有几种方式。Ubuntu 自带的 apt 源里 Node 版本往往偏旧建议用 nvm 管理版本这样后续升级、切换版本都方便。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash注意这里的具体版本号要以 nvm 官方仓库的 release 为准直接用最新稳定版即可。安装完成后重新加载 shell 配置source ~/.bashrc nvm --version然后安装 Node.js LTSnvm install --lts node -v npm -v看到node -v输出版本号说明 Node 环境可用。接下来安装 Claude Codenpm install -g anthropic-ai/claude-code安装完成后验证claude --version如果提示command not found多半是 npm 全局目录没有加入 PATH。可以先执行npm bin -g看一下全局安装路径再把它加到~/.bashrc的 PATH 里。这里有个容易踩的坑不要在 root 用户下跑 Claude Code。官方客户端在 root 环境下会提示风险而且后续文件权限会变得很乱。普通用户安装、普通用户运行需要更高权限时单独用 sudo不要整个终端切换成 root。3.2 配置 API Key 与认证信息Claude Code 要正常调用模型必须配置认证信息。常见方式有两种。第一种是直接在 Anthropic 控制台创建 API Key然后设置环境变量export ANTHROPIC_API_KEY你的密钥为了让配置持久化把这一行追加到~/.bashrcecho export ANTHROPIC_API_KEY你的密钥 ~/.bashrc source ~/.bashrc第二种是通过claude命令自带的登录流程完成认证。如果服务器上无法打开浏览器就优先用 API Key 环境变量如果是在本地开发机可以直接走登录流程登录态会保存在本地。API Key 的安全边界一定要守住不要把 Key 写进代码仓库。不要在日志里打印 Key。不要用手机拍照发到群里。Key 一旦泄露在控制台立即吊销并重新生成。3.3 验证 Claude Code 可以正常调用安装完成后先跑一个最小测试claude进入交互界面后输入一句简单的话比如请用一句话解释什么是 DNS。能够正常返回并且没有 401、403 之类的认证错误就说明 Claude Code 安装成功。如果返回认证失败按这个顺序排查确认ANTHROPIC_API_KEY环境变量是否真的存在echo $ANTHROPIC_API_KEY。确认 Key 没有多余空格、换行或引号。确认账号有可用的模型访问权限和结算方式。确认服务器时间是否正确时间偏差会导致签名类认证失败。验证通过后Claude Code 就已经可以在云端使用了。你可以用它在这个服务器上辅助写代码、分析日志、处理项目文件。这是第一步但很多人走到这里就结束了接下来才是把应用真正部署上线。4. 部署一个完整的 Claude 应用4.1 一个最小可运行的项目结构假设我们要部署一个简单的 Claude 问答接口用户 POST 一段文本服务端调用 Claude API返回模型结果。这个项目用 Node.js 写原因很简单Claude 官方 SDK 对 Node 支持成熟Express 生态成熟后面容器化也比较顺。项目结构如下claude-app/ ├── package.json ├── server.js └── .env先初始化项目并安装依赖mkdir claude-app cd claude-app npm init -y npm install express anthropic-ai/sdk dotenvdotenv用来加载.env文件里的环境变量避免把密钥直接写死在代码里。4.2 后端服务调用 Claude API在server.js里写一个最简单的服务require(dotenv).config(); const express require(express); const Anthropic require(anthropic-ai/sdk); const app express(); app.use(express.json()); const anthropic new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY, }); app.post(/api/chat, async (req, res) { const question req.body.question; if (!question) { return res.status(400).json({ error: question is required }); } try { const message await anthropic.messages.create({ model: process.env.CLAUDE_MODEL, // 在 Anthropic 控制台确认当前可用模型 ID max_tokens: 1024, messages: [ { role: user, content: question } ] }); res.json({ answer: message.content }); } catch (err) { console.error(Claude API error:, err.message); res.status(500).json({ error: service error }); } }); const PORT process.env.PORT || 3000; app.listen(PORT, () { console.log(server listening on ${PORT}); });.env文件内容ANTHROPIC_API_KEY你的密钥 CLAUDE_MODEL你的模型ID PORT3000这段代码有几个关键点入参校验在最前面避免空请求打到模型上浪费调用。错误处理必须做Claude API 返回的错误要落到日志里而不是裸抛给前端。max_tokens控制单次返回的最大 token 数先设置 1024 足够测试。4.3 启动服务、开放防火墙和验证先本地启动node server.js然后开第二个终端用 curl 测试curl -X POST http://localhost:3000/api/chat \ -H Content-Type: application/json \ -d {question: 写一段 50 字的商品文案}能返回 JSON 结果说明应用逻辑没问题。此时外部还访问不了因为谷歌云默认防火墙只放行少量端口。需要创建防火墙规则gcloud compute firewall-rules create allow-app-http \ --allow tcp:3000 \ --target-tagshttp-server \ --descriptionAllow app port 3000这里--target-tagshttp-server要和创建实例时的--tags一致。创建后外部访问地址就是http://服务器公网IP:3000。再测一次curl -X POST http://你的公网IP:3000/api/chat \ -H Content-Type: application/json \ -d {question: 你好}能收到结果部署链路就通了。不过直接node server.js有一个问题终端关掉进程就没了。生产环境要用 systemd 托管让服务开机自启、崩溃自动拉起。创建一个 systemd 服务文件/etc/systemd/system/claude-app.service[Unit] DescriptionClaude App Afternetwork.target [Service] Userubuntu WorkingDirectory/home/ubuntu/claude-app ExecStart/usr/bin/node server.js Restartalways RestartSec3 EnvironmentFile/home/ubuntu/claude-app/.env [Install] WantedBymulti-user.target然后sudo systemctl daemon-reload sudo systemctl enable claude-app sudo systemctl start claude-app sudo systemctl status claude-app状态显示active (running)说明托管成功。这一步做完你的 Claude 应用已经能作为正式服务运行了。5. 进阶用 Kubernetes 部署 Claude 应用与 Redis5.1 为什么要搬到 Kubernetes如果你的应用只是自己测试或者并发量很低单机 systemd 完全够用。但到了下面这些阶段就要考虑 Kubernetes 了需要多副本水平扩容单机重启会让业务中断。需要滚动发布和快速回滚不能每次更新都登录服务器手动操作。需要让多个服务应用、Redis、队列在统一平台上管理。需要资源隔离和配额限制避免一个服务吃光整台机器。Kubernetes 的本质是声明式管理你把期望状态写进 YAML控制面负责让实际状态向期望状态收敛。对 Claude 应用来说这种模式很适合因为应用本身是无状态的状态可以外置到 Redis 或数据库。但有一个前提先把单机跑稳再上 K8s。不要在单机还没跑通时直接上集群否则排错链路会叠加好几层复杂因素。5.2 准备集群并部署 Redis在谷歌云上创建 Kubernetes 集群优先用 GKE 托管集群不用自己装控制面gcloud container clusters create app-cluster \ --zoneus-central1-a \ --num-nodes2 \ --machine-typee2-standard-2创建完成后获取集群凭据gcloud container clusters get-credentials app-cluster --zoneus-central1-a为什么要先部署 RedisClaude 应用在真实场景里有很多地方需要 Redis接口限流统计用户请求频率超过阈值直接拒绝。会话缓存同一个用户的上下文不需要重复传给模型减少 token 消耗。结果缓存相同请求在短时间内直接返回缓存不用反复调 API。Redis 部署本身很简单。先建一个命名空间再写 Deployment 和 Servicekubectl create namespace claude-appredis.yamlapiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: claude-app spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:7-alpine ports: - containerPort: 6379 --- apiVersion: v1 kind: Service metadata: name: redis namespace: claude-app spec: selector: app: redis ports: - port: 6379 targetPort: 6379这个 YAML 里有两个对象Deployment 负责保证一个 Redis Pod 持续运行Service 给 Pod 提供一个稳定的 DNS 名称其他服务可以通过redis.claude-app.svc访问。应用kubectl apply -f redis.yaml kubectl -n claude-app get pods kubectl -n claude-app logs deployment/redis验证 Redis 是否可用kubectl -n claude-app port-forward service/redis 6379:6379然后在另一个终端用 redis-cli 测试redis-cli -h 127.0.0.1 -p 6379 ping返回PONG说明 Redis 正常。5.3 构建镜像并部署应用应用要放进 K8s得先容器化。在之前的claude-app目录下写一个DockerfileFROM node:20-slim WORKDIR /app COPY package*.json ./ RUN npm ci --omitdev COPY . . EXPOSE 3000 CMD [node, server.js]构建镜像并推送到谷歌云镜像仓库gcloud auth configure-docker docker build -t gcr.io/你的项目ID/claude-app:latest . docker push gcr.io/你的项目ID/claude-app:latest注意这里的你的项目ID必须替换成真实项目 ID否则推送会报权限错误。密钥不要写进镜像用 Kubernetes Secret 管理。先创建 Secretkubectl -n claude-app create secret generic app-secret \ --from-literalANTHROPIC_API_KEY你的密钥 \ --from-literalCLAUDE_MODEL你的模型ID然后写应用的 Deployment 和 Servicedeployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: claude-app namespace: claude-app spec: replicas: 2 selector: matchLabels: app: claude-app template: metadata: labels: app: claude-app spec: containers: - name: claude-app image: gcr.io/你的项目ID/claude-app:latest ports: - containerPort: 3000 env: - name: ANTHROPIC_API_KEY valueFrom: secretKeyRef: name: app-secret key: ANTHROPIC_API_KEY - name: CLAUDE_MODEL valueFrom: secretKeyRef: name: app-secret key: CLAUDE_MODEL - name: REDIS_HOST value: redis resources: requests: cpu: 250m memory: 512Mi limits: cpu: 1 memory: 1Gi --- apiVersion: v1 kind: Service metadata: name: claude-app namespace: claude-app spec: selector: app: claude-app ports: - port: 80 targetPort: 3000这里resources的requests是 K8s 调度时保证分配的最低资源limits是运行时的上限。先给一个保守值避免 Pod 刚开始就抢满节点。应用kubectl apply -f deployment.yaml kubectl -n claude-app get pods kubectl -n claude-app logs deployment/claude-appPod 状态为Running且READY列是1/1或2/2说明应用起来了。本地验证一下服务kubectl -n claude-app port-forward service/claude-app 8080:80 curl -X POST http://127.0.0.1:8080/api/chat \ -H Content-Type: application/json \ -d {question: 你好}到这里K8s 内的应用已经能正常调用 Claude API。如果要对外提供服务还要配置 Ingress 或 Load Balancer。这一步会牵扯域名、证书、负载均衡配置属于生产化范畴。建议先确认 Pod、Service、Redis 全部正常再继续。6. 成本、资源与常见排查6.1 资源占用和成本怎么判断部署完成后最容易被忽略的是资源监控和成本控制。在单机上用这些命令看基础资源top free -h df -h在 Kubernetes 里用这些看 Pod 和节点kubectl top nodes kubectl top pods -n claude-app判断标准建议按下面几条走CPU 持续超过 80%说明应用逻辑可能有性能问题或者需要扩容副本。内存出现明显 swap 使用说明内存不足优先调大 requests 和 limits。磁盘持续增长优先看日志文件和镜像缓存而不是直接扩大磁盘。API 延迟变高先看是否发了太多 token再看网络区域最后才怀疑模型问题。成本方面谷歌云 VM 按小时计费Claude API 按 token 计费两者要分开看。成本控制有一个很实用的办法在谷歌云控制台设置预算和告警。预算设一个不心疼的数字比如每月 100 美元超过 50%、80%、100% 时发邮件提醒。这样至少不会出现月底账单吓一跳的情况。6.2 常见报错与排查顺序部署过程中遇到问题不要一上来就改代码。先按固定顺序排查现象 - 输入 - 环境 - 参数 - 工具本身。现象优先排查点command not found: claudenpm 全局路径是否加入 PATHNode 是否装好Claude Code 认证失败ANTHROPIC_API_KEY是否设置、是否有多余字符、账号权限API 返回 401密钥无效或过期重新生成API 返回 429触发限流降低并发增加重试退避API 返回 529 或超时模型服务端负载较高重试策略要写好应用能启动但外部访问不通防火墙规则、实例网络标签、服务监听地址Pod 状态CrashLoopBackOffkubectl logs看启动日志检查环境变量和启动命令Pod 无法连接 Redis检查 Service 名、命名空间、端口号是否匹配镜像拉取ImagePullBackOff镜像地址、项目 ID、推送凭据是否有效日志永远是最先看的东西。单机用journalctl -u claude-app或直接看应用日志文件K8s 里用kubectl logs。很多问题的答案都在日志的前几行而不是报错提示的最后一句话。6.3 生产化落地建议如果这套方案要真正长期运行下面这些点值得提前做。密钥管理不要只靠 Secret。更稳妥的做法是用谷歌云 Secret Manager 或云上密钥管理服务应用运行时从密钥服务读取避免密钥明文出现在任何 YAML 和命令历史里。Redis 不要一直用自建 Deployment 扛生产。自建 Redis 在 K8s 里维护成本不低节点故障、数据持久化、备份恢复都要自己处理。量不大时可以先用托管 Redis 服务成本可控稳定性更好。应用日志要集中收集。单机还能翻文件Pod 一旦重建日志就没了。把 stdout 日志接入云日志服务配合查询和告警排错效率会高很多。发布要小步走。不要一次性把所有副本全部更新先更新一个副本观察日志和错误率再滚动更新剩下副本。K8s 默认滚动策略已经帮了一部分忙但你自己的回滚和灰度策略要提前想好。不要把副本数盲目调大。每个副本都会持有到 Anthropic API 的连接和可能的限流配额。副本太多而 API 限流上限不变反而会造成大量 429 错误。扩容之前先确认上游 API 的并发承受能力。写在最后这条链路走下来核心收获不是某个命令多熟练而是每一步都有明确的验证标准环境准备好没有、Claude Code 能不能调用、单机服务通不通、K8s 里 Pod 正不正常、Redis 连不连得上。先把单机跑稳再上 K8s先把接口跑通再谈并发和灰度。踩过几次坑之后你会发现很多部署问题不是模型能力不够也不是工具不行而是环境变量、网络策略和资源边界没有提前理清楚。把这一层理顺Claude 相关应用在谷歌云上的部署其实是一条很清晰的工程链路。