はじめに
kubectl patch
について、実際の例を見ながら使い方を紹介していきます。
kubectl patch
kubectl patch
はStrategic Merge Patch、JSON Merge Patch、JSON Patchを使って、リソースを更新するコマンドです。
下記の形式でコマンドを実行します。
kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE]
kubectl patch
はtype
オプションで、下記のマージタイプを選択できます。
json
: JSON Patchmerge
: JSON Merge Patchstrategic
(default): Strategic Merge Patch
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