LEGACY SITE
BlackCode · Original Git Blog
신규 디자인 적용 전 사용하던 Jekyll 블로그의 HUD 기반 메인 디자인과 원본 소스를 보존합니다.
ARCHIVE
긴 장애 분석, 운영 기록, 기술 의사결정과 실험 결과를 보관합니다.
LEGACY SITE
신규 디자인 적용 전 사용하던 Jekyll 블로그의 HUD 기반 메인 디자인과 원본 소스를 보존합니다.
기존 _posts 231개 중 43개를 현재 전문성과 연결되는 기술 기록으로 선별하여 05 EXPERTISE에 이관했습니다.
초급 학습노트, 개발일지, README/교재 부속파일, 휴지통, 작성 중 문서는 신규 Expertise에서 제외했으며 원본은 legacy-blog-source/에 보존했습니다.
content/05_EXPERTISE/07_SOFTWARE_ENGINEERING/legacy-java-04.mdcontent/05_EXPERTISE/07_SOFTWARE_ENGINEERING/legacy-java-03.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-terraform-1.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-terraform-2.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-terraform-3.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-terraform-4.mdcontent/05_EXPERTISE/01_MICROSOFT_FABRIC/legacy-ms-01.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-jenkins-03.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-jenkins-02.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-jenkins-01.mdcontent/05_EXPERTISE/03_AZURE_CLOUD/legacy-azure-22.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-azure-17.mdcontent/05_EXPERTISE/03_AZURE_CLOUD/legacy-azure-06.mdcontent/05_EXPERTISE/03_AZURE_CLOUD/legacy-azure-21.mdcontent/05_EXPERTISE/03_AZURE_CLOUD/legacy-azure-07.mdcontent/05_EXPERTISE/03_AZURE_CLOUD/legacy-azure-05.mdcontent/05_EXPERTISE/05_NETWORK/legacy-azure-19.mdcontent/05_EXPERTISE/07_SOFTWARE_ENGINEERING/legacy-spring-02.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-kubernetes-02.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-kubernetes-01.mdcontent/05_EXPERTISE/07_SOFTWARE_ENGINEERING/legacy-springboot-1.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-devops-04.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-devops-07.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-devops-02.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-devops-03.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-devops-01.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-devops-05.mdcontent/05_EXPERTISE/06_DEVOPS_AUTOMATION/legacy-docker-01.mdcontent/05_EXPERTISE/05_NETWORK/legacy-etc-2.mdcontent/05_EXPERTISE/08_DATA_DATABASE/legacy-database-01.mdcontent/05_EXPERTISE/08_DATA_DATABASE/legacy-it-uc6a9-uc5b4-2.mdcontent/05_EXPERTISE/09_ARCHITECTURE_MSA/legacy-msa-inflearn-01.mdcontent/05_EXPERTISE/09_ARCHITECTURE_MSA/legacy-msa-inflearn-00.mdcontent/05_EXPERTISE/09_ARCHITECTURE_MSA/legacy-msa-inflearn-02.mdcontent/05_EXPERTISE/08_DATA_DATABASE/legacy-langchain-00.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-ttabae-learn-11.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-ttabae-learn-09.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-ttabae-learn-19.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-ttabae-learn-12.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-ttabae-learn-07.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-ttabae-learn-15.mdcontent/05_EXPERTISE/02_KUBERNETES_AKS/legacy-ttabae-learn-08.mdcontent/05_EXPERTISE/03_AZURE_CLOUD/legacy-azureerror-1.md엔터프라이즈 고객 Enterprise AI/Data Platform / AI Application Platform 환경에서 실제로 다룬 Microsoft Fabric / AKS / GitLab CI/CD / ArgoCD / Network / Identity / Monitoring 이슈를 결과만 나열하지 않고 Symptom → Analysis → Cause → Action → Validation 순서로 기록합니다. Career/Project 본문에는 대표 성과를 남기고, 이 문서는 실제 운영 과정에서 어떤 방식으로 문제 범위를 좁혔는지를 보존하는 원천 기록입니다.
Fabric Admin Activity Events API를 Service Principal로 호출했을 때 초기에는 403 API not accessible가 발생했고, 접근 조건 보완 후에는 400 BadRequest가 발생했습니다.
인증 실패와 Request Parameter 오류를 동일 문제로 보지 않고 단계적으로 분리했습니다. Service Principal/App Registration, Fabric 관리 권한, Tenant/Capacity 조건을 먼저 확인하고 API 접근이 가능해진 이후 Request Date Format을 재검토했습니다.
운영 자동화 과정에서 Not authorized, Invalid tenant ID, apfabricdwquerylog.blob.core.windows.net DNS resolve failure 등 서로 다른 오류가 발생했습니다.
API 인증, Tenant 설정, Storage Network를 각각 별도 계층으로 분리했습니다. 동일 Notebook 실패라도 Token 발급 단계인지 API 호출 단계인지, Storage FQDN 이름해석 단계인지를 로그로 구분했습니다.
인증 문제와 Network/DNS 문제를 구분할 수 있는 진단 포인트를 추가하여 운영 장애의 원인 범위를 빠르게 좁힐 수 있도록 했습니다.
AKS 환경에서 Event Hub 연결 시 AMQP TLS Port 5671 경로가 차단되어 Autoscale POC의 이벤트 수신이 정상적으로 이루어지지 않았습니다.
Event Hub Namespace, Consumer Group, Capacity Event 발생 여부와 Network Port를 분리 확인했습니다. 로컬 환경에서는 수신 가능하고 AKS에서만 제한되는 점을 통해 애플리케이션 로직보다 Network Policy를 우선 의심했습니다.
*.servicebus.windows.net Endpoint 확인기업 Network에서 허용되는 443 경로를 사용하여 Event Hub 이벤트 수신을 검증했고, Dynamic Autoscale 데이터 흐름에 적용할 수 있는 통신 방식을 확보했습니다.
기존에는 시간표 기반 Capacity Control Runbook이 SKU를 관리하고 있었고, 여기에 Utilization 기반 Dynamic Autoscale을 그대로 추가하면 동일 Capacity를 두 Controller가 동시에 변경할 가능성이 있었습니다.
PRD apprdaifabric에서 F32 상태와 Rolling 평균 [22.81% × 5]를 기준으로 Scale Down 조건이 충족되어 F16으로 변경되는 실제 실행 로그를 확인했습니다. 적용 후 약 일주일 동안 Schedule CronJob과 Dynamic CronJob의 충돌 없이 동작하는지 모니터링했습니다.
기존 Schedule 기반 CronJob이 특정 월요일 업무 시작 시 정상 동작하지 않는 현상을 확인했습니다.
Schedule Capacity Control과 Fabric Stop/Start 관리용 Active CronJob의 실행 시점이 모두 08:00 부근에 위치해 있어 동시 실행 가능성을 점검했습니다.
원인 확정 전에는 추측으로 단정하지 않고 기존 Runbook 코드와 실행 로그를 추가 확인하는 방향으로 정리했으며, 업무 시작 Baseline 적용 시간을 08:15 등으로 분리하는 방안도 검토했습니다.
Fabric Capacity에서 429/Throttling이 발생할 때 단순 API 오류로 처리하지 않고 Capacity 부하, Workload 실행량, 호출 패턴, SKU 및 운영시간대를 함께 확인했습니다. Capacity 운영정책과 실제 Utilization을 함께 보는 경험은 이후 Dynamic Autoscale/FinOps 설계와 연결되었습니다.
Fabric Item Publish 과정에서 404 오류가 발생했습니다.
API 자체 장애보다 대상 Resource/Item 식별값과 입력정보를 먼저 검토했고, 명칭/입력값의 오타를 수정했습니다.
Security-Gorvernance-poc-DA Publish가 정상 완료되는 것을 확인했습니다.
OPDG를 통해 Azure Blob Storage Connection을 생성할 때 Invalid connection credentials (400)가 발생했습니다.
Service Principal 방식의 Client ID/Secret/RBAC뿐 아니라 Gateway가 지원하는 인증방식과 실제 Connection Credential 처리방식을 비교했습니다. Network/IP/Firewall/MPEP 승인 상태도 함께 확인했습니다.
인증 방식을 Organization으로 변경한 뒤 연결이 정상 생성되는 것을 확인했습니다. 이 과정에서 Network 문제와 Credential/Authentication 문제를 분리 검증했습니다.
Fabric/데이터 연계 과정에서 Snowflake 로그인 단계의 EOF 오류를 확인하고, Connection Credential, Network Path, 인증방식을 중심으로 원인 범위를 분리했습니다. 연결 자체의 성공 여부만 보는 것이 아니라 어느 단계에서 Session이 종료되는지 확인하는 방식으로 접근했습니다.
apprdaiacrgenai.azurecr.io/apne2-devops-demo-aibe-ok-release:253961 Image Pull에서 ImagePullBackOff / NotFound가 발생했습니다.
ACR 접근권한 문제와 Image 자체 부재를 구분하기 위해 Kubernetes Event의 실제 Registry 응답을 확인했습니다. failed to resolve reference ... NotFound를 기준으로 Repository/Tag와 CI Build/Push 결과, Helm Values의 Image Reference를 대조했습니다.
Pod 자체나 AKS Scheduling 문제가 아니라 배포 Manifest가 참조하는 Registry Image 존재 여부 문제로 원인 범위를 좁혔습니다.
spec.selector ImmutableArgoCD Sync에서 Deployment.apps "demo-aibe-keyword-extractor-system" spec.selector: Invalid value ... field is immutable 오류가 발생했습니다.
Helm Helper의 fullname 변경 전후와 기존 Deployment selector/label을 비교했습니다. Kubernetes Deployment의 Selector는 생성 이후 변경할 수 없는 필드이므로 단순 Patch/Sync로 해결할 수 없는 변경임을 확인했습니다.
-system 명칭 변경과 기존 Resource의 Selector 관계를 확인하고, 기존 Deployment 재생성이 필요한 변경으로 판단했습니다.
failed to list refs ... context deadline exceeded로 ArgoCD가 Helm Repository Target State를 생성하지 못했습니다.
Repository 설정 오류와 Network 접근 제한을 분리해서 확인할 수 있도록 진단 경로를 정리했습니다.
Network 접근 문제를 조치한 뒤에는 HTTP Basic: Access denied가 발생했습니다. 이는 이전 Timeout과 다른 계층의 문제로 판단하고 GitLab Token/Repository 권한, Credential 등록 방식 및 Token Scope를 확인했습니다. 하나의 배포 장애에서 Network 문제 해결 후 Authentication 문제가 드러나는 과정을 단계적으로 분석했습니다.
GitLab CI Build 과정에서 GradleWrapperMain ClassNotFound가 발생했습니다.
Pipeline Runner/JDK 문제로 단정하지 않고 Repository에 gradlew, gradle/wrapper/gradle-wrapper.jar, properties 등 Wrapper 구성파일이 실제 존재하는지 확인했습니다.
Wrapper만 임의 생성하여 다른 누락 파일까지 확산시키기보다 프로젝트 담당자에게 정상 Source/Wrapper 복구를 요청할 필요가 있는 상태로 정리했습니다.
0/8 nodes are available와 함께 untolerated taint {proj: data-highway}, {CriticalAddonsOnly: true}, {proj: aibc}, Insufficient cpu가 동시에 나타났습니다.
Application 기동 실패가 아니라 Scheduler가 Pod를 배치할 Node를 찾지 못한 문제로 판단했습니다. Node Taint와 Pod Toleration, Resource Request, Node 가용 CPU를 각각 확인했습니다.
Toleration 미설정 Node와 CPU 부족 Node를 구분하여 Cluster Placement/Capacity 문제로 원인 범위를 좁혔습니다.
STG에서 Batch Pod가 Spring Banner 출력 이후 종료되고 Job이 정상적으로 유지되지 않았습니다. DEV는 정상 동작했습니다.
동일 Application의 DEV/STG 차이를 기준으로 Helm Values와 Environment Parameter를 비교했습니다. Kubernetes Event에서 Scheduled/Created/Pulled/Started까지 정상인 점을 통해 Image Pull/Scheduling보다 Application Environment 설정을 우선 확인했습니다.
Values의 status 값이 STG에서 기대값과 다르게 설정된 부분을 stg → qa로 수정한 후 정상 실행을 확인했습니다.
AI Application Platform 신규 서비스 구축 과정에서 Application과 ServiceAccount가 ArgoCD에 함께 표시되는 경우를 분석하고 .Values.serviceAccount.create 조건과 Template 생성 여부를 확인했습니다. HPA가 활성화된 Deployment에서 replicas를 직접 선언하지 않는 Helm 조건문, minReplicas/maxReplicas, CronJob suspend, concurrencyPolicy, backoffLimit, activeDeadlineSeconds 등 Resource별 운영 설정도 함께 검토했습니다.
STG/PRD Dashboard 상단 Variable Parameter가 빈값으로 전달되고, PRD에서는 400 Bad Request / SyntaxError at ')'가 발생했습니다.
$__timeFilter(TimeGenerated) 적용ResourceId, PodNamespace, LabelsJson, LabelName, LabelValue 기준 Query 확인isnotempty(LabelValue) 및 distinct LabelValue 조건 적용STG는 정상화했고, PRD는 LabelValue가 빈값으로 반환되는 원인을 추가 추적하는 상태로 구분했습니다.
이 프로젝트에서 반복적으로 사용한 접근 방식은 다음과 같습니다.
이 문서는 장애 건수나 성과를 임의로 정량화하지 않고 실제 대화/작업에서 확인된 증상, 분석, 조치 및 검증 결과를 계속 누적합니다.