# 데몬셋(DaemonSet)에서 롤백 수행

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

이 페이지는 <a class='glossary-tooltip' title='파드의 복제본을 클러스터 노드 집합에서 동작하게 한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/workloads/controllers/daemonset' target='_blank' aria-label='데몬셋'>데몬셋</a>에서 롤백을 수행하는 방법을 보여준다.


## 시작하기 전에

<p>쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와
통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고
있지 않다면,
<a href="/ko/docs/tasks/tools/#minikube">minikube</a>를 사용해서 생성하거나
다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
 
 쿠버네티스 서버의 버전은 다음과 같거나 더 높아야 함. 버전: 1.7.
  <p>버전 확인을 위해서, 다음 커맨드를 실행  <code>kubectl version</code>.</p>


[데몬셋에서 롤링 업데이트를
  수행](/ko/docs/tasks/manage-daemon/update-daemon-set/)하는 방법을 이미 알고 있어야 한다.

<!-- steps -->

## 데몬셋에서 롤백 수행

### 1단계: 롤백할 데몬셋 리비전 찾기

마지막 리비전으로 롤백하려는 경우 이 단계를 건너뛸 수 있다.

데몬셋의 모든 리비전을 나열한다.

```shell
kubectl rollout history daemonset <daemonset-name>
```

이 명령은 데몬셋 리비전 목록을 반환한다.

```
daemonsets "<daemonset-name>"
REVISION        CHANGE-CAUSE
1               ...
2               ...
...
```

* 변경 원인은 데몬셋 어노테이션 `kubernetes.io/change-cause` 에서
  생성 시의 리비전으로 복사된다. 변경 원인 어노테이션에서 실행된 명령을 기록하도록
  `kubectl` 에 `--record=true` 를 지정할 수 있다.

특정 리비전의 세부 사항을 보려면 다음을 수행한다.

```shell
kubectl rollout history daemonset <daemonset-name> --revision=1
```

이 명령은 해당 리비전의 세부 사항을 반환한다.

```
daemonsets "<daemonset-name>" with revision #1
Pod Template:
Labels:       foo=bar
Containers:
app:
 Image:        ...
 Port:         ...
 Environment:  ...
 Mounts:       ...
Volumes:      ...
```

### 2단계: 특정 리비전으로 롤백

```shell
# --to-revision에 1단계에서 얻는 리비전 번호를 지정한다
kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
```

성공하면, 명령은 다음을 반환한다.

```
daemonset "<daemonset-name>" rolled back
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4><code>--to-revision</code> 플래그를 지정하지 않은 경우, kubectl은 가장 최신의 리비전을 선택한다.</div>


### 3단계: 데몬셋 롤백 진행 상황 확인

`kubectl rollout undo daemonset` 은 서버에 데몬셋 롤백을 시작하도록
지시한다. 실제 롤백은 클러스터 <a class='glossary-tooltip' title='컨테이너의 라이프사이클을 정의, 배포, 관리하기 위한 API와 인터페이스들을 노출하는 컨테이너 오케스트레이션 레이어.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/reference/glossary/?all=true#term-control-plane' target='_blank' aria-label='컨트롤 플레인'>컨트롤 플레인</a>
내에서 비동기적으로 수행된다.

롤백 진행 상황을 보려면 다음의 명령을 수행한다.

```shell
kubectl rollout status ds/<daemonset-name>
```

롤백이 완료되면, 출력 결과는 다음과 비슷하다.

```
daemonset "<daemonset-name>" successfully rolled out
```


<!-- discussion -->

## 데몬셋 리비전의 이해

이전 `kubectl rollout history` 단계에서, 데몬셋 리비전 목록을
얻었다. 각 리비전은 ControllerRevision이라는 리소스에 저장된다.

각 리비전에 저장된 내용을 보려면, 데몬셋 리비전 원시 리소스를
찾는다.

```shell
kubectl get controllerrevision -l <daemonset-selector-key>=<daemonset-selector-value>
```

이 명령은 ControllerRevision의 목록을 반환한다.

```
NAME                               CONTROLLER                     REVISION   AGE
<daemonset-name>-<revision-hash>   DaemonSet/<daemonset-name>     1          1h
<daemonset-name>-<revision-hash>   DaemonSet/<daemonset-name>     2          1h
```

각 ControllerRevision은 데몬셋 리비전의 어노테이션과 템플릿을
저장한다.

`kubectl rollout undo` 는 특정 ControllerRevision을 가져와 데몬셋
템플릿을 ControllerRevision에 저장된 템플릿으로 바꾼다.
`kubectl rollout undo` 는 `kubectl edit` 또는 `kubectl apply` 와 같은 다른 명령을 통해
데몬셋 템플릿을 이전 리비전으로 업데이트하는 것과
같다.


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>데몬셋 리비전은 롤 포워드만 한다. 즉, 롤백이
완료된 후, 롤백될 ControllerRevision의
리비전 번호(<code>.revision</code> 필드)가 증가한다. 예를 들어,
시스템에 리비전 1과 2가 있고, 리비전 2에서 리비전 1으로 롤백하면,
ControllerRevision은 <code>.revision: 1</code> 에서 <code>.revision: 3</code> 이 된다.</div>


## 문제 해결

* [데몬셋 롤링 업데이트
  문제 해결](/ko/docs/tasks/manage-daemon/update-daemon-set/#문제-해결)을 참고한다.
