1.目的

使用k8s的patch命令修改启动容器的信息,这里给出两个测试文件,nginx.yaml文件是正常部署应用的yaml文件,patch-file.yaml文件是修改的文件。

2.测试文件

nginx.yaml如下:

apiVersion: apps/v1
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

patch-file.yaml文件如下:

spec:
  template:
    spec:
      containers:
      - name: patch-demo-ctr-2
        image: redis

3.启动应用

kubectl create -f nginx.yaml

4.修改应用

方式1:

直接执行patch-file.yaml文件

kubectl patch deployment patch-demo --patch "$(cat patch-file.yaml)"

这时会发现添加了一个redis镜像到容器内,相当于容器内有两个镜像了,而不是我们想要的替换!原因是这里没有添加type参数(--type )相当于使用了默认的strategic类型,strategic类型对于containers的修改默认采用添加的形式,对于其他的比如toletations则是替换。想要替换也可以实现,将-name改成和nginx.yaml的-name一致即可,如下:

spec:
  template:
    spec:
      containers:
      - name: patch-demo-ctr
        image: redis

然后执行:

kubectl patch deployment patch-demo --patch "$(cat patch-file.yaml)"

这种方式不推荐,因为官方没有说这种方式,是笔者自己测试出来的。

方式2:

修改type类型,将其改成merge类型,如下(注意这里还是使用最开始的patch-file.yaml文件):

kubectl patch deployment patch-demo --type merge --patch "$(cat patch-file.yaml)"

方式3:

修改patch-file.yaml文件并且修改类型,文件如下:

[
 {
  "op": "replace",
  "path": "/spec/template/spec/containers/0/image",
  "value": "redis"
 }
]

执行命令的类型改完json,如下:

kubectl patch deployment patch-demo --type json --patch "$(cat patch-file.yaml)"

5.patch类型介绍

方式1对应的是strategic merge patch

方式2对应的是json merge patch

方式3对应的是json patch

strategic merge patch:这是默认的类型,这种patch模式针对修改不同的内容需要查看官方的说明,有的是进行替换如toletations,有的是进行添加如containers。查看地址

json merge patch:只给出要修改的yaml内容即可,因为要构造yaml的内容所以比较适合yaml简单的修改。

json patch:比较灵活的一种模式,其中op参数可以是多种,比如add添加,remove删除,replace替换等。

官方patch介绍地址

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐