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
@@ -7,7 +7,7 @@
|
||||
```bash
|
||||
kubectl create namespace log # 已存在可跳过
|
||||
|
||||
kubectl -n log create secret generic opsxloki-secrets \
|
||||
kubectl -n log create secret generic lokistack-secrets \
|
||||
--from-literal=JWT_SECRET="$(openssl rand -hex 32)" \
|
||||
--from-literal=ENCRYPTION_KEY="$(openssl rand -hex 32)"
|
||||
```
|
||||
@@ -23,7 +23,7 @@ kubectl -n log create secret generic opsxloki-secrets \
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: opsxloki-data
|
||||
name: lokistack-data
|
||||
namespace: log
|
||||
spec:
|
||||
accessModes: [ReadWriteOnce]
|
||||
@@ -64,12 +64,12 @@ kubectl apply -f kubernetes/namespace.yaml \
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: opsx-loki
|
||||
name: lokistack
|
||||
namespace: log
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: opsx-loki
|
||||
app: lokistack
|
||||
ports:
|
||||
- name: http
|
||||
port: 8080
|
||||
@@ -89,7 +89,7 @@ metadata:
|
||||
name: loki.xxx.io
|
||||
namespace: log
|
||||
labels:
|
||||
app: opsx-loki
|
||||
app: lokistack
|
||||
spec:
|
||||
ingressClassName: alb
|
||||
rules:
|
||||
@@ -100,7 +100,7 @@ spec:
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: opsx-loki
|
||||
name: lokistack
|
||||
port:
|
||||
number: 8080
|
||||
```
|
||||
@@ -120,7 +120,7 @@ JSON DB 是单文件,迁移时先停旧实例,再写入 PVC:
|
||||
|
||||
```bash
|
||||
# 1) 缩容到 0,避免应用关机时覆盖
|
||||
kubectl -n log scale deploy/opsx-loki --replicas=0
|
||||
kubectl -n log scale deploy/lokistack --replicas=0
|
||||
|
||||
# 2) 临时 Pod 挂 PVC 拷数据(与业务 Pod 同节点,RWO 盘才能挂上)
|
||||
kubectl apply -f - <<'EOF'
|
||||
@@ -137,14 +137,14 @@ spec:
|
||||
volumeMounts: [{name: data, mountPath: /data}]
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim: {claimName: opsxloki-data}
|
||||
persistentVolumeClaim: {claimName: lokistack-data}
|
||||
EOF
|
||||
|
||||
kubectl -n log cp ./opsxloki.json pvc-loader:/data/opsxloki.json
|
||||
kubectl -n log cp ./known_hosts pvc-loader:/data/known_hosts
|
||||
|
||||
kubectl -n log delete pod pvc-loader
|
||||
kubectl -n log scale deploy/opsx-loki --replicas=1
|
||||
kubectl -n log scale deploy/lokistack --replicas=1
|
||||
```
|
||||
|
||||
> 不要在业务 Pod 运行时 `kubectl cp` 覆盖 DB:应用退出时会用内存数据回写,覆盖你拷进去的文件。
|
||||
@@ -153,15 +153,15 @@ kubectl -n log scale deploy/opsx-loki --replicas=1
|
||||
|
||||
```bash
|
||||
kubectl -n log get pods,pvc,svc,ingress
|
||||
kubectl -n log logs deploy/opsx-loki --tail=20
|
||||
kubectl -n log exec deploy/opsx-loki -- wget -qO- http://127.0.0.1:8080/api/v1/health
|
||||
kubectl -n log logs deploy/lokistack --tail=20
|
||||
kubectl -n log exec deploy/lokistack -- wget -qO- http://127.0.0.1:8080/api/v1/health
|
||||
```
|
||||
|
||||
## 8. 升级
|
||||
|
||||
```bash
|
||||
kubectl -n log set image deploy/opsx-loki opsx-loki=lghost/lokistack:v0.2
|
||||
kubectl -n log rollout status deploy/opsx-loki
|
||||
kubectl -n log set image deploy/lokistack lokistack=lghost/lokistack:v0.2
|
||||
kubectl -n log rollout status deploy/lokistack
|
||||
```
|
||||
|
||||
`Recreate` 会先停旧 Pod 再起新 Pod,期间平台短暂不可用(单写者约束的代价)。
|
||||
@@ -183,13 +183,13 @@ metadata:
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: opsx-loki
|
||||
name: lokistack
|
||||
namespace: log
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
name: opsx-loki
|
||||
name: lokistack
|
||||
namespace: log
|
||||
rules:
|
||||
- apiGroups: [""]
|
||||
@@ -205,34 +205,34 @@ rules:
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: opsx-loki
|
||||
name: lokistack
|
||||
namespace: log
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: opsx-loki
|
||||
name: lokistack
|
||||
namespace: log
|
||||
roleRef:
|
||||
kind: Role
|
||||
name: opsx-loki
|
||||
name: lokistack
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: opsx-loki-token
|
||||
name: lokistack-token
|
||||
namespace: log
|
||||
annotations:
|
||||
kubernetes.io/service-account.name: opsx-loki
|
||||
kubernetes.io/service-account.name: lokistack
|
||||
type: kubernetes.io/service-account-token
|
||||
EOF
|
||||
|
||||
kubectl -n log get secret opsx-loki-token -o jsonpath='{.data.token}' | base64 -d
|
||||
kubectl -n log get secret lokistack-token -o jsonpath='{.data.token}' | base64 -d
|
||||
```
|
||||
|
||||
- 这个 Token **不会自动过期**,但只绑定 `log` 命名空间的 Role:能操作该命名空间的 Pod、日志、工作负载、Service、ConfigMap、Secret、PVC,**无权访问其他命名空间和集群级资源**。
|
||||
- 平台展示节点数需要 `nodes` 只读权限;命名空间级 Token 没有该权限时,平台会跳过节点信息,不影响集群接入与部署。
|
||||
- 平台收到 Token 后会转成 kubeconfig,并用 `ENCRYPTION_KEY` 加密存 DB(`ENC:` 前缀),接口不返回明文。
|
||||
- 轮换:删除 Secret 后重建,旧 Token 立即失效。
|
||||
- 如果集群策略要求短期凭证,可改用 `kubectl -n log create token opsx-loki --duration=24h` 定期轮换。
|
||||
- 如果集群策略要求短期凭证,可改用 `kubectl -n log create token lokistack --duration=24h` 定期轮换。
|
||||
- 上面的 Namespace 由管理员创建,平台 Token 本身没有集群级权限;只有确实需要平台自建命名空间时,才额外授予 `namespaces: create/get` 的 ClusterRole(create 无法按名称限制,预建 `log` 更安全)。
|
||||
|
||||
Reference in new issue
Block a user