使用k8s的patch命令修改启动容器的信息,这里给出两个测试文件,nginx.yaml文件是正常部署应用的yaml文件,patch-file.yaml文件是修改的文件。
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
kubectl create -f nginx.yaml
直接执行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)"
这种方式不推荐,因为官方没有说这种方式,是笔者自己测试出来的。
修改type类型,将其改成merge类型,如下(注意这里还是使用最开始的patch-file.yaml文件):
kubectl patch deployment patch-demo --type merge --patch "$(cat patch-file.yaml)"
修改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)"
方式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介绍地址。