見出し画像

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 を試すといいですよ!

いいなと思ったら応援しよう!