kubectl patchでリソース更新

2023.01.20
2024.03.24
Kubernetes
kubectl

はじめに

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

kubectl patch

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

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

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

Kubectl Reference Docs

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

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

サンプルDeployment

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

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5  labels:
6    app: myapp
7spec:
8  replicas: 3
9  selector:
10    matchLabels:
11      app: myapp
12  template:
13    metadata:
14      labels:
15        app: myapp
16    spec:
17      containers:
18      - name: web-container
19        image: nginx:1.19.10
20        ports:
21          - containerPort: 80
22        resources:
23          requests:
24            memory: "32Mi"
25            cpu: "50m"
26          limits:
27            memory: "32Mi"
28            cpu: "50m"
29      - name: cache-container
30        image: redis:6.2.10
31        ports:
32          - containerPort: 6379
33        resources:
34          requests:
35            memory: "32Mi"
36            cpu: "50m"
37          limits:
38            memory: "32Mi"
39            cpu: "50m"

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

1kubectl apply -f deployment.yaml

ファイルで更新

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

1spec:
2  template:
3    spec:
4      containers:
5      - name: web-container
6        image: nginx:1.20.2

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

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

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

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

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

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

コマンドから更新

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

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

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

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

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

JSON Patchで更新

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

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

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

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

1kubectl 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"}]'
1❯ kubectl describe deploy | grep -i image
2    Image:      nginx:1.23.3
3    Image:      redis:7.0.8

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

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

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

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee