跳到主要内容
版本:0.3.0-dev0

TFRCluster 部署

部署 TFRCluster 集群级基础设施。

概述

TFRCluster 是集群级资源,负责安装和管理以下基础设施:

  • Istio - 服务网格和 Ingress Gateway
  • CloudNativePG - PostgreSQL 数据库 Operator
  • MinIO - 对象存储 Operator
  • RabbitMQ - 消息队列 Operator
  • Cert-Manager - TLS 证书管理
重要

每个 Kubernetes 集群只需部署一个 TFRCluster。


配置说明

核心字段

字段说明示例
nameTFRCluster 资源名称staging-cluster
clusterType集群类型kind, docker-desktop, tke
operators基础设施 Operators见下文
clusterConfig网络和云厂商配置见下文
imageRegistries私有镜像仓库凭证见下文

Operators 配置

operators:
cnpg:
enabled: true # CloudNativePG (PostgreSQL)
minio:
enabled: true # MinIO (对象存储)
rabbitmq:
enabled: true # RabbitMQ (消息队列)
当前限制

三个 Operators 必须全部开启。未来版本将支持使用独立 VPC 管理的外部集群(如云厂商托管的 RDS、对象存储等)。

网络配置

根据集群类型选择网络模式:

本地开发(Kind / Docker Desktop):使用 NodePort

clusterType: kind
clusterConfig:
nodePort:
http: 30080
https: 30443

腾讯云 TKE:使用已有 CLB

clusterType: tke
clusterConfig:
tke:
clbId: "lb-xxxxxxxx"
annotationsKey: "service.kubernetes.io/tke-existed-lbid"
CLB 配置说明

TKE 环境下,需在腾讯云 CLB 控制台配置监听器:

  • HTTPS 443 → 后端 80(TLS 终止在 CLB)
  • HTTP 80 → 后端 80(可选)
  • 健康检查 → 后端 15021(自动配置)
CLB 集群绑定问题

如果重建 TKE 集群后复用已有的 CLB,可能会遇到错误:

ErrorCode: E4013
Details: The loadbalancer is used by other cluster.

原因:腾讯云 CLB 会被打上 tke-bindedLBs 等 Tag 记录所属集群 ID。删除旧集群时,TKE 不会自动清理 CLB 上的这些 Tag,导致新集群无法绑定。

解决方案

  1. 在 CLB 控制台 → 基本信息标签 中,删除指向旧集群的 Tag(如 tke-bindedLBstke-bindedService 等)
  2. 或在 CLB 控制台 → 监听器管理 中,删除旧集群残留的后端服务配置
  3. 清理后,删除 istio-ingress Service 触发重新绑定,或重新部署 TFRCluster

私有镜像凭证(可选)

imageRegistries:
- secretName: "tfrs-private-registry"
url: "docker.cnb.cool"
username: "cnb"
# password 通过 --set 传递,不要写在配置文件中
说明

imageRegistries 不是给 TFRCluster 中间件用的(它们使用公共镜像),而是为后续 TFRTenant/TFRServer 部署的应用组件准备镜像拉取凭证。凭证会创建到 tfr-image-credentials 命名空间,供所有租户共享。


示例配置

项目提供基于腾讯云 TKE 的示例配置:

  • chart/tfrcluster/values-staging.yaml - Staging 环境
  • chart/tfrcluster/values-prod.yaml - Production 环境
其他云厂商

示例配置针对腾讯云 TKE。部署到其他云平台(AWS EKS、阿里云 ACK 等)需要调整网络配置。


Kustomize 部署

创建 CR 清单

# tfrcluster-staging.yaml
apiVersion: infra.tfrobotserver.cn/v1
kind: TFRCluster
metadata:
name: staging-cluster
spec:
clusterType: tke

ingress:
hosts:
- "*"
gatewayRef:
namespace: istio-ingress
name: default-gateway

operators:
cnpg:
enabled: true
minio:
enabled: true
rabbitmq:
enabled: true

clusterConfig:
tke:
clbId: "lb-xxxxxxxx"
annotationsKey: "service.kubernetes.io/tke-existed-lbid"
istio:
accessLog:
enabled: true
format: "TEXT"
providers:
- "envoy"

部署

kubectl apply -f tfrcluster-staging.yaml
# tfrcluster.infra.tfrobotserver.cn/staging-cluster created

验证

kubectl get tfrcluster
# NAME AGE
# staging-cluster 2m

# 查看组件状态
kubectl get tfrcluster staging-cluster -o jsonpath='{.status.components}' | jq

判断部署完成

TFRCluster 通过 status.conditions 中的 Available 条件标识部署状态:

实时监控部署进度

while true; do clear; echo "--- $(date +%H:%M:%S) ---"; \
echo "=== Conditions ==="; \
kubectl get tfrcluster staging-cluster -o json 2>/dev/null \
| jq -r '.status.conditions[]? | "\(.type): \(.status) - \(.message)"'; \
echo; echo "=== Components ==="; \
kubectl get tfrcluster staging-cluster -o json 2>/dev/null \
| jq -r '.status.components // {} | to_entries[] | "\(.key): \(.value.state)"'; \
sleep 5; done

Ctrl+C 退出。

# 查看 Available 条件
kubectl get tfrcluster staging-cluster -o jsonpath='{.status.conditions[?(@.type=="Available")].status}'
# True = 部署完成,False = 部署中或失败

# 自动化脚本:等待部署完成(超时 10 分钟)
kubectl wait tfrcluster staging-cluster --for=condition=Available --timeout=600s

卸载

kubectl delete tfrcluster staging-cluster

Helm 部署

部署

从 OCI 仓库安装

helm install tfrcluster oci://helm.cnb.cool/turingfocus/tfrs-operator/tfrcluster \
--version 0.1.0 \
--namespace tfrs-infra \
--create-namespace \
--set name=staging-cluster \
--set clusterType=tke \
--set 'clusterConfig.tke.clbId=lb-xxxxxxxx' \
--set 'clusterConfig.istio.accessLog.enabled=true'

使用 values 文件安装

helm install tfrcluster oci://helm.cnb.cool/turingfocus/tfrs-operator/tfrcluster \
--version 0.1.0 \
--namespace tfrs-infra \
--create-namespace \
-f values-staging.yaml \
--set 'imageRegistries[0].password=<PASSWORD>'

从本地源码安装

helm install tfrcluster ./chart/tfrcluster \
--namespace tfrs-infra \
--create-namespace \
-f chart/tfrcluster/values-staging.yaml \
--set 'imageRegistries[0].password=<PASSWORD>'

验证

# 查看 TFRCluster 状态
kubectl get tfrcluster

# 等待部署完成(超时 10 分钟)
kubectl wait tfrcluster staging-cluster --for=condition=Available --timeout=600s

# 查看安装的 Operators
kubectl get pods -n cnpg-system
kubectl get pods -n minio-operator
kubectl get pods -n rabbitmq-system
kubectl get pods -n istio-system
kubectl get pods -n cert-manager

判断部署完成

TFRCluster 通过 status.conditions 中的 Available 条件标识部署状态:

实时监控部署进度

while true; do clear; echo "--- $(date +%H:%M:%S) ---"; \
echo "=== Conditions ==="; \
kubectl get tfrcluster staging-cluster -o json 2>/dev/null \
| jq -r '.status.conditions[]? | "\(.type): \(.status) - \(.message)"'; \
echo; echo "=== Components ==="; \
kubectl get tfrcluster staging-cluster -o json 2>/dev/null \
| jq -r '.status.components // {} | to_entries[] | "\(.key): \(.value.state)"'; \
sleep 5; done

Ctrl+C 退出。

# 查看 Available 条件
kubectl get tfrcluster staging-cluster -o jsonpath='{.status.conditions[?(@.type=="Available")].status}'
# True = 部署完成,False = 部署中或失败

# 自动化脚本:等待部署完成(超时 10 分钟)
kubectl wait tfrcluster staging-cluster --for=condition=Available --timeout=600s

卸载

helm uninstall tfrcluster -n tfrs-infra
注意

卸载 TFRCluster 会删除所有基础设施组件。确保已先删除所有 TFRTenant 和 TFRServer 资源。