# DaemonSet上でロールバックを実施する

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

---

<!-- overview -->

このページでは、<a class='glossary-tooltip' title='Podのコピーがクラスター内の一連のNodeに渡って実行されることを保証します。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/docs/concepts/workloads/controllers/daemonset' target='_blank' aria-label='DaemonSet'>DaemonSet</a>上でロールバックを行う方法について説明します。


## 始める前に

<p>Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。
このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。
まだクラスターがない場合、<a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a>を使って作成するか、
以下のいずれかのKubernetesプレイグラウンドも使用できます:</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>
 
 
 作業するKubernetesサーバーは次のバージョン以降のものである必要があります: 1.7.
  <p>バージョンを確認するには次のコマンドを実行してください:  <code>kubectl version</code>.</p>


[DaemonSet上でローリングアップデートを実施する](/ja/docs/tasks/manage-daemon/update-daemon-set/)方法については既に知っているものとします。

<!-- steps -->

## DaemonSet上のロールバックの実施

### ステップ1: ロールバック先のDaemonSetのリビジョンを見つける

最新のリビジョンにロールバックしたい場合は、このステップを省略できます。

DaemonSetの全てのリビジョンを列挙します:

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

これはDaemonSetのリビジョンのリストを返します:

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

* 変更理由は作成時にDaemonSetのアノテーション`kubernetes.io/change-cause`からコピーされます。
  実行したコマンドを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
# ステップ1で得たリビジョン番号を--to-revisionで指定します。
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: DaemonSetのロールバックの進行状況を監視する

`kubectl rollout undo daemonset`は、サーバーに対してDaemonSetのロールバックを開始するよう指示します。
実際のロールバックはクラスターの<a class='glossary-tooltip' title='コンテナのライフサイクルを定義、展開、管理するためのAPIとインターフェースを公開するコンテナオーケストレーションレイヤーです。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/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 -->

## DaemonSetのリビジョンを理解する

前の`kubectl rollout history`のステップでは、DaemonSetのリビジョンのリストを取得しました。
各リビジョンは、ControllerRevisionという名前のリソースに格納されています。

各リビジョンに何が格納されているか確認するためには、DaemonSetのリビジョンの生のリソースを探します:

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

これはControllerRevisionsのリストを返します:

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

各ControllerRevisionはアノテーションとDaemonSetのリビジョンのテンプレートを格納します。

`kubectl rollout undo`は特定のControllerRevisionを受け取り、DaemonSetのテンプレートを、ControllerRevision内に保管されたテンプレートに置き換えます。
`kubectl rollout undo`はDaemonSetのテンプレートを、`kubectl edit`や`kubectl apply`のような他のコマンドによって、以前のリビジョンに更新することに相当します。


<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4>DaemonSetのリビジョンはロールフォワードのみとなります。
これはつまり、ロールバックが完了すると、ControllerRevisionのリビジョン番号(<code>.revision</code>フィールド)が繰り上がります。
例えば、システムにリビジョン1と2があってリビジョン2からリビジョン1にロールバックすると、<code>.revision: 1</code>のControllerRevisionは<code>.revision: 3</code>になります。</div>


## トラブルシューティング

* [DaemonSetのローリングアップデートのトラブルシューティング](/ja/docs/tasks/manage-daemon/update-daemon-set/#troubleshooting)を参照。
