Kubernetes 환경에서 SysMasterDB를 기동 / 로그 확인 / 종료 / 초기화하는 방법이다.
클러스터 사전 준비(setup-once.sh)가 완료된 상태에서, 배포 파일이 위치한 디렉터리에서 아래 명령을 수행하면 전체 스택이 배포된다.
kubectl apply -k kubernetes적용 전에 최종 결과를 확인하려면 아래 명령을 사용한다.
kubectl kustomize kubernetes # 병합된 매니페스트 출력
kubectl apply -k kubernetes --dry-run=server # 클러스터 검증만 수행기동 순서는 별도로 제어할 필요가 없다. 각 모듈이 자신의 의존 대상이 준비될 때까지 대기하므로 아래 순서로 준비된다.
1. metadb, repodb, zookeeper, client-tibero (의존 대상 없음)
2. broker (zookeeper 필요)
3. sdm (metadb, repodb 필요)
4. analyzer, dbmanager, chatbot (sdm 필요)
5. collector (sdm, analyzer 필요)
6. client-gateway (sdm, dbmanager, collector 필요)최초 배포는 데이터베이스 초기화로 인해 전체가 준비되기까지 수 분이 소요된다.
kubectl -n sysmasterdb get pods전 모듈에 헬스 체크가 설정되어 있어 1/1 Running으로 표시되면 실제로 요청을 처리할 수 있는 상태를 의미한다. 별도로 기동 완료 로그를 확인할 필요가 없다.
파드가 계속 준비되지 않는 경우 아래로 원인을 확인한다.
kubectl -n sysmasterdb describe pod {파드명} # Events 항목에서 실패 사유 확인
kubectl -n sysmasterdb logs {파드명}
kubectl -n sysmasterdb logs {파드명} --previous # 재시작 직전 로그kubectl -n sysmasterdb get svc client-gateway할당된 EXTERNAL-IP로 브라우저에서 https://{EXTERNAL-IP} 로 접속한다. 사이트 인증서를 반입하지 않은 경우 브라우저에 인증서 경고가 표시되는 것은 정상이다.
각 컨테이너의 표준 출력 로그는 아래 명령으로 확인할 수 있다.
다만 각 모듈의 애플리케이션 로그는 표준 출력이 아니라 컨테이너 내 /sysmaster/logs 경로의 로그 파일에 적재되므로, 상세 로그는 아래와 같이 확인한다.
셸 도구가 없는 파드를 조사할 때는 함께 제공되는 유틸리티 이미지를 사용한다. kubectl debug는 파드 이름만 받으므로 디플로이먼트 이름을 전달하면 실패한다.
라이선스는 sdm-license Secret으로만 주입되며, 파드를 재시작하지 않고 교체할 수 있다. 아래 세 단계를 순서대로 수행한다.
Secret을 교체해도 파드 안의 파일이 즉시 바뀌지는 않는다. 아래 명령의 출력이 새 라이선스의 값으로 바뀔 때까지 기다린다(반영에 최대 1분 소요).
정상적으로 갱신되면 아래와 같이 응답한다. expirationDate가 새 라이선스의 만료일과 일치해야 갱신이 완료된 것이다.
특정 모듈만 재시작하는 경우는 다음과 같다.
아래 명령으로 워크로드만 삭제하면 SysMasterDB가 종료된다. 이때 Meta DB와 Repository DB의 데이터 파일은 PVC에 유지되므로, 다시 기동하면 이전에 저장한 데이터를 사용할 수 있다.
다시 기동할 때는 kubectl apply -k kubernetes만 수행한다.
아래 데이터는 PVC 3종에만 존재하며 제품이 생성하는 사본은 없다. 초기화를 수행하기 전에 반드시 백업한다.
스토리지 계층 백업(CSI VolumeSnapshot 등)을 권장한다. 대상 볼륨은 아래로 확인한다.
아래 명령을 수행하면 네임스페이스를 포함한 모든 오브젝트와 데이터가 삭제되고, 최초 설치 상태와 동일하게 동작한다.
실수로 삭제하더라도 데이터가 보존되도록 하려면, 배포 직후 PVC에 연결된 PV의 reclaim 정책을 Retain으로 변경해 둔다.
sdm-license Secret
위 절차 (재시작 불필요)
meta.conf / repo.conf
데이터베이스 최초 초기화 시에만 사용된다. 이미 초기화된 데이터베이스에는 반영되지 않는다
sdm이 기동하지 않음
라이선스 Secret 없음, 또는 라이선스 version이 1.1이 아님
setup-once.sh 실행 여부 확인
sdm이 데이터베이스에 접속하지 못함
meta.conf / repo.conf의 암호와 Secret 값 불일치
두 값을 동일하게 설정
UI 접속 시 502
NGINX_RESOLVER가 실제 클러스터 DNS 주소와 다름
kubectl get svc kube-dns -n kube-system
sdm이 데이터베이스를 계속 대기
metadb / repodb 서비스에서 7000 포트 누락
서비스 정의 확인
배포가 완료되지 않음
strategy: Recreate 설정을 제거함
원복
파드가 계속 OOMKilled
메모리 limits 부족, 또는 JVM 힙이 limits에 비해 큼
두 값을 함께 상향
Kafka Too many open files
노드의 파일 디스크립터 한계가 낮음
노드에서 nofile 65536 이상으로 설정
대시보드가 비어 있음
TPM Agent가 collector-ingest에 도달하지 못함
EXTERNAL-IP와 Agent 설정 주소 확인
client-gateway만 CrashLoopBackOff
로그 볼륨 마운트를 제거했거나 HTTPS 인증서 파일명이 다름
kubectl logs deploy/client-gateway --previous 로 nginx 오류 메시지 확인
ConfigMap을 변경했는데 반영되지 않음
ConfigMap 이름이 동일해 파드 스펙이 변경되지 않음
kubectl -n sysmasterdb rollout restart deploy
오버레이 추가 후 기존 UI/수집이 중단
kustomization.yml에 resources: / patches: 키를 중복 작성
「Kubernetes 환경」 문서의 매니페스트 구성의 주의 사항 참고
kubectl -n sysmasterdb logs deployment/sdm # 터미널 출력 로그
kubectl -n sysmasterdb logs deployment/sdm -f # 실시간 확인kubectl -n sysmasterdb exec deployment/sdm -- ls /sysmaster/logs
kubectl -n sysmasterdb exec deployment/sdm -- sh -c 'tail -f /sysmaster/logs/sdm.v.{version}.log'POD=$(kubectl -n sysmasterdb get pod -l app=sdm -o jsonpath='{.items[0].metadata.name}')
kubectl -n sysmasterdb debug -it "$POD" \
--image={registry}/sysmaster-db-alpine-linux:{version} --target=sdmkubectl create secret generic sdm-license -n sysmasterdb \
--from-file=sysmaster-db-license.xml=/path/to/new-license.xml \
--dry-run=client -o yaml | kubectl apply -f -kubectl -n sysmasterdb exec deploy/sdm -- grep serial_id /sysmaster/license/sysmaster-db-license.xmlkubectl -n sysmasterdb exec deploy/sdm -- refresh-license{"message":"License store refresh succeeded.","licenseType":"SUBSCRIPTION","maxMonitoringCores":1000,"expirationDate":"..."}kustomization.yml (이미지, patch 등)
kubectl apply -k kubernetes
디플로이먼트의 env 항목
kubectl apply -k kubernetes (파드가 자동 교체된다)
smdb-env ConfigMap
kubectl -n sysmasterdb rollout restart deploy/sdm
kubectl -n sysmasterdb rollout status deploy/sdmkubectl -n sysmasterdb delete deploy,svc --all
kubectl -n sysmasterdb get pvc # 3개가 Bound 상태로 남아 있어야 한다metadb-data
설정, 계정, 관제 대상 목록
repodb-data
수집된 메트릭 전체
sdm-reports
kubectl -n sysmasterdb get pvc -o custom-columns=PVC:.metadata.name,PV:.spec.volumeNamekubectl delete -k kubernetes
kubectl get ns sysmasterdb # NotFound 가 될 때까지 대기한다
kubectl get pv | grep sysmasterdb # 남아 있으면 스토리지 정책에 따라 처리한다for pvc in metadb-data repodb-data sdm-reports; do
pv=$(kubectl -n sysmasterdb get pvc "$pvc" -o jsonpath='{.spec.volumeName}')
kubectl patch pv "$pv" -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
done전체 파드 ImagePullBackOff
레지스트리 주소 미수정, 또는 인증 필요
kustomization.yml의 newName 확인 / 사설 레지스트리 인증 구성 추가
전체 파드 Pending
PVC가 Pending (default StorageClass 없음)
kubectl -n sysmasterdb get events --sort-by=.lastTimestamp | tail -30kubectl apply -k kubernetes 후 kubectl -n sysmasterdb rollout restart deploy
생성된 리포트 파일
kubectl -n sysmasterdb get pvc