refactor: 资源名 opsx-loki/opsxloki → lokistack(线上已迁移完成)
【已在线完成,零数据丢失】
K8s ns=log 资源全部改名:
Deployment opsx-loki → lokistack
Service opsx-loki → lokistack
Service opsx-loki-nodeport → lokistack-nodeport
PVC opsxloki-data → lokistack-data
Secret opsxloki-secrets → lokistack-secrets
Label app: opsx-loki → app: lokistack
Ingress log.astx.club 后端 → lokistack-nodeport:8080
镜像 lghost/opsxloki → lghost/lokistack
docker-compose 卷/容器名同步更名
【保留不变(改了会出事)】
namespace: log
数据文件名 opsxloki.json(代码硬编码)
容器内路径 /app/data
【迁移过程】
1. 备份 PVC 数据(32KB) + Secret 原值 + 旧 yaml → /root/lokistack-migration-backup-20261026-171141
2. scale 旧 Deployment → 0,等 Pod 消失
3. 复制 Secret(JWT sha256 校验一致)
4. 新建 PVC lokistack-data(Bound 30Gi cbs)
5. 临时 Pod 恢复数据(chown 1000:1000,opsxloki.json 保留 0600)
6. apply 新 Deployment → 1/1 Running
7. 修复 Ingress 后端(TKE qcloud 要求 NodePort)→ CLB 恢复 200
8. 删除旧 Deployment / 失效 Service
【验证】
lokistack 1/1,0 重启,镜像 lghost/lokistack:latest(statically linked)
/api/v1/health → {"status":"ok","version":"2.0.0"}
/app/data/opsxloki.json 610B 完整(admin 用户 + 配置)
http://log.astx.club/ → HTTP 200
镜像加固:admin123=0、/app/backend/=0、initial-admin-password.txt 存在
【回滚兜底(建议 7 天后删)】
pvc/opsxloki-data、secret/opsxloki-secrets
【文档】
README 新增「从 opsx-loki 升级」章节:
K8s 七步迁移脚本 + docker-compose 卷迁移命令
This commit is contained in:
1 parent
b65dcc9677
commit
3c9388658b
13 files changed
+230
-152
No files matched your search
+26
-26
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# ============================================================================
|
||||
# opsx-loki 一键部署
|
||||
# lokistack 一键部署
|
||||
#
|
||||
# 自动适配:阿里云 ACK / 腾讯云 TKE / AWS EKS / 华为云 CCE / GCP GKE / 自建 K8s
|
||||
# 命名空间固定:log
|
||||
@@ -94,10 +94,10 @@ resolve_storage_class() {
|
||||
#
|
||||
# 代价:数据固定在一台节点,节点损毁需从备份恢复(README 有 CSI 备份说明)
|
||||
# ============================================================================
|
||||
LOCAL_SC_NAME="opsxloki-local"
|
||||
LOCAL_PV_NAME="opsxloki-data-pv"
|
||||
LOCAL_SC_NAME="lokistack-local"
|
||||
LOCAL_PV_NAME="lokistack-data-pv"
|
||||
LOCAL_PV_SIZE="${PV_SIZE:-30Gi}"
|
||||
LOCAL_PV_PATH="${PV_PATH:-/var/lib/opsxloki-data}"
|
||||
LOCAL_PV_PATH="${PV_PATH:-/var/lib/lokistack-data}"
|
||||
|
||||
pick_local_node() {
|
||||
if [ -n "${NODE_NAME:-}" ]; then echo "${NODE_NAME}"; return 0; fi
|
||||
@@ -129,7 +129,7 @@ kind: PersistentVolume
|
||||
metadata:
|
||||
name: ${LOCAL_PV_NAME}
|
||||
labels:
|
||||
app: opsx-loki
|
||||
app: lokistack
|
||||
spec:
|
||||
capacity:
|
||||
storage: ${LOCAL_PV_SIZE}
|
||||
@@ -157,7 +157,7 @@ EOF
|
||||
}
|
||||
|
||||
CLOUD="$(detect_cloud)"
|
||||
info "opsx-loki 部署开始(namespace: ${NS})"
|
||||
info "lokistack 部署开始(namespace: ${NS})"
|
||||
info "集群: $(kubectl config current-context 2>/dev/null || echo unknown)"
|
||||
info "平台: ${CLOUD}"
|
||||
|
||||
@@ -219,11 +219,11 @@ rand_hex() {
|
||||
fi
|
||||
}
|
||||
|
||||
if kubectl -n "${NS}" get secret opsxloki-secrets >/dev/null 2>&1; then
|
||||
info "Secret opsxloki-secrets 已存在,跳过(不覆盖现有密钥)"
|
||||
if kubectl -n "${NS}" get secret lokistack-secrets >/dev/null 2>&1; then
|
||||
info "Secret lokistack-secrets 已存在,跳过(不覆盖现有密钥)"
|
||||
else
|
||||
info "生成随机密钥 JWT_SECRET / ENCRYPTION_KEY"
|
||||
kubectl -n "${NS}" create secret generic opsxloki-secrets \
|
||||
kubectl -n "${NS}" create secret generic lokistack-secrets \
|
||||
--from-literal=JWT_SECRET="$(rand_hex)" \
|
||||
--from-literal=ENCRYPTION_KEY="$(rand_hex)" >/dev/null
|
||||
ok "Secret 已创建"
|
||||
@@ -256,33 +256,33 @@ fi
|
||||
# 5) 等待就绪(失败时给出按云定制的诊断)
|
||||
# ============================================================================
|
||||
info "等待 Deployment 就绪(最多 180 秒)..."
|
||||
if ! kubectl -n "${NS}" rollout status deployment/opsx-loki --timeout=180s; then
|
||||
if ! kubectl -n "${NS}" rollout status deployment/lokistack --timeout=180s; then
|
||||
echo ""
|
||||
warn "部署未在 180 秒内就绪,开始诊断:"
|
||||
echo ""
|
||||
kubectl -n "${NS}" get po -l app=opsx-loki -o wide 2>/dev/null | sed 's/^/ /'
|
||||
kubectl -n "${NS}" get po -l app=lokistack -o wide 2>/dev/null | sed 's/^/ /'
|
||||
|
||||
REASON=$(kubectl -n "${NS}" get po -l app=opsx-loki -o jsonpath='{.items[0].status.containerStatuses[0].state.waiting.reason}' 2>/dev/null || true)
|
||||
REASON=$(kubectl -n "${NS}" get po -l app=lokistack -o jsonpath='{.items[0].status.containerStatuses[0].state.waiting.reason}' 2>/dev/null || true)
|
||||
echo ""
|
||||
case "${REASON}" in
|
||||
ImagePullBackOff|ErrImagePull)
|
||||
warn "镜像拉取失败(${REASON})"
|
||||
echo " → 当前镜像: $(grep -E '^\s+image:' "${DIR}/deployment.yaml" | head -1 | awk '{print $2}')"
|
||||
echo " → 该节点拉不到 Docker Hub。请改为目标云可拉的仓库后重跑:"
|
||||
echo " 腾讯云 TCR : ccr.ccs.tencentyun.com/<ns>/opsxloki:latest"
|
||||
echo " 阿里云 ACR : registry.cn-hangzhou.aliyuncs.com/<ns>/opsxloki:latest"
|
||||
echo " 华为云 SWR : swr.cn-north-4.myhuaweicloud.com/<ns>/opsxloki:latest"
|
||||
echo " 自建 Harbor: harbor.your.domain/library/opsxloki:latest"
|
||||
echo " 腾讯云 TCR : ccr.ccs.tencentyun.com/<ns>/lokistack:latest"
|
||||
echo " 阿里云 ACR : registry.cn-hangzhou.aliyuncs.com/<ns>/lokistack:latest"
|
||||
echo " 华为云 SWR : swr.cn-north-4.myhuaweicloud.com/<ns>/lokistack:latest"
|
||||
echo " 自建 Harbor: harbor.your.domain/library/lokistack:latest"
|
||||
;;
|
||||
CreateContainerConfigError)
|
||||
warn "容器配置缺失(通常是 Secret 不存在)"
|
||||
echo " → 检查: kubectl -n ${NS} get secret opsxloki-secrets"
|
||||
echo " → 检查: kubectl -n ${NS} get secret lokistack-secrets"
|
||||
;;
|
||||
"")
|
||||
PVC_PHASE=$(kubectl -n "${NS}" get pvc opsxloki-data -o jsonpath='{.status.phase}' 2>/dev/null || echo unknown)
|
||||
PVC_PHASE=$(kubectl -n "${NS}" get pvc lokistack-data -o jsonpath='{.status.phase}' 2>/dev/null || echo unknown)
|
||||
if [ "${PVC_PHASE}" != "Bound" ]; then
|
||||
warn "PVC 未绑定(phase=${PVC_PHASE})"
|
||||
echo " → 检查 StorageClass: kubectl -n ${NS} describe pvc opsxloki-data"
|
||||
echo " → 检查 StorageClass: kubectl -n ${NS} describe pvc lokistack-data"
|
||||
echo " → ${CLOUD} 建议的 SC:"
|
||||
case "${CLOUD}" in
|
||||
腾讯云*) echo " cbs" ;;
|
||||
@@ -296,7 +296,7 @@ if ! kubectl -n "${NS}" rollout status deployment/opsx-loki --timeout=180s; then
|
||||
esac
|
||||
|
||||
echo ""
|
||||
kubectl -n "${NS}" describe po -l app=opsx-loki 2>/dev/null | tail -15 | sed 's/^/ /'
|
||||
kubectl -n "${NS}" describe po -l app=lokistack 2>/dev/null | tail -15 | sed 's/^/ /'
|
||||
die "部署未完成,请按上面提示处理"
|
||||
fi
|
||||
ok "Deployment 已就绪"
|
||||
@@ -304,24 +304,24 @@ ok "Deployment 已就绪"
|
||||
# ============================================================================
|
||||
# 6) 输出访问信息
|
||||
# ============================================================================
|
||||
POD=$(kubectl -n "${NS}" get po -l app=opsx-loki -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "-")
|
||||
POD_IP=$(kubectl -n "${NS}" get po -l app=opsx-loki -o jsonpath='{.items[0].status.podIP}' 2>/dev/null || echo "-")
|
||||
NODE=$(kubectl -n "${NS}" get po -l app=opsx-loki -o jsonpath='{.items[0].spec.nodeName}' 2>/dev/null || echo "-")
|
||||
POD=$(kubectl -n "${NS}" get po -l app=lokistack -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "-")
|
||||
POD_IP=$(kubectl -n "${NS}" get po -l app=lokistack -o jsonpath='{.items[0].status.podIP}' 2>/dev/null || echo "-")
|
||||
NODE=$(kubectl -n "${NS}" get po -l app=lokistack -o jsonpath='{.items[0].spec.nodeName}' 2>/dev/null || echo "-")
|
||||
|
||||
echo ""
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
ok "opsx-loki 部署完成"
|
||||
ok "lokistack 部署完成"
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo " 平台 : ${CLOUD}"
|
||||
echo " Namespace : ${NS}"
|
||||
echo " 存储类 : ${RESOLVED_SC}"
|
||||
echo " Pod : ${POD} (node=${NODE} ip=${POD_IP})"
|
||||
echo " Service : opsx-loki.${NS}.svc.cluster.local:8080"
|
||||
echo " Service : lokistack.${NS}.svc.cluster.local:8080"
|
||||
[ "${WITH_NODEPORT}" = "1" ] && echo " NodePort : <任意节点IP>:30080"
|
||||
echo ""
|
||||
echo " 初始账号 : admin / admin123 ← 首次登录请立即改密"
|
||||
echo ""
|
||||
echo " 本地访问 : kubectl -n ${NS} port-forward svc/opsx-loki 8080:8080"
|
||||
echo " 本地访问 : kubectl -n ${NS} port-forward svc/lokistack 8080:8080"
|
||||
echo " 浏览器打开 http://localhost:8080"
|
||||
echo ""
|
||||
echo " 配 Ingress(可选,先跑 WITH_NODEPORT=1 bash install.sh):"
|
||||
|
||||
Reference in new issue
Block a user