Kubernetes Patch 学习小结

Kubernetes Patch 学习小结

总结一下Kubernetes Patch的使用方法,详细的说明还要要去看官网[1],K8S用这个命令来对运行中的应用进行动态跟新。总的来
Patch一个API对象有三种方式:

  • 使用JSON Patch来更新一个对象,没有看到具体的例子,看起来这是JSON的一个标准[2],类似数据库的增删改查的方式对原来的JSON格式进行修改,不太清楚K8S对其支持如何。
  • 使用JSON merge patch,这种方式需要定义一个完整的替换列表,也就是说,新的列表定义会替换原有的定义。
  • 使用JSON strategic merge patch,这种补丁是以增量的形式来对已有的定义进行修改,可以理解为类似于linux diff创建的补
    丁。

下面对第二种和第三种形式的更新,分别来举个栗子:

JSON merge patch

下面的例子用来部署一个nginx应用,2份拷贝,后面在此基础上打补丁

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: patch-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: patch-demo-ctr
        image: nginx
      tolerations:
      - effect: NoSchedule
        key: dedicated
        value: test-team

先部署这个应用:

$ kubectl create -f patch_demo.yaml
$ kubectl get pod -o wide

NAME                         READY     STATUS    RESTARTS   AGE       IP             NODE
patch-demo-576f89c99-mf4fj   1/1       Running   0          1m        10.244.2.118   k8s-node2
patch-demo-576f89c99-tb97t   1/1       Running   0          1m        10.244.1.185   k8s-node1

可以两个pod都已经跑了起来,接下来想对image进行修改,定义下面的patch:

spec:
  template:
    spec:
      containers:
      - name: patch-demo-ctr-3
        image: gcr.io/google-samples/node-hello:1.0
$ kubectl patch deployment patch-demo --type merge --patch "$(cat patch_image.yaml)"
$ kubectl get pod -o wide
patch-demo-86c8577c88-bgd9s   1/1       Running   0          9m        10.244.2.119   k8s-node2
patch-demo-86c8577c88-qqfrv   1/1       Running   0          10m       10.244.1.187   k8s-node1

对比pod ID可见已有的pod已经被terminate了,并重新创建了两个新的 pod,可以进一步查看更新后的image:

$ kubectl get deployment patch-demo --output yaml | grep image
      - image: gcr.io/google-samples/node-hello:1.0
        imagePullPolicy: IfNotPresent

JSON strategic merge patch

所谓策略性补丁,就是作为一个对已有配置的增量补丁,想想diff就好了,patch中没有定义的修改内容,则不会对原有配置产生影响,还是看下这个例子,基于原始版本新增一个新的redis的容器,定义好下面的补丁:

spec:
  template:
    spec:
      containers:
      - name: patch-demo-ctr-2
        image: redis
$ kubectl patch deployment patch-demo --patch "$(cat patch_container.yaml)"
deployment "patch-demo" patched

$ kubectl get pod -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP             NODE
patch-demo-74b9844b77-hk2l7   2/2       Running   0          3m        10.244.2.120   k8s-node2
patch-demo-74b9844b77-qjz6r   2/2       Running   0          5m        10.244.1.188   k8s-node1

2/2表示每个pod有两个容器,如果想再看细点,用下面命令来查看pod上跑的image:

$ kubectl get pod patch-demo-74b9844b77-hk2l7 --output yaml | grep image
  - * image: redis *
    imagePullPolicy: Always
  - * image: gcr.io/google-samples/node-hello:1.0 *
    imagePullPolicy: IfNotPresent
    image: redis:latest
    imageID: docker-pullable://redis@sha256:4aed8ea5a5fc4cf05c8d5341b4ae4a4f7c0f9301082a74f6f9a5f321140e0cd3
    image: gcr.io/google-samples/node-hello:1.0
    imageID: docker-pullable://gcr.io/google-samples/node-hello@sha256:d238d0ab54efb76ec0f7b1da666cefa9b40be59ef34346a761b8adc2dd45459b

好了,先总结到这里,详细的介绍还是看官网吧,下周再来看看。


[1] https://kubernetes.io/docs/tasks/run-application/update-api-object-kubectl-patch/
[2] http://erosb.github.io/post/json-patch-vs-merge-patch/

猜你喜欢

转载自blog.csdn.net/chenwei8280/article/details/80381171