kubectl patchでリソース更新

スポンサーリンク

はじめに

kubectl patchについて、実際の例を見ながら使い方を紹介していきます。

kubectl patch

kubectl patchStrategic Merge Patch、JSON Merge Patch、JSON Patchを使って、リソースを更新するコマンドです。

下記の形式でコマンドを実行します。

kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE]
Kubectl Reference Docs

kubectl patchtypeオプションで、下記のマージタイプを選択できます。

Strategic Merge Patchは、Kubernetesのリソースをいい感じにマージしてくれるマージ方式です。

サンプルDeployment

今回利用するサンプルDeploymentのマニフェスト(deployment.yaml)は下記の通りです。こちらをベースにコマンドを紹介していきます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: web-container
        image: nginx:1.19.10
        ports:
          - containerPort: 80
        resources:
          requests:
            memory: "32Mi"
            cpu: "50m"
          limits:
            memory: "32Mi"
            cpu: "50m"
      - name: cache-container
        image: redis:6.2.10
        ports:
          - containerPort: 6379
        resources:
          requests:
            memory: "32Mi"
            cpu: "50m"
          limits:
            memory: "32Mi"
            cpu: "50m"

こちらのマニフェストを反映しておきます。

kubectl apply -f deployment.yaml

ファイルで更新

下記のようなパッチ用のファイル(patch-image.yml)を用意して、更新します。

spec:
  template:
    spec:
      containers:
      - name: web-container
        image: nginx:1.20.2

下記のように--patch-fileでファイル指定でリソースを更新できます。

kubectl patch deploy myapp --patch-file patch-image.yml

パッチファイルの通りイメージが更新されているのが確認できます。

❯ kubectl describe deploy | grep -i image
    Image:      nginx:1.20.2
    Image:      redis:6.2.10

--dry-runをすれば、リソースを変更せずに変更後のリソースのマニフェストを確認できます。

kubectl patch deploy myapp --patch-file patch-image.yml --dry-run -o yaml

コマンドから更新

パッチファイルを用意せずとも、コマンドのみでリソースの更新もできます。

下記のようにJSON形式で指定して、リソースを更新できます。

kubectl patch deploy myapp -p '{"spec":{"replicas":5}}'
❯ kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
myapp   5/5     5            5           2m50s

ちょっと見にくいですが、先ほどのパッチファイルと同じようにイメージの更新も可能です。

kubectl patch deploy myapp -p '{"spec":{"template":{"spec":{"containers":[{"name":"web-container","image":"nginx:1.21.6"}]}}}}'
❯ kubectl describe deploy | grep -i image
    Image:      nginx:1.21.6
    Image:      redis:6.2.10

JSON Patchで更新

先ほどまではデフォルトのStrategic Merge Patch方式でしたが、JSON Patchでのリソース更新の方法もみていきます。

下記のコマンドでは、1つ目のコンテナのイメージの値を置き換えています。

kubectl patch deploy myapp --type json -p '[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"nginx:1.22.1"}]'
❯ kubectl describe deploy | grep -i image
    Image:      nginx:1.22.1
    Image:      redis:6.2.10

下記のように、複数の操作を並べることもできます。

kubectl patch deploy myapp --type json -p '[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"nginx:1.23.3"},{"op": "replace", "path": "/spec/template/spec/containers/1/image", "value":"redis:7.0.8"}]'
❯ kubectl describe deploy | grep -i image
    Image:      nginx:1.23.3
    Image:      redis:7.0.8

書き換えだけでなく、追加もできます。下記では、3つ目のコンテナを追加しています。

kubectl patch deploy myapp --type json -p '[{"op": "add", "path": "/spec/template/spec/containers/2", "value":{"name": "busybox", "image": "busybox:1.36", "command": ["sleep", "9999"]}}]'
❯ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
myapp-64547c4958-b9l6p   3/3     Running   0          2m29s
myapp-64547c4958-fkgqp   3/3     Running   0          2m7s
myapp-64547c4958-l4wrx   3/3     Running   0          2m9s
myapp-64547c4958-rszpn   3/3     Running   0          2m29s
myapp-64547c4958-tz4tz   3/3     Running   0          2m28s

下記のコマンドでは、3つ目のコンテナを削除しています。

kubectl patch deploy myapp --type json -p '[{"op": "remove", "path": "/spec/template/spec/containers/2"}]'
❯ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
myapp-57c7b8bd67-blb6k   2/2     Running   0          4m4s
myapp-57c7b8bd67-bsfqz   2/2     Running   0          4m3s
myapp-57c7b8bd67-pfxk7   2/2     Running   0          4m4s
myapp-57c7b8bd67-s44ht   2/2     Running   0          3m44s
myapp-57c7b8bd67-w8hfd   2/2     Running   0          3m44s

参考

タイトルとURLをコピーしました