
kubectl replace を使いこなそう!apply との違いとは?
kubectl replace を使いこなそう!apply との違いとは?
Kubernetes の管理をしていると、リソースの設定を更新したい場面がよくありますよね。そのときに使うのが kubectl apply ですが、適用できないケースに遭遇することも。そんなときに活躍するのが kubectl replace です。
でも、「apply じゃダメなの?」「replace はどういうときに使うの?」といった疑問を持つこともあるはず。そこで、kubectl replace の使い方や apply との違い、注意点などをまとめていきます!
🔹 kubectl replace って何?
kubectl replace は、指定したマニフェストの内容で既存のリソースを完全に置き換える コマンドです。言い換えれば、今のリソースを一旦削除し、新しい設定で作り直すイメージですね。
基本の使い方
kubectl replace -f my-resource.yaml
-f <file>: 置き換え対象のリソースを定義した YAML ファイルを指定
これで、マニフェストの内容通りにリソースが更新されます。
🔹 kubectl apply との違い
リソースを更新する方法として kubectl apply もありますが、apply と replace では動きが大きく異なります。
kubectl apply は、現在のリソースの設定を維持しつつ、変更がある部分だけを上書きする 方法です。これに対して、kubectl replace は、リソース全体を一旦削除し、新しい設定で作り直す 仕組みになっています。
たとえば、部屋の模様替えをするときに…
apply は、壁紙や家具を部分的に変更する(現状を活かしながら調整)
replace は、一度すべての家具を撤去して、新しい部屋を作り直す(完全にリセット)
こう考えると、それぞれの特性が分かりやすいですね。
🔹 kubectl replace を使うべき場面
「apply じゃなく replace を使うべきなのはどんなとき?」という疑問を持つかもしれません。具体的には、以下のようなケースです。
(1) spec.selector の変更が必要なとき
Kubernetes では kubectl apply を使っても spec.selector の変更はできません。replace を使えば更新できます!
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
selector:
matchLabels:
app: new-label
このように selector を変えた場合、kubectl apply -f deployment.yaml では適用できませんが、kubectl replace -f deployment.yaml なら可能です。
(2) 設定を完全にリセットしたいとき
例えば、ConfigMap や Secret などの設定をリセットしたい場合、kubectl replace を使うと確実に適用できます。
kubectl replace -f my-config.yaml
ただし、変更前のデータは消えてしまう ので注意してください。
(3) kubectl apply で変更できないフィールドがあるとき
Kubernetes の一部のフィールドは kubectl apply では変更できません。例えば、Deployment の strategy や selector などです。このような場合は replace を使うと適用できます。
🔹 kubectl replace の注意点
kubectl replace を使うときに気をつけるべきポイントもあります。
(1) resourceVersion が一致しないとエラーになる
Kubernetes のリソースには resourceVersion というフィールドがあり、これが一致しないと kubectl replace は失敗します。
エラー例:
Error from server (Conflict): Operation cannot be fulfilled on configmaps "my-config":
the object has been modified; please apply your changes to the latest version and try again
解決策: 最新のリソースを取得してから replace しましょう。
kubectl get configmap my-config -o yaml > latest.yaml
kubectl replace -f latest.yaml
この方法なら resourceVersion を最新のものにできます。
(2) --force オプションはリソースを削除してしまう
kubectl replace --force を使うと、リソースが一旦削除され、再作成されます。
kubectl replace --force -f my-resource.yaml
この方法のデメリットは、削除 → 再作成の間にリソースが一時的に消える こと。ダウンタイムが発生するので、本番環境での使用は慎重に!
🔹 使い分けのポイント
どのコマンドを使うべきか、ざっくり整理すると…
基本は kubectl apply
→ 差分を適用して安全に更新したいときkubectl replace を使うのは…
→ apply で更新できないフィールドを変えたいときkubectl replace --force は慎重に!
→ リソースを削除 → 再作成 するので、ダウンタイムに注意
🔹 まとめ
kubectl replace はリソースを完全に置き換える コマンド
kubectl apply では変更できないフィールド(spec.selector など)を更新するのに使う
リソースの resourceVersion に注意しないとエラーになる
--force を使うとリソースが一時的に消えるリスクあり
普段は kubectl apply を使い、どうしても適用できないときに kubectl replace を試すといいですよ!