Kubernetes 声明式对象的 增 删 改 查
前言
我们可以通过在一个目录中存储多个对象配置文件、并使用
kubectl apply
来递归地创建和更新对象来创建、更新和删除 Kubernetes 对象。 这种方法会保留对现有对象已作出的修改,而不会将这些更改写回到对象配置文件中。
kubectl diff
也会给你呈现 apply 将作出的变更的预览。
一、创建对象
使用
kubectl apply
来创建指定目录中配置文件所定义的所有对象,除非对应对象已经存在:
$ kubectl apply -f <目录>/
此操作会在每个对象上设置
kubectl.kubernetes.io/last-applied-configuration: '{...}'
注解。注解值中包含了用来创建对象的配置文件的内容。
现在我们在目录
application/simple_deployment.yaml
中新增一个对象配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:selector:matchLabels:app: nginx
minReadySeconds:5template:metadata:labels:app: nginx
spec:containers:-name: nginx
image: nginx:1.14.2
ports:-containerPort:80
执行
kubectl diff
可以打印出将被创建的对象:
$ kubectl diff -f https://k8s.io/examples/application/simple_deployment.yaml
使用
kubectl apply
来创建对象:
$ kubectl apply -f
https://k8s.io/examples/application/simple_deployment.yaml
使用
kubectl get
打印其现时配置:
$ kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
输出显示注解
kubectl.kubernetes.io/last-applied-configuration
被写入到 现时配置中,并且其内容与配置文件相同:
kind: Deployment
metadata:annotations:# ...# This is the json representation of simple_deployment.yaml# It was written by kubectl apply when the object was createdkubectl.kubernetes.io/last-applied-configuration:|
{"apiVersion":"apps/v1","kind":"Deployment",
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
"spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
"ports":[{"containerPort":80}]}]}}}} # ...spec:# ...minReadySeconds:5selector:matchLabels:# ...app: nginx
template:metadata:# ...labels:app: nginx
spec:containers:-image: nginx:1.14.2
# ...name: nginx
ports:-containerPort:80# ...# ...# ...# ...
二、更新对象
也可以使用
kubectl apply
来更新某个目录中定义的所有对象,即使那些对象已经存在。 这一操作会隐含以下行为:
- 在现时配置中设置配置文件中出现的字段;
- 在现时配置中清除配置文件中已删除的字段。
$ kubectl diff -f <目录>/
$ kubectl apply -f <目录>/
我们来更新
simple_deployment.yaml
配置文件,将镜像文件从 nginx:1.14.2 更改为 nginx:1.16.1,同时删除minReadySeconds 字段:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:selector:matchLabels:app: nginx
template:metadata:labels:app: nginx
spec:containers:-name: nginx
image: nginx:1.16.1 # 更新该镜像ports:-containerPort:80
应用对配置文件所作更改:
$ kubectl diff -f https://k8s.io/examples/application/update_deployment.yaml
$ kubectl apply -f https://k8s.io/examples/application/update_deployment.yaml
使用 kubectl get 打印现时配置:
$ kubectl get -f https://k8s.io/examples/application/update_deployment.yaml -o yaml
在上面输出的结果中,我们会发现,nginx:1.14.2 更改为 nginx:1.16.1,同时删除minReadySeconds 字段。
三、删除对象
有两种方法来删除
kubectl apply
管理的对象。
- 使用指令式命令来手动删除对象是建议的方法,因为这种方法更为明确地给出了 要删除的内容是什么,且不容易造成用户不小心删除了其他对象的情况。
$ kubectl delete -f <文件名>
- 使用替代方法来作为
kubectl delete
操作的替代方式,你可以在目录中对象配置文件被删除之后, 使用kubectl apply
来辩识要删除的对象。 带--prune
标志的apply
命令会首先查询 API 服务器,获得与某组标签相匹配 的对象列表,之后将返回的现时对象配置与目录中的对象配置文件相比较。 如果某对象在查询中被匹配到,但在目录中没有文件与其相对应,并且其中还包含last-applied-configuration
注解,则该对象会被删除。命令如下:
$ kubectl apply -f --prune -l
四、查看对象
在上面文中,我想有些童鞋已经发现了,使用
kubectl get
并指定
-o yaml
选项来查看现时对象的配置:
$ kubectl get -f <文件名 | URL> -o yaml
总结
使用声明式对象配置时,用户对本地存储的对象配置文件进行操作,但是用户 未定义要对该文件执行的操作。 kubectl 会自动检测每个文件的创建、更新和删除操作。 这使得配置可以在目录上工作,根据目录中配置文件对不同的对象执行不同的操作。
本篇文章内容较少,主要介绍了 配置文件对 Kubernetes 对象 的增、删、改、查的操作,由于在Kubernetes 对象管理中,声明式管理是最难的,所以我这里将分两篇文章去讲解,当然在后面我们也会学习指令式命令,指令式对象配置
版权归原作者 半身风雪 所有, 如有侵权,请联系我们删除。