kubectl patchでリソース更新
はじめに
kubectl patch
について、実際の例を見ながら使い方を紹介していきます。
kubectl patch
kubectl patch
はStrategic Merge Patch、JSON Merge Patch、JSON Patchを使って、リソースを更新するコマンドです。
下記の形式でコマンドを実行します。
1kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE]
Kubectl Reference Docs
kubectl patch
はtype
オプションで、下記のマージタイプを選択できます。
json
: JSON Patchmerge
: JSON Merge Patchstrategic
(default): Strategic Merge Patch
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
参考
- Kubectl Reference Docs
- kubectlチートシート | Kubernetes
- Update API Objects in Place Using kubectl patch | Kubernetes
- JSON Patch | jsonpatch.com
- RFC 7396 - JSON Merge Patch 日本語訳
- RFC 6902 - JavaScript Object Notation (JSON) Patch 日本語訳
- @erosb about software