automation-suite
2023.4
false
Linux 版 Automation Suite 安装指南
- 概述
- 要求
- 安装
- 安装后
- 集群管理
- 监控和警示
- 迁移和升级
- 特定于产品的配置
- 最佳实践和维护
- 故障排除
- 如何在安装过程中对服务进行故障排除
- 如何卸载集群
- 如何清理离线工件以改善磁盘空间
- 如何清除 Redis 数据
- 如何启用 Istio 日志记录
- 如何手动清理日志
- 如何清理存储在 sf-logs 存储桶中的旧日志
- 如何禁用 AI Center 的流日志
- 如何对失败的 Automation Suite 安装进行调试
- 如何在升级后从旧安装程序中删除映像
- 如何自动清理 Longhorn 快照
- 如何禁用 TX 校验和卸载
- 如何手动将 ArgoCD 日志级别设置为 Info
- 如何为外部注册表生成已编码的 pull_secret_value
- 如何解决 TLS 1.2 中的弱密码问题
- 如何使用证书
- 如何使用集群内对象存储 (Ceph) 收集 DU 使用情况数据
- 如何在离线环境中安装 RKE2 SELinux
- 如何清理 NFS 服务器上的旧差异备份
- 无法获取沙盒映像
- Pod 未显示在 ArgoCD 用户界面中
- Redis 探测器失败
- RKE2 服务器无法启动
- 在 UiPath 命名空间中找不到密码
- ArgoCD 在首次安装后进入“进行中”状态
- 访问 ArgoCD 只读帐户时出现问题
- MongoDB Pod 处于 CrashLoopBackOff 状态或在删除后处于“等待 PVC 配置”状态
- 集群还原或回滚后服务运行状况不佳
- Pod 在 Init:0/X 中卡住
- Prometheus 处于 CrashLoopBackoff 状态,并出现内存不足 (OOM) 错误
- 监控仪表板中缺少 Ceph-rook 指标
- Pod 无法在代理环境中与 FQDN 通信
- 无法配置升级后的电子邮件警示
- 无正常的上游问题
- 使用 Automation Suite 诊断工具
- 使用 Automation Suite 支持捆绑包
- 探索日志
重要 :
请注意,此内容已使用机器翻译进行了部分本地化。
新发布内容的本地化可能需要 1-2 周的时间才能完成。
Pod 在 Init:0/X 中卡住
描述
使用 LH 卷的“说明 Pod”卡在 Init:0/X(其中 X 是表示容器数量的整数),并且 Pod 上的“kubectl describe”命令针对事件中的卷返回“MapVolume.MapPodDevice failed”。
解决方案
要解决此问题,请运行以下命令:
for podPv in $(kubectl get events -A -o json | jq -r '.items[] | select(.reason == "FailedMapVolume" and .involvedObject.kind == "Pod" and (.message | contains("MapVolume.MapPodDevice failed for volume") and contains("Could not mount \"/dev/longhorn"))) | .involvedObject.namespace + "=" + .involvedObject.name + "=" + (.message | match("(pvc-[0-9a-z-]+)").captures[0].string )') ; do
echo "Found 'FailedMapVolume' error: '${podPv}'"
NS=$(echo "${podPv}" | cut -d'=' -f1)
POD=$(echo "${podPv}" | cut -d'=' -f2)
PV=$(echo "${podPv}" | cut -d'=' -f3)
[[ -z "${NS}" ]] && echo "Could not extract namespace for error: '${podPv}'" && continue
[[ -z "${POD}" ]] && echo "Could not extract pod name for error: '${podPv}'" && continue
[[ -z "${PV}" ]] && echo "Could not extract Persistent Volume for error: '${podPv}'" && continue
controller_data=$(kubectl -n "${NS}" get po "${POD}" -o json | jq -r '[.metadata.ownerReferences[] | select(.controller==true)][0] | .kind + "=" + .name')
[[ -z "$controller_data" ]] && echo "Could not determine owner for pod: ${POD} in namespace: ${NS}" && continue
CONTROLLER_KIND=$(echo "${controller_data}" | cut -d'=' -f1)
[[ -z "${CONTROLLER_KIND}" ]] && echo "Could not extract controller kind for pod: '${POD}' in namespace: '${NS}' && continue
CONTROLLER_NAME=$(echo "${controller_data}" | cut -d'=' -f2)
[[ -z "${CONTROLLER_NAME}" ]] && echo "Could not extract controller name for pod: '${POD}' in namespace: '${NS}' && continue
if [[ $CONTROLLER_KIND == "ReplicaSet" ]]
then
controller_data=$(kubectl -n "${NS}" get "${CONTROLLER_KIND}" "${CONTROLLER_NAME}" -o json | jq -r '[.metadata.ownerReferences[] | select(.controller==true)][0] | .kind + "=" + .name')
CONTROLLER_KIND=$(echo "${controller_data}" | cut -d'=' -f1)
[[ -z "${CONTROLLER_KIND}" ]] && echo "Could not extract controller kind(from rs) for pod: '${POD}' in namespace: '${NS}'" && continue
CONTROLLER_NAME=$(echo "${controller_data}" | cut -d'=' -f2)
[[ -z "${CONTROLLER_NAME}" ]] && echo "Could not extract controller name(from rs) for pod: '${POD}' in namespace: '${NS}'" && continue
fi
org_replicas=$(kubectl -n "${NS}" get "$CONTROLLER_KIND" "$CONTROLLER_NAME" -o json | jq -r '.status.replicas')
echo "Scaling down ${CONTROLLER_KIND}/${CONTROLLER_NAME}"
kubectl -n "${NS}" patch "$CONTROLLER_KIND" "${CONTROLLER_NAME}" -p "{\"spec\":{\"replicas\":0}}"
if kubectl -n "${NS}" get pod "${POD}" ; then
kubectl -n "${NS}" wait --for=delete pod "${POD}" --timeout=300s
fi
if kubectl get volumeattachment | grep -q "${PV}"; then
volumeattachment_id=$(kubectl get volumeattachment | grep "${PV}" | awk '{print $1}')
kubectl delete volumeattachment ${volumeattachment_id}
fi
[[ -z "$org_replicas" || "${org_replicas}" -eq 0 ]] && org_replicas=1
echo "Scaling up ${CONTROLLER_KIND}/${CONTROLLER_NAME}"
kubectl -n "${NS}" patch "$CONTROLLER_KIND" "${CONTROLLER_NAME}" -p "{\"spec\":{\"replicas\":${org_replicas}}}"
done
for podPv in $(kubectl get events -A -o json | jq -r '.items[] | select(.reason == "FailedMapVolume" and .involvedObject.kind == "Pod" and (.message | contains("MapVolume.MapPodDevice failed for volume") and contains("Could not mount \"/dev/longhorn"))) | .involvedObject.namespace + "=" + .involvedObject.name + "=" + (.message | match("(pvc-[0-9a-z-]+)").captures[0].string )') ; do
echo "Found 'FailedMapVolume' error: '${podPv}'"
NS=$(echo "${podPv}" | cut -d'=' -f1)
POD=$(echo "${podPv}" | cut -d'=' -f2)
PV=$(echo "${podPv}" | cut -d'=' -f3)
[[ -z "${NS}" ]] && echo "Could not extract namespace for error: '${podPv}'" && continue
[[ -z "${POD}" ]] && echo "Could not extract pod name for error: '${podPv}'" && continue
[[ -z "${PV}" ]] && echo "Could not extract Persistent Volume for error: '${podPv}'" && continue
controller_data=$(kubectl -n "${NS}" get po "${POD}" -o json | jq -r '[.metadata.ownerReferences[] | select(.controller==true)][0] | .kind + "=" + .name')
[[ -z "$controller_data" ]] && echo "Could not determine owner for pod: ${POD} in namespace: ${NS}" && continue
CONTROLLER_KIND=$(echo "${controller_data}" | cut -d'=' -f1)
[[ -z "${CONTROLLER_KIND}" ]] && echo "Could not extract controller kind for pod: '${POD}' in namespace: '${NS}' && continue
CONTROLLER_NAME=$(echo "${controller_data}" | cut -d'=' -f2)
[[ -z "${CONTROLLER_NAME}" ]] && echo "Could not extract controller name for pod: '${POD}' in namespace: '${NS}' && continue
if [[ $CONTROLLER_KIND == "ReplicaSet" ]]
then
controller_data=$(kubectl -n "${NS}" get "${CONTROLLER_KIND}" "${CONTROLLER_NAME}" -o json | jq -r '[.metadata.ownerReferences[] | select(.controller==true)][0] | .kind + "=" + .name')
CONTROLLER_KIND=$(echo "${controller_data}" | cut -d'=' -f1)
[[ -z "${CONTROLLER_KIND}" ]] && echo "Could not extract controller kind(from rs) for pod: '${POD}' in namespace: '${NS}'" && continue
CONTROLLER_NAME=$(echo "${controller_data}" | cut -d'=' -f2)
[[ -z "${CONTROLLER_NAME}" ]] && echo "Could not extract controller name(from rs) for pod: '${POD}' in namespace: '${NS}'" && continue
fi
org_replicas=$(kubectl -n "${NS}" get "$CONTROLLER_KIND" "$CONTROLLER_NAME" -o json | jq -r '.status.replicas')
echo "Scaling down ${CONTROLLER_KIND}/${CONTROLLER_NAME}"
kubectl -n "${NS}" patch "$CONTROLLER_KIND" "${CONTROLLER_NAME}" -p "{\"spec\":{\"replicas\":0}}"
if kubectl -n "${NS}" get pod "${POD}" ; then
kubectl -n "${NS}" wait --for=delete pod "${POD}" --timeout=300s
fi
if kubectl get volumeattachment | grep -q "${PV}"; then
volumeattachment_id=$(kubectl get volumeattachment | grep "${PV}" | awk '{print $1}')
kubectl delete volumeattachment ${volumeattachment_id}
fi
[[ -z "$org_replicas" || "${org_replicas}" -eq 0 ]] && org_replicas=1
echo "Scaling up ${CONTROLLER_KIND}/${CONTROLLER_NAME}"
kubectl -n "${NS}" patch "$CONTROLLER_KIND" "${CONTROLLER_NAME}" -p "{\"spec\":{\"replicas\":${org_replicas}}}"
done