automation-suite
2.2510
true
Linux 版 Automation Suite 安装指南
- 概述
- 要求
- 部署模板
- 手动:准备安装
- 手动:准备安装
- 步骤 2:为离线安装配置符合 OCI 的注册表
- 步骤 3:配置外部对象存储
- 步骤 4:配置 High Availability Add-on
- 步骤 5:配置 SQL 数据库
- 步骤 7:配置 DNS
- 步骤 8:配置磁盘
- 步骤 9:配置内核和操作系统级别设置
- 步骤 10:配置节点端口
- 步骤 11:应用其他设置
- 步骤 12:验证并安装所需的 RPM 包
- 步骤 13:生成 cluster_config.json
- Cluster_config.json 示例
- 常规配置
- 配置文件配置
- 证书配置
- 数据库配置
- 外部对象存储配置
- 预签名 URL 配置
- ArgoCD 配置
- Kerberos 身份验证配置
- 符合 OCI 的外部注册表配置
- Disaster Recovery:主动/被动和主动/主动配置
- High Availability Add-on 配置
- 特定于 Orchestrator 的配置
- Insights 特定配置
- Process Mining 特定配置
- Document Understanding 特定配置
- Automation Suite Robot 特定配置
- 监控配置
- 可选:配置代理服务器
- 可选:在多节点 HA 就绪生产集群中启用区域故障恢复
- 可选:传递自定义 resolv.conf
- 可选:提高容错能力
- 添加具有 GPU 支持的专用代理节点
- 为 Automation Suite Robot 添加专用代理节点
- 步骤 15:为离线安装配置临时 Docker 注册表
- 步骤 16:验证安装的先决条件
- 正在运行 uipathctl
- 手动:执行安装
- 安装后
- 集群管理
- 监控和警示
- 迁移和升级
- 特定于产品的配置
- 最佳实践和维护
- 故障排除
- 如何在安装过程中对服务进行故障排除
- 如何减少 NFS 备份目录的权限
- 如何卸载集群
- 如何清理离线工件以改善磁盘空间
- 如何清除 Redis 数据
- 如何启用 Istio 日志记录
- 如何手动清理日志
- 将 Ceph 退出只读模式
- 如何清理存储在 sf-logs 存储桶中的旧日志
- 如何禁用 AI Center 的流日志
- 如何对失败的 Automation Suite 安装进行调试
- 如何在升级后从旧安装程序中删除映像
- 如何禁用 TX 校验和卸载
- 如何手动将 ArgoCD 日志级别设置为 Info
- 如何扩展 AI Center 存储
- 如何为外部注册表生成已编码的 pull_secret_value
- 如何解决 TLS 1.2 中的弱密码问题
- 如何查看 TLS 版本
- 如何使用证书
- 如何计划 Ceph 备份和还原数据
- 如何使用集群内对象存储 (Ceph) 收集 DU 使用情况数据
- 如何在离线环境中安装 RKE2 SELinux
- 如何清理 NFS 服务器上的旧差异备份
- 如何在已启用 FIPS 的集群中部署 Insights
- 如何迁移到 cgroup v2
- 如何在虚拟机重新启动后恢复 Kerberos 身份验证
- 如何将本地 Docker 映像推送到集群内注册表
- 如何从备份中排除存储桶
- 无法获取沙盒映像
- Pod 未显示在 ArgoCD 用户界面中
- Redis 探测器失败
- RKE2 服务器无法启动
- ArgoCD 在首次安装后进入“进行中”状态
- 处于 CrashLoopBackOff 状态的 ArgoCD 存储库服务器 Pod
- 手动 ArgoCD 网络策略缓解措施 (MHSA-47m3-95c7-g2g8)
- 监控仪表板中缺少 Ceph-rook 指标
- 诊断性运行状况检查期间报告的错误不匹配
- 为 uipathctl 创建的工作负载配置资源请求和限制
- 无正常的上游问题
- 杀毒软件阻止了 Redis 启动
- 无法在启用 TLS 证书验证的情况下启动 AI Center 和 Document Understanding Pod
- Fluentd 不会在 IPv6 环境中导出日志
- Studio 桌面版无法加载 Integration Service 连接器和活动
- 使用 Process Mining 运行高可用性
- 使用 Kerberos 登录时 Process Mining 挖掘失败
- 无法使用 pyodbc 格式连接字符串连接到 AutomationSuite_ProcessMining_Warehouse 数据库
- Airflow 安装失败,并显示 sqlalchemy.exc.ArgumentError:无法从字符串“”中解析 rfc1738 URL
- 如何添加 IP 表格规则以使用 SQL Server 端口 1433
- 运行 CData Sync 的服务器不信任 Automation Suite 证书
- Process Mining fails to load after disabling and re-enabling it
- 运行诊断工具
- 使用 Automation Suite 支持捆绑包
- 探索日志
重要 :
请注意,此内容已使用机器翻译进行了部分本地化。
新发布内容的本地化可能需要 1-2 周的时间才能完成。
由于 Automation Suite 中内存不足导致集群内注册表种子设定失败的已知问题和解决方法。
描述
为集群内注册表设定种子需要将大型图像存档加载到内存中。在 RAM 有限的节点上,这可能会导致种子设定流程挂起或意外终止。
解决方案
要解决此问题,请使用以下脚本为集群内注册表设定种子:
#!/bin/bash
set -euo pipefail
[[ $# -lt 1 ]] && { echo "Usage: $0 <bundle>"; exit 1; }
BUNDLE=$1
OFFLINE_FOLDER="/uipath" # don't add / at the end
DOCKER_REGISTRY_NODEPORT=30071
function error() {
echo -e "\e[0;31m[ERROR][$(date +'%Y-%m-%dT%H:%M:%S%z')]:\e[0m $*" >&2
exit 1
}
function info() {
echo "[INFO] [$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*"
}
function warn() {
echo -e "\e[0;33m[WARN] [$(date +'%Y-%m-%dT%H:%M:%S%z')]:\e[0m $*" >&2
}
function configure_podman() {
local podman_folder="$1"
local podman_config_path="/etc/containers/storage.conf"
local podman_rootless_path="${podman_folder}/podman_rootless"
local podman_rootfull_path="${podman_folder}/podman_rootfull"
if [[ -n "${podman_folder}" ]]; then
info "Configuring podman to use ${podman_folder}"
mkdir -p "${podman_rootless_path}" || exit 1
mkdir -p "${podman_rootfull_path}" || exit 1
# update the graphroot config line
sed -i "s|^\(graphroot[[:space:]]=\).*|\1\"${podman_rootfull_path}\"|" "${podman_config_path}"
# uncomment and update the rootless path config line
sed -i "s|^#[[:space:]]*\(rootless_storage_path[[:space:]]*=\).*|\1\"${podman_rootless_path}\"|" "${podman_config_path}"
fi
# uncomment the mount program
sed -i "/^#mount_program[[:space:]]*=/s|^#||g" "${podman_config_path}"
}
function get_registry_addresses() {
local namespace="docker-registry"
local lh_registry=1
local server_node_count
lh_registry=$(kubectl get deployment -n "${namespace}" docker-registry --ignore-not-found --no-headers | wc -l)
server_node_count=$(kubectl get nodes -l "node-role.kubernetes.io/master=true" --no-headers | wc -l)
IFS=" " read -r -a registry_addresses <<<"$(kubectl get pods -n ${namespace} -o jsonpath="{.items[*].status.podIP}" -l app=docker-registry)"
if [[ "${lh_registry}" -eq 1 ]]; then
[[ "${#registry_addresses[@]}" -eq 1 ]] || error "Failed to get address of registry pod."
else
[[ "${#registry_addresses[@]}" -eq "${server_node_count}" ]] || error "Failed to get address of all registry pods."
fi
echo "${registry_addresses[@]}"
}
function import_sf_images() {
local sf_folder="${1}"
local podman_folder="${2}"
local image_inventory="${sf_folder}/sf-images/image-tags.txt"
local image_tar="${sf_folder}/sf-images/images.tar"
info "Populating Docker Registry"
if [[ -z "${podman_folder}" ]]; then
podman_folder="${sf_folder}"
fi
[[ -f "${image_inventory}" ]] || error "Missing ${image_inventory}"
local all_images_present=1
while read -r image_name; do
podman image exists "localhost:${DOCKER_REGISTRY_NODEPORT}/${image_name}" || all_images_present=0
done <"${image_inventory}"
mkdir -p "${podman_folder}/tmp"
info "Executing podman load with podman_folder=${podman_folder}"
# inline ENV for https://github.com/containers/podman/pull/5412 and https://github.com/containers/podman/issues/5960
export TMPDIR="${podman_folder}/tmp"
if ((all_images_present != 1)); then
info "Loading image tar ${image_tar}"
podman load -i "${image_tar}" || error "Failed to load image"
else
info "All images present. Skipping podman load"
fi
registry_addresses=($(get_registry_addresses))
while read -r image_name; do
for ip in "${registry_addresses[@]}"; do
local try=0
local maxtry=10
local status="notready"
podman tag "localhost:${DOCKER_REGISTRY_NODEPORT}/${image_name}" "${ip}:5000/${image_name}"
podman login "${ip}:5000" --tls-verify=false
while [[ ${status} == "notready" ]] && ((try != maxtry)); do
try=$((try + 1))
info "Pushing image ${image_name}...try ${try}/${maxtry}" && sleep 5
podman push "${ip}:5000/${image_name}" \
--tls-verify=false &&
status="ready"
[[ ${status} == "ready" ]] || sleep 60
done
[[ ${status} == "ready" ]] || error "Failed to push image $image_name"
done
done <"${image_inventory}"
info "Populated Docker Registry"
}
tmp_offline_folder="$(mktemp -d -p "${OFFLINE_FOLDER}" -t offline-bundle.XXXXXXXXXX)"
tar -xzf "${BUNDLE}" -C "${tmp_offline_folder}"
podman_folder="$OFFLINE_FOLDER/lib"
mkdir -p $podman_folder
configure_podman "$podman_folder"
import_sf_images "${tmp_offline_folder}" "$podman_folder"
#!/bin/bash
set -euo pipefail
[[ $# -lt 1 ]] && { echo "Usage: $0 <bundle>"; exit 1; }
BUNDLE=$1
OFFLINE_FOLDER="/uipath" # don't add / at the end
DOCKER_REGISTRY_NODEPORT=30071
function error() {
echo -e "\e[0;31m[ERROR][$(date +'%Y-%m-%dT%H:%M:%S%z')]:\e[0m $*" >&2
exit 1
}
function info() {
echo "[INFO] [$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*"
}
function warn() {
echo -e "\e[0;33m[WARN] [$(date +'%Y-%m-%dT%H:%M:%S%z')]:\e[0m $*" >&2
}
function configure_podman() {
local podman_folder="$1"
local podman_config_path="/etc/containers/storage.conf"
local podman_rootless_path="${podman_folder}/podman_rootless"
local podman_rootfull_path="${podman_folder}/podman_rootfull"
if [[ -n "${podman_folder}" ]]; then
info "Configuring podman to use ${podman_folder}"
mkdir -p "${podman_rootless_path}" || exit 1
mkdir -p "${podman_rootfull_path}" || exit 1
# update the graphroot config line
sed -i "s|^\(graphroot[[:space:]]=\).*|\1\"${podman_rootfull_path}\"|" "${podman_config_path}"
# uncomment and update the rootless path config line
sed -i "s|^#[[:space:]]*\(rootless_storage_path[[:space:]]*=\).*|\1\"${podman_rootless_path}\"|" "${podman_config_path}"
fi
# uncomment the mount program
sed -i "/^#mount_program[[:space:]]*=/s|^#||g" "${podman_config_path}"
}
function get_registry_addresses() {
local namespace="docker-registry"
local lh_registry=1
local server_node_count
lh_registry=$(kubectl get deployment -n "${namespace}" docker-registry --ignore-not-found --no-headers | wc -l)
server_node_count=$(kubectl get nodes -l "node-role.kubernetes.io/master=true" --no-headers | wc -l)
IFS=" " read -r -a registry_addresses <<<"$(kubectl get pods -n ${namespace} -o jsonpath="{.items[*].status.podIP}" -l app=docker-registry)"
if [[ "${lh_registry}" -eq 1 ]]; then
[[ "${#registry_addresses[@]}" -eq 1 ]] || error "Failed to get address of registry pod."
else
[[ "${#registry_addresses[@]}" -eq "${server_node_count}" ]] || error "Failed to get address of all registry pods."
fi
echo "${registry_addresses[@]}"
}
function import_sf_images() {
local sf_folder="${1}"
local podman_folder="${2}"
local image_inventory="${sf_folder}/sf-images/image-tags.txt"
local image_tar="${sf_folder}/sf-images/images.tar"
info "Populating Docker Registry"
if [[ -z "${podman_folder}" ]]; then
podman_folder="${sf_folder}"
fi
[[ -f "${image_inventory}" ]] || error "Missing ${image_inventory}"
local all_images_present=1
while read -r image_name; do
podman image exists "localhost:${DOCKER_REGISTRY_NODEPORT}/${image_name}" || all_images_present=0
done <"${image_inventory}"
mkdir -p "${podman_folder}/tmp"
info "Executing podman load with podman_folder=${podman_folder}"
# inline ENV for https://github.com/containers/podman/pull/5412 and https://github.com/containers/podman/issues/5960
export TMPDIR="${podman_folder}/tmp"
if ((all_images_present != 1)); then
info "Loading image tar ${image_tar}"
podman load -i "${image_tar}" || error "Failed to load image"
else
info "All images present. Skipping podman load"
fi
registry_addresses=($(get_registry_addresses))
while read -r image_name; do
for ip in "${registry_addresses[@]}"; do
local try=0
local maxtry=10
local status="notready"
podman tag "localhost:${DOCKER_REGISTRY_NODEPORT}/${image_name}" "${ip}:5000/${image_name}"
podman login "${ip}:5000" --tls-verify=false
while [[ ${status} == "notready" ]] && ((try != maxtry)); do
try=$((try + 1))
info "Pushing image ${image_name}...try ${try}/${maxtry}" && sleep 5
podman push "${ip}:5000/${image_name}" \
--tls-verify=false &&
status="ready"
[[ ${status} == "ready" ]] || sleep 60
done
[[ ${status} == "ready" ]] || error "Failed to push image $image_name"
done
done <"${image_inventory}"
info "Populated Docker Registry"
}
tmp_offline_folder="$(mktemp -d -p "${OFFLINE_FOLDER}" -t offline-bundle.XXXXXXXXXX)"
tar -xzf "${BUNDLE}" -C "${tmp_offline_folder}"
podman_folder="$OFFLINE_FOLDER/lib"
mkdir -p $podman_folder
configure_podman "$podman_folder"
import_sf_images "${tmp_offline_folder}" "$podman_folder"
要运行脚本,请使用以下命令:
./script.sh <path-to-bundle.tar.gz>
./script.sh <path-to-bundle.tar.gz>