メインコンテンツへスキップ
Cartesia はインフラとアプリケーションの両方をデプロイする Terraform 構成を提供しています。既存のクラスタに Helm チャートを直接デプロイすることもできます。
完全な構成は、デプロイ時に Cartesia の担当者から提供されます。

Terraform でのデプロイ

Terraform はクラスタ、ネットワーキング、GPU ドライバーを作成し、Helm 経由で Cartesia をデプロイします。 Cartesia のセルフホストを最も早く始められる方法です。
cartesia-kube を cartesia-kube のダウンロード の説明に従って GCS バケットからダウンロードしてください。
# Download and extract cartesia-kube from GCS (see Downloading cartesia-kube guide)
cd cartesia-kube

# Copy example config for your platform
cp aws-terraform.tfvars.example aws-terraform.tfvars  # or gcp-terraform.tfvars.example

# Deploy from the platform directory
cd infra/aws/cartesia-eks  # or infra/gcp/cartesia-gke
terraform init
terraform apply -var-file="../../../aws-terraform.tfvars" \
                -var "cartesia_api_key=$CARTESIA_API_KEY" \
                -var "service_account_json=$(cat /path/to/service-account.json)"

設定

region = "us-west-2"
name = "cartesia-production"

eks_admin_users = ["arn:aws:iam::123456789:user/admin"]

node_groups = {
  default = {
    ami_type = "AL2023_x86_64_STANDARD"
    instance_types = ["m7a.4xlarge"]
    min_size = 1
    max_size = 3
    desired_size = 1
  }
  gpu = {
    ami_type = "AL2023_x86_64_NVIDIA"
    instance_types = ["g5.2xlarge", "g5.4xlarge"]
    min_size = 1
    max_size = 5
    desired_size = 2
    disk_size = 100
    labels = { "nvidia.com/gpu.present" = "true" }
  }
}

# Ingress (optional)
enable_ingress = true
ingress_route = "api.cartesia.yourdomain.com"
certificate_arn = "arn:aws:acm:us-west-2:123456789:certificate/abc123"

# Hot reload (enabled by default)
enable_hot_reload = true
ホットリロードや、デプロイメントへのボイスや発音辞書の追加については アーティファクトの管理 を参照してください。

ワーカーの設定

ワーカーは tfvars ファイル内で定義されます:
workers = [
  {
    name = "tts-worker"
    workerArgs = {
      model = "<model-name>"
      image = "cartesia-sonic-<model-name>"
      gpuType = "nvidia.com/gpu"
      capacity = 4
      operation = "TTS"
      useCB = true
      useLora = false
    }
    autoscaling = {
      enabled = true
      threshold = 0.6
      minReplicas = 1
      maxReplicas = 10
    }
  }
]
すべてのモデルワーカーは、cartesia-sonic- プレフィックスに具体的なモデル名を続けた名前のイメージを使用します。たとえば、sonic-3 は cartesia-sonic-rosy-dragon を使用します。

Helm のみでのデプロイ

既存の Kubernetes クラスタに対しては、Helm チャートを直接デプロイします。

1. 前提条件のインストール

オートスケーリングとメトリクスを使用する場合は、先に KEDA と Prometheus をインストールします:
# Prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace

# KEDA
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda \
  --namespace keda \
  --create-namespace

2. シークレットの作成

kubectl create namespace cartesia

kubectl create secret docker-registry gar-pull-secret \
  --namespace cartesia \
  --docker-server=us-docker.pkg.dev \
  --docker-username=_json_key \
  --docker-password="$(cat /path/to/service-account.json)"

kubectl create secret generic api-key-secret \
  --namespace cartesia \
  --from-literal=CONTAINER_KEY="$CARTESIA_API_KEY" \
  --from-literal=CARTESIA_API_KEY="$CARTESIA_API_KEY" \
  --from-literal=OPENAI_API_KEY="$OPENAI_API_KEY" \
  --from-literal=ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY"

kubectl create secret generic gcs-access-secret \
  --namespace cartesia \
  --from-file=service-account.json=/path/to/service-account.json

3. values.yaml の設定

clusterName: cartesia-production

infra:
  provider: gcp  # or aws
  authenticate: true
  imageRegistry: us-docker.pkg.dev/cartesia-external/self-serve
  imagePullSecret: gar-pull-secret
  gcsSecretName: gar-pull-secret
  serviceAccount: cartesia-image-sa

release:
  version: "1.0.0"
  releaseTag: "sonic-20251118"

filesystem:
  storageClass:
    name: standard-rwo

ingress:
  enabled: true
  routes:
    - api.cartesia.yourdomain.com
  globalStaticIpName: cartesia-ingress-ip  # GKE only

metrics:
  enabled: true

legacyComponents:
  enabled: false

workers:
  - name: tts-worker
    workerArgs:
      model: <model-name>
      image: cartesia-sonic-<model-name>
      gpuType: nvidia.com/gpu
      capacity: 4
      operation: TTS
      useCB: true
      useLora: false
    autoscaling:
      enabled: true
      threshold: "0.6"
      minReplicas: 1
      maxReplicas: 10

4. デプロイ

cd cartesia-kube/cartesia
helm upgrade --install cartesia . \
  --values values.yaml \
  --namespace cartesia

検証

トラフィックを流す前に、デプロイメントが正常であることを確認します。以下のコマンドは、これまでの例で使用したデフォルトの cartesia namespace とリリース名を前提としています。カスタマイズしている場合は適宜置き換えてください。

ロールアウトの監視

kubectl rollout status deployment/cartesia-api -n cartesia
kubectl rollout status deployment/<worker-name> -n cartesia
ワーカー Pod は GPU メモリへのモデルロードがあるため、API より時間がかかります。inferno_worker_capacity > 0 になるまで、ワーカーは Running のままで Ready にはなりません。

Pod が Ready

kubectl get pods -n cartesia
すべての Pod が Running で、すべてのコンテナが Ready になっているはずです。プローブの挙動:
  • API Pod の Ready 化: GET /status がポート 5000 で 200 を返した時点。
  • ワーカー Pod の Ready 化: startup probe が満たされたとき — /metrics をポーリングし、inferno_worker_capacity が 0 より大きい値を報告するまで待ちます。モデルロード中は Running だが Ready ではない状態になります。
  • License-proxy と NATS: チャート定義のヘルスプローブがなく、コンテナ起動直後に Ready になります。

Ingress のアドレスが割り当てられている

kubectl get ingress -n cartesia
ADDRESS 列がロードバランサーのホスト名または IP で埋まっているはずです。 GKE では ManagedCertificate のステータスも確認します — チャートがリソースを作成し、GCP は DNS 検証後に非同期で証明書をプロビジョニングします:
kubectl describe managedcertificate cartesia-ssl-cert -n cartesia
Status: Active を確認してください。GCP がプロビジョニング中の間、Ingress への HTTPS コールは証明書検証に失敗します。

メトリクススクレイプが動作している(オプション)

クラスタに Prometheus がインストールされている場合(通常は kube-prometheus-stack 経由)、チャートの PodMonitorcartesia-monitor)は release: prometheus ラベルを通じて自動検出されます。Prometheus UI をポートフォワードして、各コンポーネントがスクレイプされていることを確認します:
kubectl port-forward -n monitoring svc/prometheus-operated 9090:9090
その後 http://localhost:9090 にアクセスして up{namespace="cartesia"} をクエリすると、すべてのコンポーネント Pod が 1 を返すはずです。 検証後は、機能スモークテストとパフォーマンスベンチマークについて スモークテストとベンチマーク を参照してください。

Ingress と TLS

チャートは Kubernetes の Ingress リソースを通じて Cartesia API を外部に公開します。AWS EKS または GCP GKE 向けに Ingress を構成しアノテーションを付与します。他の Kubernetes ディストリビューション(AKS、OpenShift、Rancher、kubeadm)では、チャートの ingress を無効化して独自のものを作成してください。お使いのプラットフォームを以下から選択してください。
チャートは AWS Load Balancer Controller(ALB)向けに Ingress を構成します。主な挙動:
  • TLS 終端: TLS は ALB で終端し、最小 TLS 1.2 です(ssl-policy: ELBSecurityPolicy-TLS-1-2-2017-01)。
  • バックエンド側: ALB と API Pod 間のトラフィックは平文の HTTP です(backend-protocol: HTTP)。エンドツーエンドの TLS については support@cartesia.ai までお問い合わせください。
  • 証明書: Terraform(certificate_arn)または Helm(ingress.certificateArn)で ACM ARN を明示的に渡してください。未設定の場合、チャートの certificate-manager: 'true' アノテーションにより AWS Load Balancer Controller がホスト名に一致する ACM 証明書を検索します。
  • HTTP リダイレクト: ポート 80 上の HTTP トラフィックはポート 443 の HTTPS にリダイレクトされます。
enable_ingress  = true
ingress_route   = "api.cartesia.yourdomain.com"
certificate_arn = "arn:aws:acm:us-west-2:123456789:certificate/abc123"
チャートが Ingress に適用するアノテーションの全セットは cartesia/templates/resources/ingress.yaml を参照してください。

オートスケーリング

Cartesia は Kubernetes デプロイメントに対して 2 レベルのオートスケーリングをサポートします。

Cluster Autoscaler

Pending Pod に基づいてノードをスケールします。tfvars で有効化:
enable_cluster_autoscaler = true
ノードグループ/プールは、リソース不足で Pod がスケジュールできない場合、構成された min_sizemax_size の範囲内でスケールします。

Pod Autoscaler (KEDA)

ロードメトリクスに基づいてワーカー Pod をスケールします。tfvars で有効化:
enable_pod_autoscaler = true
enable_metrics = true  # Required for KEDA
KEDA は 2 つのスケーリングトリガーを使用します:
  • キューの深さ — 処理不能なリクエストが蓄積したときにスケール
  • ワーカーロード — GPU 使用率がしきい値を超えたときにスケール

ワーカーごとのスケーリング

各ワーカーは個別のスケーリング構成を持てます:
workers = [
  {
    name = "tts-worker"
    workerArgs = { ... }
    autoscaling = {
      enabled = true
      threshold = 0.6      # Scale up when load > 60%
      minReplicas = 1
      maxReplicas = 10
    }
  }
]
または Helm の values.yaml で:
workers:
  - name: tts-worker
    workerArgs: { ... }
    autoscaling:
      enabled: true
      threshold: "0.6"
      minReplicas: 1
      maxReplicas: 10

スケーリングの挙動

  • スケールアップ: 30 秒の安定化ウィンドウ
  • スケールダウン: フラッピングを避けるため 900 秒(15 分)の安定化ウィンドウ
  • ワーカーは個々の負荷に基づいて独立してスケール

本番公開チェックリスト

本番トラフィックを開放する前の最終レビュー:
  • すべての Pod が Running かつ Ready、すべてのイメージが対象リリースタグであること — 検証 を参照。
  • Ingress が FQDN 上で HTTPS を介して到達可能であること — 検証 を参照。
  • TLS 証明書がアクティブであること(EKS では ACM 証明書がアタッチ済み、GKE では ManagedCertificate が Active、セルフマネージドでは BYO 証明書がマウント済み) — Ingress と TLS を参照。
  • スモークテストがパスすること — スモークテストとベンチマーク を参照。
  • ベンチマーク結果がデプロイした GPU の期待範囲内であること — GPU ごとのパフォーマンス を参照。
  • メトリクススクレイプが動作していること(Prometheus をインストールしている場合) — 検証 を参照。
  • ファイアウォールとネットワークポリシーがデプロイしたポスチャーと一致すること — アウトバウンド egress (Connected モード) を参照。
  • (エアギャップのみ)ライセンスがロードされ、オフライン運用が確認できていること — エアギャップデプロイメント を参照。
  • オンコールのランブックに アップグレードとロールバック のロールバック手順がドキュメント化されていること。