- Review Apps
- Review Apps
- How does it work?
- QA runs
- Performance Metrics
- Cluster configuration
- How to
- Diagnosing unhealthy Review App releases
- Release failed with
ImagePullBackOff
- Node count is always increasing (i.e. never stabilizing or decreasing)
- p99 CPU utilization is at 100% for most of the nodes and/or many components
- The
logging/user/events/FailedMount
chart is going up - Using K9s
- Troubleshoot a pending
dns-gitlab-review-app-external-dns
Deployment
- Release failed with
- Frequently Asked Questions
- Other resources
Review Apps
原文:https://docs.gitlab.com/ee/development/testing_guide/review_apps.html
- How does it work?
- QA runs
- Performance Metrics
- Cluster configuration
- How to
- Diagnosing unhealthy Review App releases
- Release failed with
ImagePullBackOff
- Node count is always increasing (i.e. never stabilizing or decreasing)
- p99 CPU utilization is at 100% for most of the nodes and/or many components
- The
logging/user/events/FailedMount
chart is going up - Using K9s
- Troubleshoot a pending
dns-gitlab-review-app-external-dns
Deployment
- Release failed with
- Frequently Asked Questions
- Other resources
Review Apps
Review Apps 由管道自动部署.
How does it work?
CI/CD architecture diagram
图 TD A [“ build-qa-image,编译生产资产
(仅适用于规范的默认参考)”]; B [review-build-cng]; C [review-deploy]; D [CNG-mirror]; E [review-qa-smoke]; A-> |一旦准备阶段已完成| BB -.-> |触发 CNG 镜像管道并等待其完成| DD -.-> |轮询直到完成| BB-> |一旦完成
view-build-cng工作完成| CC-> |完成"审查-部署"工作| E 子图" 1\. gitlab
preparestage"结束子图" 2\. gitlab
review-prepare阶段" B 结束子图" 3\. gitlab
review` stage” C [“ review-deploy
Helm 使用云部署 Review App 由 CNG 镜像管道构建的本机映像.
Cloud Native 映像已部署到” review-apps”
Kubernetes(GKE)集群,位于 GCPgitlab-review-apps
项目中.”]结束子图” 4. gitlabqa
stage” E [review-qa-smoke
gitlab-qa 对 Review App 运行冒烟套件.]结束子图” CNG 镜像管道” D>构建了 Cloud Native 图像]; 结束
Detailed explanation
- 在
prepare
阶段的每个管道上,都会自动启动compile-production-assets
作业.- 完成后,
review-build-cng
作业开始,因为在后续步骤中触发的CNG-mirror
管道依赖review-build-cng
.
- 完成后,
- 完成
compile-production-assets
后,review-build-cng
作业将触发CNG-mirror
项目中的管道 .- 仅当您的 MR 包括CI 或前端更改时 ,
review-build-cng
作业才会自动开始. 在其他情况下,该工作是手动的. CNG-mirror
管道基于GitLab 管道的提交创建每个组件(例如gitlab-rails-ee
,gitlab-shell
,gitaly
等)的 Docker 映像,并将它们存储在其注册表中 .- 我们使用
CNG-mirror
项目,以便CNG
(Cloud Native GitLab)项目的注册表不会因大量临时 Docker 映像而过载. - 请注意,官方的 CNG 图像是由
cloud-native-image
作业构建的,该作业仅针对标签运行,并自身触发CNG
管道.
- 仅当您的 MR 包括CI 或前端更改时 ,
- 完成
review-build-cng
后,review-deploy
作业使用官方的 GitLab Helm 图表将 Review App 部署到 GCP 上的review-apps
Kubernetes 集群.- 可以在
scripts/review_apps/review-apps.sh
找到用于部署 Review App 的实际脚本. - 这些脚本基本上是我们的官方 Auto DevOps 脚本 ,其中默认的 CNG 映像会被构建并存储在
CNG-mirror
项目注册表中的映像覆盖. - 由于我们使用的是官方的 GitLab Helm 图表 ,这意味着您将为分支机构获得一个专用的环境,该环境非常接近生产环境.
- 可以在
- 一旦
review-deploy
作业成功,您应该可以使用您的 Review App,这要归功于 MR 小部件与它的直接链接. 要登录 Review App,请参阅”登录我的 Review App?”. 下面.
补充笔记:
- 如果
review-deploy
工作持续失败(请注意,我们已经试了两次),请在发布消息#g_qe_engineering_productivity
通道和/或创建~"Engineering Productivity"
~"ep::review apps"
~bug
的问题有链接到您的合并请求. 请注意,部署失败可能会揭示合并请求中引入的实际问题(即,这不一定是暂时性失败)! - 如果
review-qa-smoke
作业仍然失败(请注意,我们已经重试了两次),请检查该作业的日志:您可能会发现合并请求中引入的实际问题. 您也可以下载工件,以查看发生故障时页面的屏幕截图. 如果您找不到失败的原因,或者看起来与更改无关,请在#quality
频道中发布一条消息和/或创建#quality
问题,并带有指向合并请求的链接. - 手动
review-stop
可用于手动停止复查应用,一旦合并请求的分支在合并后被删除,GitLab 也将启动手动review-stop
. - 使用GitLab 的 Kubernetes 集成将 Kubernetes 集群连接到
gitlab
项目. 这基本上允许直接从合并请求窗口小部件链接到 Review App.
Auto-stopping of Review Apps
借助环境自动停止功能,Review Apps 在上次部署后 2 天会自动停止.
If you need your Review App to stay up for a longer time, you can pin its environment or retry the review-deploy
job to update the “latest deployed at” time.
The review-cleanup
job that automatically runs in scheduled pipelines (and is manual in merge request) stops stale Review Apps after 5 days, deletes their environment after 6 days, and cleans up any dangling Helm releases and Kubernetes resources after 7 days.
自动在计划的管道中运行的review-gcp-cleanup
作业(在合并请求中手动执行)将删除所有未与 Kubernetes 资源一起删除的悬空 GCP 网络资源.
QA runs
在qa
阶段(在review
阶段之后)的每个管道上, review-qa-smoke
作业都会自动启动,并运行 QA 烟雾套件.
您也可以手动启动review-qa-all
:它运行完整的质量检查套件.
Performance Metrics
在每一个管道在qa
阶段, review-performance
作业自动启动:这项工作确实使用基本的浏览器性能测试Sitespeed.io 集装箱 .
Cluster configuration
Node pools
目前, review-apps
集群使用以下节点池进行设置:
- 具有自动
e2-highcpu-16
(16 vCPU,16 GB 内存)可抢占节点
Helm
使用的 Helm 版本在registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14
映像中定义,由review-deploy
和review-stop
作业使用.
How to
Get access to the GCP Review Apps cluster
您需要打开 gcp-review-apps-sg
GCP 组的访问请求(内部链接) . 为了加入群组,您必须在访问请求中指定所需的 GCP 角色. 该角色将授予您特定的权限,以便与 Review App 容器进行交互.
Here are some permissions you may want to have, and the roles that grant them:
container.pods.getLogs
检索 pod 日志所必需. 由查看者(roles/viewer
)授予.container.pods.exec
运行 Rails 控制台所需. 由Kubernetes Engine 开发人员(roles/container.developer
)授予.
Log into my Review App
默认用户名是root
,其密码可以在名为gitlab-{ce,ee} Review App's root password
的 1Password 安全注释中找到.
Enable a feature flag for my Review App
- 打开您的 Review App 并按照上述说明登录.
- 创建一个个人访问令牌.
- 使用Feature 标志 API启用功能标志 .
Find my Review App slug
- 打开
review-deploy
作业. - 查找”
Checking for previous deployment of review-*
. - 例如,对于
Checking for previous deployment of review-qa-raise-e-12chm0
在这种情况下,您的 Review AppChecking for previous deployment of review-qa-raise-e-12chm0
将为review-qa-raise-e-12chm0
.
Run a Rails console
- 确保首先具有访问群集和
container.pods.exec
权限的权限. - 根据您的 Review App
review-qa-raise-e-12chm0
过滤工作量 ,例如review-qa-raise-e-12chm0
. - 查找并打开
task-runner
部署,例如review-qa-raise-e-12chm0-task-runner
. - 单击”托管窗格”部分中的 Pod,例如
review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz
. - 点击
KUBECTL
下拉菜单,然后Exec
- >task-runner
. - 从默认命令
-it -- gitlab-rails console
-c task-runner -- ls
替换为-it -- gitlab-rails console
,或者- 运行
kubectl exec --namespace review-apps review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz -it -- gitlab-rails console
和- 用您的 Pod 名称替换
review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz
.
- 用您的 Pod 名称替换
- 运行
Dig into a Pod’s logs
- 确保首先有权访问集群和
container.pods.getLogs
权限. - 根据您的 Review App
review-qa-raise-e-12chm0
过滤工作量 ,例如review-qa-raise-e-12chm0
. - 查找并打开
migrations
部署,例如review-qa-raise-e-12chm0-migrations.1
. - 单击”托管窗格”部分中的 Pod,例如
review-qa-raise-e-12chm0-migrations.1-nqwtx
. - 单击
Container logs
链接.
Diagnosing unhealthy Review App releases
如果Review App Stability下降,则可能表明Review review-apps-ce/ee
集群不健康. 领先的指标可能是导致重新启动的运行状况检查失败或 Review App 部署的多数失败.
Review Apps Overview 仪表板可帮助确定群集上的负载峰值,以及节点是否有问题或整个群集是否趋于不正常.
Release failed with ImagePullBackOff
潜在原因:
如果看到ImagePullBackoff
状态,请检查缺少的 Docker 映像.
在哪里寻找进一步的调试:
要检查是否已创建 Docker 映像,请运行以下 Docker 命令:
`DOCKER_CLI_EXPERIMENTAL=enabled docker manifest repository:tag`
此命令的输出指示 Docker 映像是否存在. 例如:
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect registry.gitlab.com/gitlab-org/build/cng-mirror/gitlab-rails-ee:39467-allow-a-release-s-associated-milestones-to-be-edited-thro
如果 Docker 映像不存在:
- 验证
helm upgrade --install
命令中的image.repository
和image.tag
选项是否与 CNG-mirror 管道使用的存储库名称匹配. - 在
review-build-cng
作业中进一步查看相应的下游 CNG 镜像管道.
Node count is always increasing (i.e. never stabilizing or decreasing)
潜在原因:
这可能表明review-cleanup
作业未能清除过时的审查应用和 Kubernetes 资源.
在哪里寻找进一步的调试:
查看最新的review-cleanup
作业日志,并确定是否存在任何意外故障.
p99 CPU utilization is at 100% for most of the nodes and/or many components
潜在原因:
这可能表明 Helm 无法部署 Review Apps. 当 Helm 有很多FAILED
版本发布时,CPU 利用率似乎正在增加,这可能是由于 Helm 或 Kubernetes 试图重新创建组件所致.
在哪里寻找进一步的调试:
查看最近的review-deploy
作业日志.
有用的命令:
# Identify if node spikes are common or load on specific nodes which may get rebalanced by the Kubernetes scheduler
kubectl top nodes | sort --key 3 --numeric
# Identify pods under heavy CPU load
kubectl top pods | sort --key 2 --numeric
The logging/user/events/FailedMount
chart is going up
潜在原因:
这可能表明存在太多过时的机密和/或配置图.
在哪里寻找进一步的调试:
查看配置列表或kubectl get secret,cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-'
kubectl get secret,cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-'
.
怀疑任何超过 5 天的机密或配置图,应将其删除.
有用的命令:
# List secrets and config maps ordered by created date
kubectl get secret,cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-'
# Delete all secrets that are 5 to 9 days old
kubectl get secret --sort-by='{.metadata.creationTimestamp}' | grep '^review-' | grep '[5-9]d$' | cut -d' ' -f1 | xargs kubectl delete secret
# Delete all secrets that are 10 to 99 days old
kubectl get secret --sort-by='{.metadata.creationTimestamp}' | grep '^review-' | grep '[1-9][0-9]d$' | cut -d' ' -f1 | xargs kubectl delete secret
# Delete all config maps that are 5 to 9 days old
kubectl get cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-' | grep -v 'dns-gitlab-review-app' | grep '[5-9]d$' | cut -d' ' -f1 | xargs kubectl delete cm
# Delete all config maps that are 10 to 99 days old
kubectl get cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-' | grep -v 'dns-gitlab-review-app' | grep '[1-9][0-9]d$' | cut -d' ' -f1 | xargs kubectl delete cm
Using K9s
K9s是功能强大的命令行仪表板,可让您按标签过滤. 这可以帮助确定趋势超过审阅应用程序资源请求的应用程序 . Kubernetes 将根据资源请求将 Pod 调度到节点,并允许 CPU 使用量达到上限.
- 在 K9s 中,您可以通过输入
/
字符来排序或添加过滤器-lrelease=<review-app-slug>
-过滤所有发布的 Pod. 这有助于确定单个部署中存在的问题-lapp=<app>
-筛选特定应用程序的所有 pod. 这有助于确定应用程序的资源使用情况.
- 您可以滚动到 Kubernetes 资源并按
d
(描述),s
(shell),l
(日志)进行更深入的检查
Troubleshoot a pending dns-gitlab-review-app-external-dns
Deployment
Finding the problem
过去 ,发生了dns-gitlab-review-app-external-dns
部署处于挂起状态的情况,有效地阻止了所有 Review App 分配 DNS 记录,从而使它们无法通过域名访问.
反过来,这阻止了 Review App 的其他组件正常启动(例如gitlab-runner
).
经过一番挖掘后,我们发现在使用systemd-mount
瞬时作用域(例如 pod)执行新安装时,新安装失败:
MountVolume.SetUp failed for volume "dns-gitlab-review-app-external-dns-token-sj5jm" : mount failed: exit status 1
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/06add1c3-87b4-11e9-80a9-42010a800107/volumes/kubernetes.io~secret/dns-gitlab-review-app-external-dns-token-sj5jm --scope -- mount -t tmpfs tmpfs /var/lib/kubelet/pods/06add1c3-87b4-11e9-80a9-42010a800107/volumes/kubernetes.io~secret/dns-gitlab-review-app-external-dns-token-sj5jm
Output: Failed to start transient scope unit: Connection timed out
这可能是因为 GitLab 图表创建了 67 个资源,导致在基础 GCP 节点上创建了许多安装点.
在根本的问题似乎是一个systemd
错误是固定在systemd
v237
. 不幸的是,我们的 GCP 节点当前正在使用v232
.
记录下来,找出此问题的调试步骤是:
- 将 kubectl 上下文切换到 review-apps-ce(我们建议使用kubectx )
kubectl get pods | grep dns
kubectl describe pod <pod name>
并确认确切的错误消息- 在兔子洞中找到相关的 Kubernetes 错误报告后 ,在网上搜索确切的错误消息
- 通过 GCP 控制台通过 SSH 访问节点( 计算机引擎> VM 实例,然后单击
dns-gitlab-review-app-external-dns
pod 运行的节点的” SSH”按钮) - In the node:
systemctl --version
=>systemd 232
- 收集更多信息:
mount | grep kube | wc -l
mount | grep kube | wc -l
=>例如 290systemctl list-units --all | grep -i var-lib-kube | wc -l
systemctl list-units --all | grep -i var-lib-kube | wc -l
=>例如 142
- 检查多少个 Pod 处于不良状态:
- 获取运行给定节点的所有 Pod:
kubectl get pods --field-selector=spec.nodeName=NODE_NAME
- 获取给定节点上的所有
Running
pods:kubectl get pods --field-selector=spec.nodeName=NODE_NAME | grep Running
kubectl get pods --field-selector=spec.nodeName=NODE_NAME | grep Running
- 在给定节点上获取所有处于不良状态的 Pod:
kubectl get pods --field-selector=spec.nodeName=NODE_NAME | grep -v 'Running' | grep -v 'Completed'
kubectl get pods --field-selector=spec.nodeName=NODE_NAME | grep -v 'Running' | grep -v 'Completed'
- 获取运行给定节点的所有 Pod:
Solving the problem
为了解决该问题,我们需要(强制)耗尽一些节点:
- 在运行
dns-gitlab-review-app-external-dns
pod 的节点上尝试正常排水,以使 Kubernetes 自动将其移动到另一个节点:kubectl drain NODE_NAME
- 如果那不起作用,您还可以通过删除所有吊舱来强制”排水”节点:
kubectl delete pods --field-selector=spec.nodeName=NODE_NAME
- 在节点中:
- 执行
systemctl daemon-reload
以删除无效/无效的单元 - 如果那不能解决问题,请执行硬重启:
sudo systemctl reboot
- 执行
- 取消封锁所有封锁的节点:
kubectl uncordon NODE_NAME
封锁kubectl uncordon NODE_NAME
同时,由于大多数 Review App 处于损坏状态,因此我们将其删除以清理非Running
Pod 列表. 以下是一个命令,用于根据其上次部署日期(当前日期为当时的 6 月 6 日)删除 Review Apps,
helm ls -d | grep "Jun 4" | cut -f1 | xargs helm delete --purge
Mitigation steps taken to avoid this problem in the future
我们用较小的计算机创建了一个新的节点池,这样一来,将来计算机就不太可能遇到”装载点过多”的问题.
Frequently Asked Questions
在每次测试运行时触发 CNG 映像生成是否过多? 这将创建数千个未使用的 Docker 映像.
我们必须从某个地方开始,以后再改进. 另外,我们正在使用 CNG-mirror 项目来存储这些 Docker 映像,以便我们可以在某个时候清除注册表,并使用一个新的,空的注册表.
我们如何确保它免受滥用? 应用程序向世界开放,因此我们需要找到一种方法将其限制为仅限我们自己.
This isn’t enabled for forks.