Automation Suite
2023.10
偽
- 概要
- 要件
- 推奨: デプロイ テンプレート
- 手動: インストールを準備する
- 手動: インストールを準備する
- 手順 1: オフライン インストール用に OCI 準拠レジストリを設定する
- 手順 2: 外部 ObjectStore を構成する
- 手順 3: High Availability Add-on を構成する
- 手順 4: Microsoft SQL Server を構成する
- 手順 5: ロード バランサーを構成する
- 手順 6: DNS を構成する
- 手順 7: カーネルと OS レベルの設定を構成する
- 手順 8: ディスクを構成する
- 手順 9: ノード ポートを構成する
- 手順 10: その他の設定を適用する
- 手順 12: 必要な RPM パッケージを検証してインストールする
- 手順 13: cluster_config.json を生成する
- 証明書の設定
- データベースの構成
- 外部 ObjectStore の構成
- 署名済み URL の構成
- 外部の OCI 準拠レジストリの設定
- 障害復旧: アクティブ/パッシブおよびアクティブ/アクティブ構成
- High Availability Add-on の構成
- Orchestrator 固有の設定
- Insights 固有の構成
- Process Mining 固有の構成
- Document Understanding 固有の構成
- Automation Suite ロボット固有の構成
- 監視の構成
- 任意: プロキシ サーバーを構成する
- 任意: マルチノードの HA 対応の運用クラスターにおけるゾーン障害に対する復元設定を有効化する
- 任意: カスタムの Resolv.con を渡す
- 任意: フォールト トレランスを向上させる
- install-uipath.sh パラメーター
- GPU がサポートされた専用のエージェント ノードを追加する
- Task Mining 専用のエージェント ノードを追加する
- Task Mining アプリケーションを接続する
- Automation Suite ロボット専用のエージェント ノードを追加する
- 手順 15: オフライン インストール用に一時的な Docker レジストリを設定する
- 手順 16: インストールの前提条件を検証する
- 手動: インストールを実行する
- インストール後
- クラスターの管理
- 監視とアラート機能
- 移行とアップグレード
- 製品固有の設定
- ベストプラクティスとメンテナンス
- トラブルシューティング
- インストール時にサービスをトラブルシューティングする方法
- クラスターをアンインストールする方法
- オフライン成果物をクリーンアップしてディスク領域を改善する方法
- Redis データをクリアする方法
- Istio ログを有効化する方法
- ログを手動でクリーンアップする方法
- sf-logs バンドルに保存されている古いログをクリーンアップする方法
- AI Center のストリーミング ログを無効化する方法
- 失敗した Automation Suite インストールをデバッグする方法
- アップグレード後に古いインストーラーからイメージを削除する方法
- NIC チェックサムオフロードを無効にする方法
- Automation Suite 2022.10.10 および 2022.4.11 から 2023.10.2 にアップグレードする方法
- ArgoCD のログ レベルを手動で Info に設定する方法
- RHEL 8.4 OS でオフライン インストールを実行できない
- バンドルのダウンロード中のエラー
- バイナリがないため、オフライン インストールが失敗する
- オフライン インストールでの証明書の問題
- Longhorn のセットアップ中に最初のインストールが失敗する
- SQL 接続文字列の検証エラー
- selinux iscsid モジュールの前提条件の確認が失敗する
- Azure ディスクが SSD としてマークされない
- 証明書の更新後のエラー
- ウイルス対策が原因でインストールの問題が発生する
- OS のアップグレード後に Automation Suite が動作しない
- Automation Suite で backlog_wait_time を 0 に設定する必要がある
- ワークロードの準備ができていないためボリュームをマウントできない
- 2021.10 からの自動アップグレード後にクラスターが異常になる
- Ceph の異常によりアップグレードが失敗する
- 領域の問題のために rke2 が開始しない
- ボリュームがマウントできず、アタッチ/デタッチ ループ状態のまま
- Orchestrator データベース内のクラシック オブジェクトが原因でアップグレードが失敗する
- Ceph クラスターがサイドバイサイド アップグレード後に機能低下ステートで検出される
- 異常な Insights コンポーネントが原因で移行が失敗する
- Apps のサービス アップグレードの失敗
- インプレース アップグレードのタイムアウト
- Docker レジストリの移行が PVC の削除段階でスタックする
- v2023.10 へのアップグレード後に AI Center をプロビジョニングできない
- オフライン環境でアップグレードが失敗する
- 管理ポータルのタイムアウト期間を設定する
- 移行後に認証が機能しない
- Kinit: Cannot Find KDC for Realm <AD Domain> While Getting Initial Credentials
- kinit: Keytab contains no suitable keys for *** while getting initial credentials
- 無効なステータス コードが原因で GSSAPI 操作が失敗した
- Alarm received for failed kerberos-tgt-update job
- SSPI Provider: Server not found in Kerberos database
- アカウントが無効なため AD ユーザーのログインに失敗した
- ArgoCD へのログインに失敗した
- 基になるディレクトリ接続を更新する
- 診断ツールを実行する
- Automation Suite サポート バンドル ツールを使用する
- ログを確認する
Init:0/X でポッドがスタックする
Linux の Automation Suite のインストール ガイド
最終更新日 2024年4月19日
Init:0/X でポッドがスタックする
LH ボリュームを使用する DescriptionPod が、Init:0/X でスタックしており (X はコンテナーの数を表す整数)、ポッド上の kubectl describe コマンドがイベントのボリュームに対して MapVolume.MapPodDevice が失敗したことを返します。
この問題を修正するには、次のコマンドを実行します。
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