[{"data":1,"prerenderedAt":483},["ShallowReactive",2],{"post-document:\u002Fci-cd-docker\u002Fkubernetes\u002Fpart-4\u002F":3},{"id":4,"title":5,"body":6,"categories":454,"date":457,"description":458,"extension":459,"image":460,"key_concepts":461,"last_modified_at":460,"legacyPath":466,"meta":467,"navigation":468,"part":469,"path":470,"published":468,"robots":460,"seo":471,"series":472,"stem":473,"strengths":460,"summary":474,"tags":475,"tradeoffs":460,"__hash__":482},"posts\u002Fposts\u002FCI-CD-Docker\u002Fkubernetes\u002F2026-09-07-kubernetes-part-4.md","4. 직접 실험하는 Kubernetes, Pod 복구부터 롤백까지",{"type":7,"value":8,"toc":443},"minimark",[9,14,22,25,28,32,38,104,107,114,118,124,229,232,235,239,254,261,268,278,281,285,291,297,300,304,318,324,327,337,341,347,393,404,419,423],[10,11,13],"h2",{"id":12},"목표를-바꾸고-실제-상태가-따라오는지-보자","목표를 바꾸고, 실제 상태가 따라오는지 보자",[15,16,17,21],"p",{},[18,19,20],"strong",{},"이 실험실은 kubectl 명령이 바꾼 목표를 컨트롤러와 노드가 어떻게 실행 결과로 만드는지 보여준다."," 3D 바로 아래에 터미널이 있어 명령을 입력하면서 변화를 함께 볼 수 있다. 오른쪽 패널에서 미션과 힌트, 리소스 상세, 지원 명령을 골라 확인한다. 좁은 화면에서는 3D 아래의 패널을 전환하며, Auto-fill을 누르면 터미널로 돌아온다.",[15,23,24],{},"터미널은 브라우저의 교육용 상태만 변경한다. 실제 셸 명령, Kubernetes API 호출, 이미지 다운로드는 실행하지 않는다. 필요한 도구를 설치하거나 클라우드에 접속할 필요 없이 바로 시작하면 된다.",[26,27],"kubernetes-lab",{},[10,29,31],{"id":30},"_1-화면의-네-숫자는-서로-다른-것을-센다","1. 화면의 네 숫자는 서로 다른 것을 센다",[15,33,34,37],{},[18,35,36],{},"Desired가 바뀌었다고 Ready까지 즉시 바뀌는 것은 아니다."," 중간 숫자의 차이를 보는 것이 이 실습의 출발점이다.",[39,40,41,57],"table",{},[42,43,44],"thead",{},[45,46,47,51,54],"tr",{},[48,49,50],"th",{},"화면",[48,52,53],{},"세는 것",[48,55,56],{},"삭제 직후의 예",[58,59,60,72,83,93],"tbody",{},[45,61,62,66,69],{},[63,64,65],"td",{},"Desired",[63,67,68],{},"Deployment가 원하는 복제본 수",[63,70,71],{},"3으로 유지",[45,73,74,77,80],{},[63,75,76],{},"Actual",[63,78,79],{},"종료 중인 Pod를 제외한 현재 Pod 수",[63,81,82],{},"2로 감소",[45,84,85,88,91],{},[63,86,87],{},"Ready",[63,89,90],{},"요청을 받을 준비가 된 Pod 수",[63,92,82],{},[45,94,95,98,101],{},[63,96,97],{},"Endpoints",[63,99,100],{},"Service가 연결할 Ready 주소 수",[63,102,103],{},"해당 주소 제외",[15,105,106],{},"종료 표시가 된 Pod는 아직 화면에 남아 있지만 Actual에서 제외한다. 다음 단계에서 객체가 사라진다. 새로운 Pod가 생성되면 Actual은 다시 늘지만, 이미지 준비와 readiness 검사가 남아 있으므로 Ready는 잠시 적을 수 있다.",[15,108,109,110,113],{},"장면의 Pod를 누르면 이름, 소유 ReplicaSet, Node와 상태를 볼 수 있다. 일시 정지 후 ",[18,111,112],{},"한 단계","로 진행하면 관찰 중 명령을 추가해도 자동 시간이 흐르지 않는다. 터미널 조회 결과는 실행 시점의 스냅샷이고, 뒤이어 붙는 컴포넌트 이벤트와 장면은 후속 변화를 보여준다.",[10,115,117],{"id":116},"_2-미션은-명령을-외웠는지보다-결과를-확인한다","2. 미션은 명령을 외웠는지보다 결과를 확인한다",[15,119,120,123],{},[18,121,122],{},"성공 조건은 정확한 문자열 일치가 아니라, 의미 있는 관찰이나 목표 상태의 도달이다."," 예를 들어 확장 미션은 목표 5와 Ready 5가 모두 맞아야 완료된다.",[39,125,126,139],{},[42,127,128],{},[45,129,130,133,136],{},[48,131,132],{},"미션",[48,134,135],{},"할 일",[48,137,138],{},"완료에 필요한 상태 또는 증거",[58,140,141,152,163,174,185,196,207,218],{},[45,142,143,146,149],{},[63,144,145],{},"01",[63,147,148],{},"Pod 살펴보기",[63,150,151],{},"Pod 목록을 조회함",[45,153,154,157,160],{},[63,155,156],{},"02",[63,158,159],{},"Pod 삭제와 복구",[63,161,162],{},"삭제된 이름은 사라지고 새 Pod로 Ready 3 복구",[45,164,165,168,171],{},[63,166,167],{},"03",[63,169,170],{},"3개에서 5개로 확장",[63,172,173],{},"Desired 5, Ready 5, 조정 완료",[45,175,176,179,182],{},[63,177,178],{},"04",[63,180,181],{},"v2 배포",[63,183,184],{},"다섯 Pod가 v2로 준비되고 이전 RS의 목표는 0",[45,186,187,190,193],{},[63,188,189],{},"05",[63,191,192],{},"ImagePullBackOff 진단",[63,194,195],{},"실패 Pod Events를 보고 이미지 오류를 선택",[45,197,198,201,204],{},[63,199,200],{},"06",[63,202,203],{},"Readiness 실패 진단",[63,205,206],{},"실패 Pod Events와 Endpoints 조회 후 Readiness 원인 선택",[45,208,209,212,215],{},[63,210,211],{},"07",[63,213,214],{},"Service 연결 대상 확인",[63,216,217],{},"Service와 Endpoints를 읽고 Ready 3과 전체 Pod 4를 비교",[45,219,220,223,226],{},[63,221,222],{},"08",[63,224,225],{},"실패 배포 롤백",[63,227,228],{},"이전 v1으로 복귀해 실패 Pod 없이 Ready 3",[15,230,231],{},"조회와 진단 미션은 읽기 자체가 학습 목표라서, 어떤 객체를 관찰했는지와 진단 근거를 기록한다. 복구나 배포 미션은 비동기 단계가 끝나 실제 목표에 도달해야 완료된다.",[15,233,234],{},"각 미션은 필요한 초기 상황으로 재설정된다. 앞 미션에서 자유 실험으로 개수를 바꿔도 다음 미션의 시작 조건은 일정하다. 실패 진단 미션은 처음부터 장애 상태를 준비하며, 완료한 미션 수는 같은 페이지 안에서 유지된다.",[10,236,238],{"id":237},"_3-미션의-명령을-실행하거나-힌트로-직접-풀-수-있다","3. 미션의 명령을 실행하거나 힌트로 직접 풀 수 있다",[15,240,241,244,245,249,250,253],{},[18,242,243],{},"미션 패널의 명령 옆에서 실행 버튼을 누르면, 직접 입력했을 때와 같은 모의 동작을 확인할 수 있다."," Pod 조회 미션은 ",[246,247,248],"code",{},"kubectl get pods",", 삭제 미션은 조회 후 현재 Pod 이름을 넣은 삭제 명령, 확장 미션은 ",[246,251,252],{},"kubectl scale deployment demo-api --replicas=5","를 보여준다. 한 단계를 실행하면 다음에 필요한 명령으로 바뀐다.",[15,255,256,257,260],{},"실행 버튼은 명령과 결과를 터미널에 기록하고 같은 상태를 3D 장면에 반영한다. ",[18,258,259],{},"입력만 하기","는 명령을 입력 칸에 넣기만 하며, Enter를 눌러야 실행된다. 미션을 선택하는 것만으로 명령이 실행되지는 않는다.",[15,262,263,264,267],{},"명령을 직접 떠올리고 싶으면 ",[18,265,266],{},"힌트로 직접 풀기","를 선택한다. 이 모드에서는 관찰할 대상에서 문법, 구체적인 명령으로 힌트를 좁혀 간다.",[269,270,276],"pre",{"className":271,"code":273,"language":274,"meta":275},[272],"language-text","Hint       → 무엇을 먼저 확인하면 좋을까?\nShow More  → 어떤 동사와 리소스를 쓰면 될까?\nShow More  → 지금 상태에 맞는 실제 명령\nAuto-fill  → 입력 칸에만 삽입\nEnter      → 사용자가 직접 실행\n","text","",[246,277,273],{"__ignoreMap":275},[15,279,280],{},"Pod 목록을 조회하면 다음 힌트는 삭제할 행동으로 바뀐다. 생성된 Pod 이름이 달라지는 경우에도 현재 상태에서 대상 이름을 고른다. 복구가 진행 중일 때는 불필요한 명령 대신 상태가 변하는 단계를 관찰하도록 안내한다.",[10,282,284],{"id":283},"_4-pod-삭제는-replicaset의-목표를-지우지-않는다","4. Pod 삭제는 ReplicaSet의 목표를 지우지 않는다",[15,286,287,290],{},[18,288,289],{},"Pod를 하나 삭제해도 그 Pod를 관리하는 ReplicaSet의 목표가 남아 있으므로 새 Pod가 만들어진다."," 같은 Pod가 부활하는 것이 아니다.",[269,292,295],{"className":293,"code":294,"language":274,"meta":275},[272],"demo-api-b 삭제 요청\n  → Terminating, Ready 연결 대상에서 제외\n  → Pod 객체 제거, Actual 2\n  → ReplicaSet Controller: desired 3 ≠ actual 2\n  → 새 Pod 객체, Pending\n  → Scheduler가 Worker 선택\n  → kubelet이 containerd에 준비 요청, ContainerCreating\n  → 컨테이너 실행, Running\n  → readiness 검사 통과, Ready=True\n  → Service 연결 대상 자동 갱신\n",[246,296,294],{"__ignoreMap":275},[15,298,299],{},"실제 Kubernetes는 여러 작업을 비동기로 처리한다. 모형에서는 차이를 읽기 쉽도록 삭제 후 부족 감지와 생성 순서를 나누었다. 컨테이너와 노드의 전체 장애 처리, 종료 유예 시간과 네트워크 전파 지연까지 그대로 재현한 것은 아니다.",[10,301,303],{"id":302},"_5-새-이미지-배포는-replicaset-사이의-교체다","5. 새 이미지 배포는 ReplicaSet 사이의 교체다",[15,305,306,309,310,313,314,317],{},[18,307,308],{},"롤링 업데이트는 기존 Pod 안의 이미지 파일을 덮어쓰는 작업이 아니라, 새 template의 Pod로 교체하는 과정이다."," 이 모형은 ",[246,311,312],{},"maxSurge=1",", ",[246,315,316],{},"maxUnavailable=0","으로 새 Pod가 준비된 다음 이전 Pod를 줄인다.",[269,319,322],{"className":320,"code":321,"language":274,"meta":275},[272],"목표 3, 모두 v1 Ready\n  → v2 Pod 1개 추가: 총 4개, 처음에는 Ready 3\n  → v2 Ready: Ready 4\n  → v1 Pod 1개 종료: Ready 3\n  → 반복\n  → v2 Ready 3, v1 ReplicaSet 목표 0\n",[246,323,321],{"__ignoreMap":275},[15,325,326],{},"새 Pod가 이미지를 받지 못하거나 readiness에 실패하면 교체가 지연된다. 기존 Ready Pod가 유지되어 전체 배포 실패와 현재 서비스 중단을 구분해 볼 수 있다. 다만 실제로 무중단인지 판단하려면 처리 중 요청, 종료 동작, 인프라 장애와 용량도 함께 확인해야 한다.",[15,328,329,332,333,336],{},[246,330,331],{},"set image","는 변경 요청의 접수 결과를 보여준다. ",[246,334,335],{},"rollout status","는 준비된 새 복제본 수를 읽고, 진행 중이면 완료 이벤트를 이 터미널에 추가한다. 모형에서는 상태 관찰을 계속할 수 있도록 입력을 잠그지 않는다.",[10,338,340],{"id":339},"_6-모의-이미지와-롤백의-범위를-알아두자","6. 모의 이미지와 롤백의 범위를 알아두자",[15,342,343,346],{},[18,344,345],{},"이미지 이름은 실습 시나리오를 고르는 값이며 실제 레지스트리의 존재 여부를 검사하지 않는다."," 성공과 실패를 같은 조건에서 다시 관찰하기 위한 약속이다.",[39,348,349,359],{},[42,350,351],{},[45,352,353,356],{},[48,354,355],{},"이미지",[48,357,358],{},"모의 동작",[58,360,361,369,377,385],{},[45,362,363,366],{},[63,364,365],{},"demo-api:v1",[63,367,368],{},"정상 실행과 readiness 통과",[45,370,371,374],{},[63,372,373],{},"demo-api:v2",[63,375,376],{},"정상 새 버전으로 롤링 업데이트",[45,378,379,382],{},[63,380,381],{},"demo-api:unready",[63,383,384],{},"컨테이너는 실행되지만 \u002Fready가 503 반환",[45,386,387,390],{},[63,388,389],{},"그 외 이름",[63,391,392],{},"모의 이미지 저장소에 없어 ImagePullBackOff",[15,394,395,396,399,400,403],{},"미션 8에서 ",[246,397,398],{},"demo-api:v2-missing","은 준비되지 않은 v2 이미지를 나타낸다. 이전 정상 버전은 v1이다. ",[246,401,402],{},"rollout undo","를 사용하거나 정상 이전 이미지로 다시 변경해도 최종 상태가 목표와 같으면 성공할 수 있다.",[15,405,406,407,410,411,418],{},"롤백은 이전 Pod template을 복원한다. Desired 복제본 수나 DB 데이터, 외부 ConfigMap의 내용까지 과거로 돌리는 기능은 아니다. 이전 ReplicaSet을 재사용하는 과정도 장면과 ",[246,408,409],{},"get rs","로 확인할 수 있다. ",[412,413,417],"a",{"href":414,"rel":415},"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Fconcepts\u002Fworkloads\u002Fcontrollers\u002Fdeployment\u002F",[416],"nofollow","공식 Deployment 문서","의 롤아웃과 롤백 설명을 기준으로 삼았다.",[10,420,422],{"id":421},"다음-파트","다음 파트",[15,424,425,428,429,433,434,313,438,442],{},[18,426,427],{},"이제 Ready Pod만 연결되는 이유를 요청 경로로 확장해 보자."," ",[412,430,432],{"href":431},"\u002Fci-cd-docker\u002Fkubernetes\u002Fpart-5\u002F","5편, Service와 네트워크","로 이어진다. 앞 개념이 필요하면 ",[412,435,437],{"href":436},"\u002Fci-cd-docker\u002Fkubernetes\u002Fpart-3\u002F","3편 Pod 상태",[412,439,441],{"href":440},"\u002Fci-cd-docker\u002Fkubernetes\u002Fpart-1\u002F","전체 목차","를 확인하면 된다.",{"title":275,"searchDepth":444,"depth":444,"links":445},2,[446,447,448,449,450,451,452,453],{"id":12,"depth":444,"text":13},{"id":30,"depth":444,"text":31},{"id":116,"depth":444,"text":117},{"id":237,"depth":444,"text":238},{"id":283,"depth":444,"text":284},{"id":302,"depth":444,"text":303},{"id":339,"depth":444,"text":340},{"id":421,"depth":444,"text":422},[455,456],"CI-CD-Docker","kubernetes","2026-09-07 08:03:00 +0900","3D 클러스터와 모의 kubectl 터미널로 Pod 조회, 삭제와 복구, 확장, 이미지 교체, 장애 진단과 롤백을 직접 관찰한다.","md",null,[462,463,464,465],"Desired \u002F Actual \u002F Ready: 목표, 종료 중을 제외한 Pod 수, 준비된 Pod 수","RollingUpdate: 새 Pod의 준비를 확인하며 이전 Pod를 교체","maxSurge=1: 목표보다 한 개 더 생성할 수 있는 여유","rollout undo: 이전 Pod template으로 복귀","\u002Fci-cd-docker\u002Fkubernetes\u002Fpart-4\u002F",{},true,"4","\u002Fposts\u002Fci-cd-docker\u002Fkubernetes\u002F2026-09-07-kubernetes-part-4",{"title":5,"description":458},"직접 실험하는 Kubernetes","posts\u002FCI-CD-Docker\u002Fkubernetes\u002F2026-09-07-kubernetes-part-4","목표를 바꾸는 명령과 실제 Pod가 준비되는 시점은 다르다. 이 실험실은 같은 모의 상태를 터미널, 3D 장면과 미션에 연결한다. 원하는 개수, 실제 개수, Ready 수, 연결 대상의 차이를 보며 조정 루프와 롤아웃을 이해한다.",[476,477,478,479,480,481],"Kubernetes","kubectl","시뮬레이션","Deployment","ReplicaSet","롤백","6JPjpDz8DMgVGwevMNW6CFP8G6X0uATp6Gfa3ySU62M",1788744788203]