Cohere
경력근거: Lead end-to-end deployment of North in private cloud and on-premises
※ 실제 산출물이 아닌 AI 예측 시안입니다.
Cohere의 North는 고객사가 민감 데이터를 밖으로 내보내지 않으려고 들여놓는 제품이라, 이 자리는 사설 클라우드와 온프레미스 배포를 계획부터 롤아웃까지 맡습니다. 폐쇄망에서는 이미지 하나가 빠져도 설치가 멈추고 반입 절차를 다시 밟아야 하는데, 그 절차 비용 때문에 설치 전에 목록을 맞춰 보는 일이 실제로 값이 나갑니다. 이 제약은 밖으로 못 나가는 환경에 제품을 들여놓는 자리에서만 생깁니다. 공고 업무는 인프라 평가부터 보안 준수, 장애 대응까지 걸쳐 있는데 1주 범위에서 고를 수 있는 것은 하나라 반입 전 점검 축을 골랐습니다. 이 포트폴리오는 차트에서 이미지 참조를 뽑아 번들과 규칙으로 대조하고 근거를 남기는 기술을 보여줍니다. Cohere 제품 내부 구조나 고객사 보안 심사 절차의 전문성은 주장하지 않습니다. 그 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
North를 사설 클라우드와 온프레미스에 계획부터 롤아웃까지 직접 올리는 일이 주요 업무입니다. 설치가 멈추는 대부분의 지점이 밖으로 나가는 이미지 참조입니다.
프로덕션 쿠버네티스 운영 경험과 Helm 전문성을 자격요건으로 못박습니다. 차트가 참조하는 이미지를 뽑아 번들과 대조하는 일이 그 실무의 앞단입니다.
배포 관련 기술 문제를 해결해 다운타임을 줄이는 일이 업무로 적혀 있습니다. 설치 도중이 아니라 시작 전에 걸림돌을 찾는 것이 가장 싼 해결입니다.
Helm 차트가 참조하는 컨테이너 이미지 목록과 고객사에 반입할 오프라인 번들 목록을 대조해, 번들에 없거나 다이제스트가 어긋난 이미지를 사유별로 나눠 출력하고 반입 점검 리포트를 남기는 CLI입니다. 판정은 이미지 이름과 태그, 다이제스트를 문자열로 견주는 대조로 정합니다.
고객사 폐쇄망에 제품을 올리러 들어가는 파견 엔지니어입니다. 반입 승인을 받은 USB로 설치를 시작했다가 파드 하나가 이미지를 못 받아 멈추면, 그때부터 다시 반입 신청을 올려야 해서 하루가 통째로 날아갑니다.
차트가 참조하는 이미지가 목록으로 뽑히면, 반입 번들이 설치를 끝까지 버틸지는 들어가기 전에 대조로 갈라집니다.
차트 이미지 참조 목록과 번들 목록 파일을 인자로 받아 이미지별 판정을 터미널에 출력하고 반입 점검 리포트를 떨구는 CLI입니다. 실제 레지스트리에 접속하지 않고 뽑아 둔 목록만 읽습니다.
helm template로 렌더한 매니페스트에서 이미지 참조를 직접 긁어 목록을 만들어, 사람이 손으로 적던 단계를 없앤 구성입니다.
고객사 미러 레지스트리 접두를 붙인 values 파일을 만들어, 판정을 통과한 목록 그대로 설치에 넘길 수 있게 하는 구성입니다.
담당자가 차트 이미지 40행과 번들 목록을 넣어 빠진 이미지가 사유별로 나뉜 판정표와 반입 점검 리포트가 나오는 것을 시연합니다.
결측·중복·미등록 레지스트리가 섞인 입력 30종을 넣어도 출력 형식이 깨지지 않고, 판정하지 못한 이미지는 사유가 붙어 남습니다.
다이제스트가 비어 있는 이미지는 맞은 것으로 세지 않고 다이제스트 누락으로 따로 답니다. 확인하지 못한 것을 통과로 만들지 않습니다.
판정과 손으로 만든 정답표를 맞춰 사유별로 어긋난 건을 셉니다. 단, 목록과 정답을 모두 작성자가 만든 합성 기준이라 성능 측정이 아니라 데모 조건 동작입니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 더미데이터 자가채점이며, 실제 반입 점검 정확도는 Cohere 제품의 실제 차트와 고객사의 실제 번들이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
레지스트리 표기가 차트마다 흔들린 건과 다이제스트가 빈 건, 미러 목록에 없는 레지스트리를 참조 목록에 일부러 넣었습니다. 이런 건이 빠지면 반입 점검을 통과해도 현장에서 같은 결과가 나온다고 말할 수 없습니다.
목록이 맞는다고 해서 설치가 끝난다고 단정할 수 없습니다. 저장소 용량과 노드 아키텍처, 네트워크 정책은 이 도구가 보지 않으므로, 판정은 이미지 반입까지만 읽어야 합니다.
실제 도입하면 고객사마다 미러 주소 규칙과 반입 절차가 다릅니다. 주소 규칙을 인프라 담당자와 합의해 채우는 일이 도입 단계의 실제 과제입니다.
제품 내부 구성 요소를 어디까지 넣고 뺄지는 이 도구의 범위 밖입니다. 주어진 차트가 참조하는 것만 검사하므로, 구성 결정은 배포 계획에서 먼저 정합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
Helm 차트가 참조하는 컨테이너 이미지 목록입니다. 레지스트리 표기가 차트마다 대소문자로 흔들리고, 표준 목록에 없는 신규 레지스트리와 같은 참조 번호가 두 번 들어온 건, 다이제스트가 비어 있는 행을 일부러 섞었습니다.
| ref_no | chart_name | registry_raw | image_path | image_tag | image_digest | is_optional |
|---|---|---|---|---|---|---|
| RF-001 | north-api | docker.io | cohere/north-api | 1.8.2 | sha256:aa11 | false |
| RF-002 | north-api | docker.io | library/redis | 7.2 | sha256:bb22 | false |
| RF-003 | north-worker | Docker.IO | cohere/north-worker | 1.8.2 | sha256:cc33 | false |
| RF-004 | north-worker | quay.io | prometheus/node-exporter | 1.7.0 | sha256:dd44 | true |
| RF-005 | north-ui | docker.io | cohere/north-ui | 1.8.2 | sha256:ee55 | false |
아래 JSON Schema에 맞는 차트 이미지 참조 행을 더 만들어 주세요. {"type":"object","properties":{"ref_no":{"type":"string"},"chart_name":{"type":"string"},"registry_raw":{"type":"string"},"image_path":{"type":"string"},"image_tag":{"type":"string"},"image_digest":{"type":["string","null"]},"is_optional":{"type":"boolean"}},"required":["ref_no","chart_name","registry_raw","image_path","image_tag","image_digest","is_optional"]} 한 chart_name에 이미지가 두 건 이상 붙도록 만들어 주세요. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 미매핑으로 registry_raw가 표준 목록에 없어 registry_id가 null인 행, 둘째 표기흔들림으로 같은 레지스트리를 docker.io와 Docker.IO와 DOCKER.IO처럼 대소문자만 다르게 적은 행, 셋째 중복으로 같은 ref_no가 두 행에 있는 재적재 건, 넷째 결측으로 image_digest가 null인 행, 다섯째 경계극단으로 is_optional이 true인 선택 컴포넌트. 또한 형식 깨뜨리기 시도 3건을 별도 파일로 만들어 is_optional에 문자열을 넣거나 image_tag를 빼서 스키마 검증이 걸러내는지 확인하게 해 주세요.{"type":"object","properties":{"ref_no":{"type":"string"},"chart_name":{"type":"string"},"registry_raw":{"type":"string"},"image_path":{"type":"string"},"image_tag":{"type":"string"},"image_digest":{"type":["string","null"]},"is_optional":{"type":"boolean"}},"required":["ref_no","chart_name","registry_raw","image_path","image_tag","image_digest","is_optional"]}고객사 폐쇄망에 반입할 오프라인 번들에 실제로 담긴 이미지 목록입니다. 반입 승인이 아직 안 난 항목을 일부러 섞었습니다.
| bundle_id | image_path | image_tag | image_digest | size_mb | approval_status |
|---|---|---|---|---|---|
| BD-2026-08 | cohere/north-api | 1.8.2 | sha256:aa11 | 820 | approved |
| BD-2026-08 | library/redis | 7.2 | sha256:bb22 | 110 | approved |
| BD-2026-08 | cohere/north-worker | 1.8.2 | sha256:cc99 | 760 | approved |
| BD-2026-08 | cohere/north-ui | 1.8.2 | sha256:ee55 | 240 | approved |
| BD-2026-08 | library/postgres | 16.2 | sha256:1177 | 430 | approved |
아래 JSON Schema에 맞는 오프라인 번들 항목 행을 더 만들어 주세요. {"type":"object","properties":{"bundle_id":{"type":"string"},"image_path":{"type":"string"},"image_tag":{"type":"string"},"image_digest":{"type":["string","null"]},"size_mb":{"type":"integer"},"approval_status":{"type":"string","enum":["approved","pending","rejected"]}},"required":["bundle_id","image_path","image_tag","image_digest","size_mb","approval_status"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 차트가 참조하는데 번들에는 아예 없는 image_path와 image_tag 조합, 둘째 같은 이름과 태그인데 image_digest가 차트 쪽과 다른 행, 셋째 approval_status가 pending이라 반입이 아직 안 된 행, 넷째 경계극단으로 size_mb가 1인 매우 작은 이미지. 또한 형식 깨뜨리기 시도 3건을 별도 파일로 만들어 approval_status에 enum 밖 값을 넣거나 size_mb에 문자열을 넣어 스키마 검증이 걸러내는지 확인하게 해 주세요.{"type":"object","properties":{"bundle_id":{"type":"string"},"image_path":{"type":"string"},"image_tag":{"type":"string"},"image_digest":{"type":["string","null"]},"size_mb":{"type":"integer"},"approval_status":{"type":"string","enum":["approved","pending","rejected"]}},"required":["bundle_id","image_path","image_tag","image_digest","size_mb","approval_status"]}고객사 보안팀이 반입 미러 대상으로 승인한 레지스트리 별칭표입니다. 같은 레지스트리를 차트마다 다른 호스트 이름으로 적어 두므로 별칭을 함께 담았고, 아직 미러가 열리지 않은 레지스트리를 일부러 섞었습니다.
| rule_no | registry_id | registry_alias | mirror_host | is_approved |
|---|---|---|---|---|
| RG-001 | dockerhub | docker.io | mirror.corp.local/dockerhub | true |
| RG-002 | dockerhub | index.docker.io | mirror.corp.local/dockerhub | true |
| RG-003 | dockerhub | registry-1.docker.io | mirror.corp.local/dockerhub | true |
| RG-004 | quay | quay.io | mirror.corp.local/quay | true |
| RG-005 | gcr | gcr.io | mirror.corp.local/gcr | true |
아래 JSON Schema에 맞는 mirror_registries 행을 더 만들어 주세요. {"type":"object","properties":{"rule_no":{"type":"string"},"registry_id":{"type":"string"},"registry_alias":{"type":"string"},"mirror_host":{"type":"string"},"is_approved":{"type":"boolean"}},"required":["rule_no","registry_id","registry_alias","mirror_host","is_approved"]} rule_no는 RG-로 시작하는 일련번호이고, registry_alias는 차트에 적힐 수 있는 호스트 표기입니다. 같은 registry_id에 별칭이 여럿 붙어도 됩니다.{"type":"object","properties":{"rule_no":{"type":"string"},"registry_id":{"type":"string"},"registry_alias":{"type":"string"},"mirror_host":{"type":"string"},"is_approved":{"type":"boolean"}},"required":["rule_no","registry_id","registry_alias","mirror_host","is_approved"]}| Kubernetes | 판정 대상이 되는 워크로드의 실행 환경이며, 파드가 이미지를 못 받는 상황이 이 도구가 미리 잡으려는 실패입니다. |
| Helm | 이미지 참조가 들어 있는 차트 형식입니다. 2주차에 helm template 출력에서 참조를 직접 뽑습니다. |
| 컨테이너 레지스트리 | 번들과 미러 주소의 대상이며, 이름과 태그, 다이제스트가 대조 키입니다. |
| CI/CD | 차트를 고칠 때마다 이 판정을 파이프라인에서 돌려 반입 전에 실패를 잡습니다. |
| Git | 차트 버전과 번들 목록을 같은 커밋에 묶어 어느 조합으로 반입했는지 남깁니다. |
| Python | 목록을 읽어 대조 판정을 돌리고 리포트와 values 파일을 만드는 본체입니다. |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 차트에서 이미지 목록을 직접 뽑습니다.
✓ pass → 목록 추출까지가 한 덩어리입니다. 더 키우려면 미러 주소를 붙인 values 파일을 냅니다.
차트가 참조하는 이미지 한 건이 반입 번들만으로 설치될 수 있는지의 판정 결과입니다. 안 되면 왜인지를 근거와 함께 담습니다.
{"type":"object","properties":{"ref_no":{"type":"string"},"verdict":{"type":"string","enum":["bundled","missing_from_bundle","digest_mismatch","approval_pending","digest_missing","registry_unmapped","duplicate_ref"]},"chart_digest":{"type":["string","null"]},"bundle_digest":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{},"quote":{"type":["string","null"]}},"required":["field","value"]}},"next_action":{"type":"string"}},"required":["ref_no","verdict","chart_digest","bundle_digest","evidence","next_action"]}[
{
"ref_no": "RF-001",
"verdict": "bundled",
"chart_digest": "sha256:aa11",
"bundle_digest": "sha256:aa11",
"evidence": [
{
"field": "image_path",
"value": "cohere/north-api"
},
{
"field": "image_digest",
"value": "sha256:aa11"
},
{
"field": "approval_status",
"value": "approved"
}
],
"next_action": "번들에 있고 다이제스트가 같습니다. 그대로 반입합니다."
},
{
"ref_no": "RF-007",
"verdict": "bundled",
"chart_digest": "sha256:1177",
"bundle_digest": "sha256:1177",
"evidence": [
{
"field": "image_path",
"value": "library/postgres"
},
{
"field": "image_digest",
"value": "sha256:1177"
},
{
"field": "approval_status",
"value": "approved"
}
],
"next_action": "번들에 있고 다이제스트가 같습니다. 그대로 반입합니다."
},
{
"ref_no": "RF-006",
"verdict": "missing_from_bundle",
"chart_digest": "sha256:ff66",
"bundle_digest": null,
"evidence": [
{
"field": "image_path",
"value": "cohere/asset-cdn"
},
{
"field": "image_tag",
"value": "0.4.1"
},
{
"field": "is_optional",
"value": true
}
],
"next_action": "번들에 없습니다. 선택 컴포넌트라 이번 설치에서 빼거나 반입 목록에 추가합니다."
},
{
"ref_no": "RF-003",
"verdict": "digest_mismatch",
"chart_digest": "sha256:cc33",
"bundle_digest": "sha256:cc99",
"evidence": [
{
"field": "image_digest",
"value": "sha256:cc33"
},
{
"field": "image_tag",
"value": "1.8.2"
}
],
"next_action": "같은 태그인데 다이제스트가 다릅니다. 번들을 다시 뜨기 전에는 설치를 시작하지 않습니다."
},
{
"ref_no": "RF-013",
"verdict": "approval_pending",
"chart_digest": "sha256:66cc",
"bundle_digest": "sha256:66cc",
"evidence": [
{
"field": "image_path",
"value": "cohere/jobs"
},
{
"field": "approval_status",
"value": "pending"
}
],
"next_action": "반입 승인이 아직 안 났습니다. 승인 전에는 설치 순서에서 뒤로 미룹니다."
},
{
"ref_no": "RF-008",
"verdict": "digest_missing",
"chart_digest": null,
"bundle_digest": "sha256:88ee",
"evidence": [
{
"field": "image_digest",
"value": null
},
{
"field": "image_tag",
"value": "1.22"
}
],
"next_action": "차트 쪽 다이제스트가 비어 있어 대조하지 못했습니다. 통과로 세지 않고 차트를 다시 렌더합니다."
},
{
"ref_no": "RF-006",
"verdict": "registry_unmapped",
"chart_digest": "sha256:ff66",
"bundle_digest": null,
"evidence": [
{
"field": "registry_raw",
"value": "ghcr.io",
"quote": "ghcr.io"
}
],
"next_action": "표준 목록에 없는 레지스트리입니다. 미러 규칙을 정하기 전에는 반입 목록에서 빼 둡니다."
},
{
"ref_no": "RF-003",
"verdict": "duplicate_ref",
"chart_digest": "sha256:cc33",
"bundle_digest": "sha256:cc99",
"evidence": [
{
"field": "ref_no",
"agg": "count",
"value": 2
}
],
"next_action": "같은 참조 번호가 두 번 적재됐습니다. 앞 건으로만 판정하고 뒤 건을 목록에서 뺍니다."
}
][자동 검증 · 1주차] 1. verdict가 enum 일곱 값 안에 있는지 확인합니다. 2. ref_no·verdict·chart_digest·bundle_digest·evidence·next_action이 모두 있는지 확인합니다. 3. size_mb가 0보다 큰지 확인합니다. 4. image_digest가 null이면 verdict가 digest_missing인지 확인합니다. 5. evidence의 field가 두 입력 표의 컬럼에 실재하는지 확인합니다. 6. evidence의 quote가 그 행 registry_raw의 일부인지 확인합니다. 7. next_action이 존댓말로 끝나는지 확인합니다. [판정 규칙] 1. 레지스트리 표기은 대소문자와 띄어쓰기, 구분자를 없애 소문자로 모은 뒤 mirror_registries의 registry_alias와 맞춥니다. 맞는 것이 없으면 미매핑으로 남기고 그 행은 나머지 판정에서 뺍니다. 2. 같은 행 번호가 두 번 들어오면 앞 건만 남기고 뒤 건은 적재 단계에서 사유와 함께 뺍니다. [수동 검증] 1. 선택 컴포넌트를 이번 설치에서 빼도 되는지 배포 계획과 맞춰 확인합니다. 2. RF-003·RF-008처럼 레지스트리 표기가 흔들렸지만 표준으로 맞춰진 행은 미매핑 사유를 달지 않는 것이 맞는지 확인합니다. [평가 러너 · 2주차] 1. helm template로 뽑은 목록과 손으로 적은 목록을 맞춰 빠뜨린 이미지가 있는지 셉니다. 2. 목록과 정답을 작성자가 만든 합성 기준이라 이 수치는 성능 측정이 아니라 데모 조건 동작입니다.
근거: Lead end-to-end deployment of North in private cloud and on-premises