TFRCluster 部署
部署 TFRCluster 集群级基础设施。
概述
TFRCluster 是集群级资源,负责安装和管理以下基础设施:
- Istio - 服务网格和 Ingress Gateway
- CloudNativePG - PostgreSQL 数据库 Operator
- MinIO - 对象存储 Operator
- RabbitMQ - 消息队列 Operator
- Cert-Manager - TLS 证书管理
每个 Kubernetes 集群只需部署一个 TFRCluster。
配置说明
核心字段
| 字段 | 说明 | 示例 |
|---|---|---|
name | TFRCluster 资源名称 | 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"
TKE 环境下,需在腾讯云 CLB 控制台配置监听器:
- HTTPS 443 → 后端 80(TLS 终止在 CLB)
- HTTP 80 → 后端 80(可选)
- 健康检查 → 后端 15021(自动配置)
如果重建 TKE 集群后复用已有的 CLB,可能会遇到错误:
ErrorCode: E4013
Details: The loadbalancer is used by other cluster.
原因:腾讯云 CLB 会被打上 tke-bindedLBs 等 Tag 记录所属集群 ID。删除旧集群时,TKE 不会自动清理 CLB 上的这些 Tag,导致新集群无法绑定。
解决方案:
- 在 CLB 控制台 → 基本信息 → 标签 中,删除指向旧集群的 Tag(如
tke-bindedLBs、tke-bindedService等) - 或在 CLB 控制台 → 监听器管理 中,删除旧集群残留的后端服务配置
- 清理后,删除 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 资源。