
uffizzi/controller该应用连接Kubernetes (k8s)集群,代表Uffizzi用户配置预览部署工作负载。虽然它提供了文档化的REST API供任何人使用,但与开源uffizzi_app配合使用时价值最大。
Uffizzi是全栈预览引擎,使团队能在合并代码前轻松预览变更——无论是前端、后端还是微服务。使用基于Docker Compose的熟悉语法定义全栈应用,Uffizzi会在打开拉取请求或构建新镜像时创建按需测试环境。提交新代码时预览URL会更新,帮助团队及早发现问题、快速迭代并加速发布周期。
Uffizzi包含以下组件:
自托管Uffizzi还需以下外部依赖:
uffizzi_controller作为uffizzi_app的智能安全代理,旨在限制对k8s集群的必要访问。它接受来自其他Uffizzi组件的已认证指令,然后在集群控制API中指定资源。使用Golang实现,以利用官方支持的Kubernetes API客户端。
控制器作为uffizzi_app的支持服务,主要用途包括:
main()循环位于cmd/controller/controller.go,调用setup()并处理退出。初始化global设置和sentry日志,连接数据库,初始化Kubernetes客户端,启动HTTP服务器监听。internal/http/handlers.go处理,请求包含新部署的整数ID。internal/domain/deployment.go中的ApplyDeployment函数,执行以下步骤:
internal/kuber/client.go中的多个方法,为每个k8s资源(Namespace、Deployment、NetworkPolicy、Service等)创建Kubernetes规范,并逐个发布到集群。
state的data中。此控制器使用由以下流行开源控制器管理的自定义资源:
需在控制器管理的集群中安装这些组件。
可在credentials/variables.env中指定这些变量,供docker-compose和Makefile使用。部分变量在configs/settings.yml中有默认值。
ENV - 当前运行的部署环境,默认:developmentCONTROLLER_LOGIN - HTTP基本认证的用户名CONTROLLER_PASSWORD - HTTP基本认证的密码CONTROLLER_NAMESPACE_NAME_PREFIX - 命名空间前缀,默认:deploymentCERT_MANAGER_CLUSTER_ISSUER - 证书签名颁发者,可选值:
letsencrypt(默认)zerosslPOD_CIDR - NetworkPolicy中允许的IP范围,默认:10.24.0.0/14POOL_MACHINE_TOTAL_CPU_MILLICORES - 节点CPU资源(毫核),默认:2000POOL_MACHINE_TOTAL_MEMORY_BYTES - 节点内存资源(字节),默认:17179869184DEFAULT_AUTOSCALING_CPU_THRESHOLD - 默认CPU阈值,默认:75DEFAULT_AUTOSCALING_CPU_THRESHOLD_EPSILON - 默认CPU阈值容差,默认:8AUTOSCALING_MAX_PERFORMANCE_REPLICAS - 性能级水平Pod自动扩缩器最大副本数,默认:10AUTOSCALING_MIN_PERFORMANCE_REPLICAS - 性能级水平Pod自动扩缩器最小副本数,默认:1AUTOSCALING_MAX_ENTERPRISE_REPLICAS - 企业级水平Pod自动扩缩器最大副本数,默认:30AUTOSCALING_MIN_ENTERPRISE_REPLICAS - 企业级水平Pod自动扩缩器最小副本数,默认:3STARTUP_PROBE_DELAY_SECONDS - 启动探针延迟秒数,默认:10STARTUP_PROBE_FAILURE_THRESHOLD - 启动探针失败阈值,默认:80STARTUP_PROBE_PERIOD_SECONDS - 启动探针周期秒数,默认:15EPHEMERAL_STORAGE_COEFFICIENT - LimitRange配置系数,默认:1.9该进程需要在Kubernetes集群中提供Kubernetes服务账户。可通过以下四项配置模拟:
KUBERNETES_SERVICE_HOST - k8s API服务的主机名(或IP)KUBERNETES_SERVICE_PORT - k8s API服务的TCP端口(通常为443)KUBERNETES_NAMESPACE - 控制器和ingress-nginx所在的命名空间/var/run/secrets/kubernetes.io/serviceaccount/token - 认证令牌/var/run/secrets/kubernetes.io/serviceaccount/ca.crt - k8s API服务器的x509主机证书配置集群连接(使用kubectl等工具)后,可通过kubectl cluster-info输出获取前两个环境变量的值,并添加到credentials/variables.env。
认证令牌需从集群云提供商获取,例如:
gcloud config config-helper --format="value(credential.access_token)"
服务器证书也需从集群云提供商获取,例如:
gcloud container clusters describe uffizzi-pro-production-gke --zone us-central1-c --project uffizzi-pro-production-gke --format="value(masterAuth.clusterCaCertificate)" | base64 --decode
应将这两个值分别写入credentials/token和credentials/ca.crt,make命令和docker-compose会自动复制它们。
开发时,通常在工作站的shell中运行控制器。docker-compose会设置shell并将当前工作目录挂载到容器中,以便从外部使用编辑器。登录容器:
shellmake shell
以下命令需在该shell中运行。
修改代码后编译控制器:
shellgo install ./cmd/controller/...
shell/go/bin/controller
配置k8s集群访问后,可在shell中测试kubectl:
shellkubectl --token=`cat /var/run/secrets/kubernetes.io/serviceaccount/token` --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt get nodes
在docker shell中:
make test make lint make fix_lint
控制器在工作站运行后,可从shell外部发送HTTP请求。
shellcurl localhost:8080 \ --user "${CONTROLLER_LOGIN}:${CONTROLLER_PASSWORD}"
删除指定预览的命名空间及所有资源:
shellcurl -X POST localhost:8080/clean \ --user "${CONTROLLER_LOGIN}:${CONTROLLER_PASSWORD}" \ -H "Content-Type: application/json" \ -d '{ "environment_id": 1 }'
访问 http://localhost:8080/docs/
在Kubernetes集群中的功能使用超出本文档范围。更多信息可加入Slack或联系<***>。
提供了Kubernetes清单文件infrastructure/controller.yaml帮助入门。应用前请检查并修改相关变量,同时需安装和配置本文档开头提到的依赖项。



manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务