N U L L U S
파이프라인 구축을,
클릭 몇 번으로
컨테이너 환경의 DevSecOps 파이프라인 자동 구축 플랫폼
CloudBro Ship to Production|
OPEN PROJECT : SEASON III
3차 기술 검증
nullus.io
Apache 2.0
v0.6.0
커뮤니티 코어 프로젝트
Nullus Team · 팀장 박준희
팀 소개Cloud Nullus 6인
세잎 매듭 · trefoil
Null(없음)에서 세 가닥이 서로를 지나 하나로
- 쿠버네티스 · 인프라 · 애플리케이션이 따로 놀지 않고 한 흐름으로
- 개별 조직이 반복하던 파이프라인 구축을 커뮤니티 공동 자산으로
- 검증된 OSS 조합과 설치 순서를 코드와 데이터로 공개 · Apache 2.0
문제 정의수작업 구축에 필요한 160개의 결정
소스부터 인증까지 연동하려면 OSS 20~30종의 선정·버전 정합·순차 설치가 필요하며, 현장에서는 6~18개월이 걸린다
선택
검증된 조합이 없다
CNCF 200여 개 중 어떤 조합이 안전하게 동작하는지 아는 주체가 없다
순서
순서 오류는 후속 단계에서야 드러난다
설치 순서 의존이 겹쳐 있어, 한 단계가 틀리면 한참 뒤 다른 단계에서 증상이 나타난다
전수
인수인계가 안 된다
절차가 스크립트에만 남아, 담당이 바뀌면 해독부터 다시 시작한다
CNCF의 검증된 OSS를 선별하고, 설치 순서·선정 근거·재현 절차를 코드와 데이터로 공개한다
수치는 2차 검증(v0.4.1) 기준. 버전 축은 앱 버전, Helm 차트, 이미지 태그, K8s 호환 범위의 네 가지
7단계 전 구간 지원3차 신규: 보안·복구
전 구간 공통: 백업/복구, 업그레이드, AI 어시스턴트, MCP
보안
배포를 막는 게이트
시크릿 탐지 · SAST · 의존성 · 이미지 스캔
공급망
설치 OSS와 Nullus 이미지
CVE 대응 정책 · SBOM · 서명
운영
백업 · 복구 · 업그레이드
복구 리허설 · 확인된 업그레이드 경로
AI
MCP · 어시스턴트
묻는 사람의 권한으로 조회
2차 검증에서 "다음 과제는 운영 신뢰성"이라고 밝혔고, 이번에 추가한 기능이 그 이행 결과다
v0.5.0 → v0.6.0 개발 현황두 달간 PR 136건
v0.5.0(8/31) 이후 머지된 PR 136건, 커밋 389건
2×
테스트 수 2배 증가
기능 추가와 함께 Go 테스트 함수도 1,576건에서 3,225건으로 확충했다
새 모듈 4backup · notification · mcp · assistant
문서cloud-nullus.github.io/nullus (한국어·영어, 화면 캡처 자동 생성)
측정 기준: 저장소 10/21. Go 테스트 함수는 func Test* 개수, 웹 단위 테스트는 vitest 통과 수
2차 검증 피드백13건 이행 현황
반영 7방안 확정 1로드맵 1백로그 4
| # | 받은 질문 · 피드백 (08-22) | 이슈 (기획 저장소) | 상태 | 장 |
| 01 | 다른 화면으로 가면 진행 중 표시가 없다 | #66 | 반영 | 07 |
| 02 | 인앱 피드백 (좋아요/싫어요 + 화면 캡처) | #67 | 반영 · 방식 바꿈(GitHub 이슈) | 07 |
| 03 | 기존 K8s에 CLI로 통합할 수 있나 (Q5) | #61 | 반영 · MCP 서버 · CLI는 최소 | 13 |
| 04 | AI 어시스턴트 논의가 있는가 (Q3) | #73 · #94 | 반영 · 1단계 조회 | 13 |
| 05 | 운영 모드에서 도입한 도구의 업그레이드 (Q1) | #70 | 반영 · Argo CD부터 | 11 |
| 06 | 10월까지 백업 / 복구 (현장 공표) | #75 | 반영 | 12 |
| 07 | 10월까지 보안 보완 (현장 공표) | #64 · #76~#80 · #65 | 반영 | 08~10 |
| 08 | 설계 문제로 리소스가 폭주할 때 복구 (Q4) | #69 · #99~#107 | 방안 확정 · 1단계 연말까지 | 19 |
| 09 | MLOps 계획과 일정 (Q2) | #71 | 로드맵 드래프트 | 18 |
| 10 | 자체 인프라 시크릿 · BYOK · IdM (Q6) | #68 | 백로그 | 19 |
| 11 | 환경별 도구 조합 추천, 노하우 + AI (Q1) | #72 | 백로그 | 19 |
| 12 | 기구축 환경 연결 · CSP 레퍼런스 파이프라인 (Q6) | #62 | 백로그 | 19 |
| 13 | UI/UX A/B 테스트 | #74 | 백로그 | 19 |
진행 중 작업 알림·피드백즉시 반영 약속 2건 구현
2차 검증 현장에서 "바로 반영"을 약속한 2건을 모두 헤더 기능으로 구현했다
① 진행 중 작업
② 피드백
① #66 · 9월 완료
진행 중 작업 알림
스택 설치·배포 작업이 진행되는 동안 종 아이콘이 움직이고, 드롭다운에 이름·단계·경과 시간을 보여 준다. 누르면 해당 상세 화면으로 이동한다
서버 변경 없이 기존 목록 API 두 개를 조합한다. 진행 중 작업이 있을 때만 3초 간격으로 조회하고, 완료되면 중단한다
② #67 · 10월 완료
피드백 → GitHub 이슈
헤더 아이콘이 저장소 이슈 페이지를 새 탭으로 연다. 접수·분류·답변은 GitHub 이슈에서 처리한다
위젯 대신 이슈 링크를 택한 이유: 화면을 자동 캡처하면 시크릿·토큰이 함께 찍힐 수 있다
파이프라인 보안 게이트 4종심각도 기반 배포 차단
결과만 보여 주면 오픈소스를 붙인 것에 불과하다 — 심각도별 배포 가능 / 불가 정책이 있어야 의미가 있다08-30 팀 회의, 보안 범위를 정하며
1 · 커밋
빌드 전
시크릿 탐지gitleaks
이번 푸시의 커밋에서 시크릿 유출을 찾는다
#80
2 · 락파일
빌드 전
의존성 취약점 (SCA)Trivy fs
취약한 의존성을 빌드 전에 막는다
#79
3 · 소스
SASTSonarQube
Quality Gate를 통과하지 못하면 배포하지 않는다
#64
4 · 이미지
배포 전
이미지 스캔Trivy
정책 등급 이상의 취약점이 있으면 배포 전에 멈춘다
#76
정책: 스택 단위 차단/경고
스캐너 장애는 "차단"과 구분해 표시
GitLab CI · GitHub Actions · Jenkins
실제 실행 기록: 보안 게이트를 포함한 6단계 (10/21 시연)
공급망 보안설치 OSS·릴리즈 이미지 전체 스캔
① 스택이 설치한 OSS · #76 · #78
설치한 이미지를 스캔해 고지하고, 대응 기한은 정책으로 정했다
공용 구성요소(cert-manager, metrics-server, External Secrets)까지 24시간마다 자동 스캔한다. 새 CVE는 외부 노출 여부까지 판정해 알림 채널로 고지하고 첫 고지 시각을 기록한다
에어갭 환경은 반입한 취약점 DB로 스캔하고 DB 기준일을 표시한다
② Nullus 릴리즈 이미지 · #77
릴리즈 이미지는 SBOM·서명 증적과 함께 배포한다
API·Web·Jenkins·SonarScanner 네 이미지에 SBOM(SPDX)과 SLSA provenance(Sigstore 서명)를 붙인다. gh attestation verify로 누구나 검증할 수 있다
릴리즈 태그에서 수정판 있는 CRITICAL이 하나라도 있으면 릴리즈를 중단한다. 10/21 기준 0건
설치 OSS CVE 대응 정책
→
02 · 자동
1차 판정 A~D
수정판 × 심각도 × 외부 노출
→
03 · 자동
고지
알림 채널 · 첫 고지 시각 기록
→
04 · 운영 약속
검증된 업그레이드 기한
A 7일 · B 30일 · C 분기 — 첫 고지부터
탐지 · 판정 · 고지는 제품이 자동으로 하고, 기한은 코드가 세지 않는 운영 약속이다 — 못 지키면 릴리즈 노트 ### Security 에 사유와 목표일을 적는다. 리허설을 거친 업그레이드가 그 CVE 를 고치면 버전 업그레이드 탭이 먼저 보여 준다(검증된 경로는 지금 Argo CD)
보안 대시보드조직 전체 현황과 조치 우선순위
관측성 › 보안 › 보안 대시보드 (#65), 10/21 시연 화면
01조직 전체를 한 화면에
차단된 앱 · 시크릿 탐지 · CRITICAL · 판정 불가 · 설치 OSS 조치 대상
02앱 × 게이트 한 줄
시크릿·의존성·SAST·이미지 판정을 앱마다 한 줄로 보여 주고, 누르면 원인과 리포트로 이동한다
03설치 OSS 탭
스택별 스캔 결과와 가장 심각한 이미지
기존에는 파이프라인·스택 단위로만 조회되어 조직 차원의 조치 우선순위를 파악하기 어려웠다
설치 OSS 업그레이드검증된 경로 기반
DevOps 조직은 5명 → 3명 → 1명으로 줄며 운영 모드로 간다. 그때 가장 어려운 게 도입한 도구의 업그레이드다2차 검증 Q1, 기술 검증 참여자
→
→
03
백그라운드 적용
--atomic --wait
→
→
사전 점검
1스택 설치 완료
2진행 중 업그레이드 없음
3릴리스 상태
4버전 경로 확인
524시간 이내 복구 가능한 백업
6Helm server dry-run
표시검증된 경로가 없으면 "검증된 업그레이드 경로 없음"으로 표시한다(미검증 버전은 권하지 않음)
확대첫 지원 대상은 Argo CD. 대상 확대는 코드 수정 없이 검증 번들 등록으로 가능하다(관리 › 스택 버전 관리 › 업그레이드 번들 — 영상 16단계)
10/21 시연: Argo CD 차트 7.7.16 → 7.7.22, 사전 점검 6항목 통과 후 적용, 완료 뒤 demo-api Synced/Healthy
백업·복구복구 리허설로 검증 완료
8/30 기준 백업·복구 코드는 없었다. 완료 기준을 "복구 리허설 성공"으로 정의하고 개발했다
10/21 시연: full 백업 → 스택 삭제 → 복구 → 지문 일치
범위 · #75
플랫폼과 조직의 모든 스택을 한 세트로 백업한다. 대상: 플랫폼 DB, 스택별 금고(OpenBao), OSS 데이터(PVC), 클러스터 리소스
리허설
마지막 스택을 지운 빈 클러스터로 복구하는 리허설을 4회 진행해 결함 7건을 찾아 고쳤다
FK 순서ESO CRD모니터링 CR내부 CA
앱 네임스페이스재개 거짓 경보SQLSTATE 0A000
키 · #85
암호화 키 유실에 대비한 키 자재 에스크로 런북(ENCRYPTION_KEY, unseal key, 봉인 키, 목적지 자격증명). 백업 결과는 알림 채널로 전송한다
AI 어시스턴트·MCP사용자 권한 기반 조회
MCP 서버 v1 · nullus mcp serve · #61
stack_liststack_statuscluster_list
template_listcompat_checkstack_logs_tail
stack_deploystack_rollbackpipeline_deploy
점선 3종은 --allow-write를 켰을 때만 나타난다. 시크릿은 도구 인자로 받지 않으며, Claude Code 등 외부 MCP 클라이언트가 그대로 연결된다
AI 어시스턴트 1단계 · #94
Upstage solar-pro4OpenAIAnthropic
Gemini사내 서버 vLLM · Ollama
키는 관리 화면에서 조직별로 등록한다(끝 4자리만 표시, 감사 로그 기록). 사내 서버를 고르면 폐쇄망에서도 외부로 나가지 않는다
CLI는 최소 구성(version · stack ls · mcp serve)이다. MCP를 우선 제공하고, CLI 명령은 사용 피드백에 따라 확장한다
경보 알림 채널 연동Telegram·이메일·Slack
알림 채널 · #63
조직 알림 채널
관리 › 알림 채널에서 Telegram·이메일(SMTP)·Slack 채널을 등록하고 받을 이벤트를 고른다. 채널마다 테스트 전송을 지원하고, 모든 발송 결과를 기록한다
기존에는 설정이 저장만 되고 실제 발송되지 않았다
스택 심각 경보 · #87
규칙 설정 없이 기본 동작한다
스택 Prometheus 기본 규칙 145개의 critical 경보를 1분마다 수집해 조직 채널로 보낸다(발생, 4시간마다 재알림, 해제)
기존에는 경보 수신자가 비어 있어 어디에도 전달되지 않았다
리소스 폭주(Q4) 대응 방안의 "알리고 되돌린다" 단계에서 앱 리소스 경보(#102)도 이 채널을 사용한다
피드백 외 개선사용자 환경 대응
MinIO 라이선스 변경 대응 · #88
S3 호환 계층을 도입해 SeaweedFS를 선택할 수 있다
arm64 네이티브 · nullus#270
노드 아키텍처를 읽어 이미지를 고르고, 실행할 수 없으면 설치 전에 중단한다(DGX Spark에서 발견)
전자정부 표준프레임워크 · #91
외부 원본 저장소를 새 앱 저장소로 가져온다(eGov 부트·웹 샘플)
문서 · 재현성 · #93
문서 사이트를 한·영으로 제공하고, 로컬 E2E 가이드로 설치부터 백업·복구까지 같은 순서로 재현한다
CI/CD 템플릿: eGovFrame 샘플 2종 (10/21 시연 화면)
검증 인프라도 OpenTofu + Kubespray로 재구축했다. 프로비저닝 결과로 Kubespray 인벤토리를 바로 생성한다
도입 사례위니텍 기술총괄실에서 쓰고 있다
반영 완료 2반영 대상 7
10월부터 위니텍 기술총괄실 IDP 가 같은 설치 · CI/CD 엔진으로 돌고 있다. 드러난 문제는 GitHub 이슈로 올려 처리하고, Nullus 에도 같은 수정을 옮겨 온다
| # | PoC 에서 드러난 문제 | Nullus | 상태 |
| 01 | GitLab root 비밀번호가 금고(OpenBao) 값과 달라 로그인되지 않음 | 같은 문제 · nullus#309 | 반영 완료 |
| 02 | 설치 화면에서 고른 보안 도구(Trivy · SonarQube)가 설치 목록에서 빠짐 | 먼저 수정 · nullus#288 | 반영 완료 |
| 03 | Local 규모 프로파일에서 SonarQube 메모리가 512Mi 로 줄어 기동 실패 | 같은 코드 · 캡처 #643 | 반영 대상 |
| 04 | SonarQube 기본 품질 게이트가 '미검토 보안 항목'만으로 배포를 막음 | 같은 코드 확인 | 반영 대상 |
| 05 | GitLab 일시 장애에도 자동화 토큰을 재발급 · 폐기해 작업이 끊김 | 같은 코드 확인 | 반영 대상 |
| 06 | 실행 한 번이 이력에 두 줄로 남아 실행 수 · 성공률이 부풀려짐 | 같은 코드 확인 | 반영 대상 |
| 07~09 | 준비 검사가 포트만 확인 · /etc/hosts 한 줄 복사(Windows) · 접속 정보 '불러오는 중' | 같은 코드 확인 | 반영 대상 |
실사용 환경이 찾은 9건 중 2건은 반영했고 7건은 같은 수정을 옮겨 온다. 엔진이 같아 수정도 그대로 이식된다
GitHub 이슈 목록 · 셋째 줄 #643 = 표의 03클릭 — 크게열림 52 · 닫힘 155
로드맵연말 프로덕션 완성도 목표
2차에서 약속한 "연말까지 프로덕션에서 쓸 수 있는 완성도"를 위해 신규 기능 개발은 마감하고, 남은 두 달은 검증·안정화에 집중한다
v0.6.0
2026.10 · 현재
DevSecOps 기능 완료
보안 게이트 · 공급망 · 백업 / 복구 · 업그레이드
폐쇄망
2026.11
최신본 종단 검증
SAST 이후 에어갭 전체 · 백업 에어갭
프로덕션
2026.12
현업에서 쓸 완성도
리소스 폭주 1단계 · 보안 보강
확장
2027
MLOps · 에이전트
기구축 환경 연결 · 도구 조합 추천
2차에서 2027년으로 계획한 AI 기능 중 MCP·어시스턴트 1단계를 v0.6.0에 앞당겨 반영했다
MLOps 로드맵(안)기본 IDP 위에 켜서 쓰는 애드온
기본 · 지금 그대로
Nullus IDP
스택 · CI/CD · 관측 · 관리 — 메뉴 4그룹과 설치 엔진은 바꾸지 않는다
+
MLOps 애드온ON
켜는 조직만 쓴다
새 페이지로 더하고 평소엔 보이지 않는다. 학습 · 서빙 · 실험 추적
+
다음 애드온OFF
성격이 다른 영역
같은 방식으로 붙인다 — 한 통에 넣지 않는다
원칙 01
애드온으로 더한다
MLOps 플랫폼을 따로 만들지도, 기존 구조를 갈아엎지도 않는다. DevSecOps 파이프라인에 ML 워크로드를 선택 모듈로 연계한다
원칙 02
GPU 없는 영역부터
GPU 가 필요한 영역과 아닌 영역을 나누고, 필요 없는 영역부터 진행한다
원칙 03
실용 수준 검증 후 공개
단순 동작 확인 수준의 시연으로는 공개하지 않는다
| 단계 (안) | 내용 | GPU | 지금 가진 것 |
| M0같은 파이프라인 | 모델 서빙 앱을 CI/CD 템플릿으로 제공한다. 가벼운 모델로 시작해 모델만 교체하며, 아티팩트 저장 · 보안 게이트 · SBOM 은 기존 것을 그대로 쓴다 | 불필요 | CI/CD 템플릿 · 외부 원본 가져오기 |
| M1GPU 를 아는 게이트 | 클러스터 등록 시 GPU 노드를 식별하고, 호환성 게이트가 GPU · 아키텍처 조합을 판정한다 | 인식만 | arm64 사전검사 · 아키텍처별 이미지 출처 |
| M2학습 · 서빙 스택 | 학습 · 서빙 · 실험 추적 스택 템플릿과 CSP 레퍼런스 파이프라인 선택 — 애드온 페이지 안에서 | 필요 | 스택 템플릿 · 설치 엔진 · 호환성 매트릭스 |
2차 검증 Q2 · Q6(계획과 일정 · CSP 레퍼런스 파이프라인)에 대한 답. 드래프트 — 10/26 팀 회의: DevOps 와 MLOps 는 성격이 달라 한 구조에 맞추지 않는다, 기본은 IDP 이고 MLOps 는 옵션. 후보 OSS 는 검토 전이며 일정은 DevSecOps 연말 완성도 확보 후 팀 합의를 거쳐 공개한다
남은 과제이슈 번호로 추적하는 백로그
★ 2차 검증 피드백에서 나온 과제. 미완료 과제도 이슈 번호로 추적한다(기획 저장소 기준). 의견과 기여는 github.com/cloud-nullus/nullus 이슈로 받는다
에이전트 시대의 가드레일 층앱을 만드는 것과, 프로덕션으로 보내는 것은 다르다
에이전트 · 모델교체 가능
MCP 클라이언트 · AI 어시스턴트
UpstageOpenAIAnthropicGemini사내 vLLM·Ollama
NULLUS · 가드레일 층남는 자산
검증된 조합 지식매트릭스 · 29단계 설치 엔진 · 템플릿. 에이전트는 의도를 말하고 실행은 엔진이 맡는다
인프라 · 벤더 중립고르는 것
어떤 쿠버네티스든온프레미스·폐쇄망·클라우드amd64·arm64GitLab·Gitea·GitHubJenkins·Actions·Argo CDHarbor·NexusS3 호환 스토리지
발전 가능성
지금 · v0.6.0
조회하고 설명하는 에이전트
MCP 조회 6종 · 변경 3종(옵트인), 어시스턴트 1단계, 사내 모델로 폐쇄망 지원
다음
사람이 승인하는 변경
사전 점검 결과와 함께 업그레이드·롤백을 제안하고 사람이 승인 #94 · 환경별 도구 조합 추천 #72
이후
운영 에이전트
경보 → 원인 요약 → 롤백 제안 #99~#107 · CVE 탐지에서 검증된 업그레이드까지 연결 · kagent 연계 검토
확장
AI 워크로드를 배포하는 플랫폼
모델 서빙·MCP 서버·에이전트 런타임을 같은 보안 게이트와 백업 아래로(MLOps M0~M2)
AI 로 앱 개발은 빨라졌지만 인증 · 인가, CI/CD, 떠받치는 OSS 의 버전 · 취약성 관리는 여전히 인프라 지식이 필요하다 — 그 계층을 Nullus 가 맡는다. 모델 · 에이전트 · 인프라 · 앱은 바꿔 끼우고, 검증된 OSS 조합의 파이프라인과 가드레일은 남는 중간 계층. 에이전트는 고치지 않고 제안하므로 GitOps 와 사람의 승인이 유지되고, 미해결 과제는 이슈로 남겨 계속 따라간다
시연 다시 보기설치부터 AI 어시스턴트까지 한 세션 · 챕터로 바로 재생
처음부터 재생 · 9:37
로컬 E2E 가이드 1~17단계 · 실제 화면 · 기다리는 구간은 빨리 감기 (10/28 녹화)
0:00인트로표지 · 무엇을 보게 되는지
0:031 준비물도구 버전 · 자원 확인
0:182 플랫폼 띄우기up --kind · 점검
0:373 로그인Keycloak SSO · 클러스터 확인
0:534 스택 설치GitLab · Argo CD · SonarQube (⏩ 14분)
1:425 도구 접속GitLab · Argo CD · SonarQube
2:106 연결 설정MinIO · 백업 설정
2:307 템플릿Nullus Sample App
2:358 파이프라인생성 · 실행
2:589 결과 확인6단계 통과 · Argo CD · 지문
3:4210 백업전체 백업 · 검증
3:5711 삭제네임스페이스 삭제
4:1312 복구백업에서 복구
4:3413 다시 연결라우터 · refresh
4:5314 이어서 배포지문 일치 · 새 커밋
5:4815 전자정부 앱차단 → .trivyignore → 배포
7:4716 OSS 업그레이드번들 등록 · Argo CD 7.7.22
8:4817 AI 어시스턴트업스테이지 솔라 · MCP 조회 3문
9:32아웃트로감사합니다 · 저장소 QR
챕터를 누르면 그 장면부터 재생(같은 폴더의 mp4, 없으면 유튜브 새 탭) · 발표 중엔 건너뛰고 Q&A 에서 쓴다 · Esc 닫기
160개의 결정,
이제 제품이 처리합니다
DevSecOps 파이프라인 구축을, 클릭 몇 번으로
감사합니다. Q&A
CloudBro 커뮤니티 코어 프로젝트 · Apache 2.0 · v0.6.0 · nullus.io
github.com/cloud-nullus/nullus