3.5.1 陈述式对象配置管理方式

陈述式对象配置管理机制,是由用户通过配置文件指定要管理的目标资源对象,而后再由用户借助与命令直接指定 Kubernetes 系统要执行的管理操作的管理方式,常用的命令由 create、delete、replace、get 和 describe 等。

1. 创建 Pod 资源

Pod 是标准的 Kubernetes API 资源,在配置清单中使用 kind、apiVersion、metadata 和 spec 字段进行定义,status 字段在对象创建后由系统进行维护。Pod 对象的核心功能用在于运行容器化应用,在其spec字段中嵌套的必选字段是 containers,它的值是一个容器对象列表,支持嵌套创建一到多个容器。下面是一个Pod资源清单示例文件,在spec中定义的期望的状态是在 Pod 对象中基于 ikubernetes/myapp:v1 镜像运行一个名为 myapp 的容器:

apiVersion: v1
kind: Pod
metadata:
    name: pod-example
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1

把上面的内容保存于配置文件中,使用“kubectl [command] f [path/to/yaml_file]” 命令以陈述式对象配置进行资源对象的创建,下面是相应的命令及响应结果:

**[terminal]
**[delimiter $ ]**[command kubectl create -f pod-example.yaml]
pod/pod-exmaple created

如果读者熟悉JSON,也可以直接将清单文件定义为JSON格式;YAML格式的清单文件本身也是由API Server事先将其转换为JSON格式而后才进行应用的。

命令返回的信息表示目标 Pod 对象 pod-example 得以创建成功。事实上,create命令中的 -f 选项也支持使用目录路径或URL,而且目标路径为目录时,还支持使用-R选项进行子目录递归。另外,--record 选项可以将命令本身记录为目标对象的注解信息 kubernetes.io/change-cause,而 --save-config 则能够将提供给命令的资源对象配置信息保存于对象的注解信息 kubectl.kubernetes.io/last-applied-configuration 中,后一个命令的功用与声明式对象配置命令 apply 的功能相近。

2. 查看 Pod 状态

get 命令默认显示资源对象最为关键的状态信息,而 describe 等命令则能够打印出 kubernetes 资源对象的详细状态。不过,虽然创建时给出的资源清单文件较为简洁,但“kubectl get”命令既可以使用“-o yaml”或“-o json”选项输出资源对象的配置数据及状态,也能够借助于“--custom-columns”选项自定义要显示的字段:

**[terminal]
**[delimiter $ ]**[command kubectl get -f pod-example.yaml]
NAME          READY   STATUS    RESTARTS   AGE
pod-exmaple   1/1     Running   0          10m
**[delimiter $ ]**[command kubectl get -f pod-example.yaml -o custom-columns=NAME:metadata.name,STATUS:status.phase]
NAME          STATUS
pod-exmaple   Running

使用“-o yaml”或“-o json”选项时,get命令能够返回资源对象的元数据、期望的状态及当前状态数据信息,而要打印活动对象的详细信息,则需要 describe 命令,它可根据资源清单、资源名称或卷标等方式过滤输出符合条件的资源对象的信息。命令格式为“kubectl describe (-f FILENAME | TYPE [NAME_PREFIX] | -l label | TYPE/NAME)”。例如,显示pod-example的详细信息,可使用类如下的命令:

**[terminal]
**[delimiter $ ]**[command kubectl describe -f pod-example.yaml]

对于Pod资源来说,他能够返回活动对象的元数据、当前状态、容器列表及各容器的详情、存储卷对象列表、QoS列表、事件及相关信息,这些详情对于了解目标资源对象的状态或进行错误排查等操作来说至关重要。

3. 更新 Pod 资源

对于活动对象,并非每个属性值都支持修改,例如,Pod 资源对象的 metadata.name 字段就不支持修改,除非删除并重建它。对于那些支持修改的属性,比如,容器的 image 字段,可将其完整的配置清单导出与配置文件中并更新相应的配置数据,而后使用 replace 命令基于陈述式对象配置的管理机制进行资源对象的更新。例如,将前面创建 pod-example 时使用的资源清单中的 image 值修改为 “ikubernetes/myapp:v2”,而后执行更新操作:

**[terminal]
**[delimiter $ ]**[command kubectl get pods pod-example -o yaml  > pod-example-update.yaml]
**[delimiter $ ]**[command sed -i 's@\(image:\).*@image: ikubernetes/myapp:v2@' pod-example-update.yaml]
**[delimiter $ ]**[command kubectl replace -f pod-example-update.yaml]
pod/pod-example replaced

更新活动对象的配置时,replace 命令要重构整个资源对象,故此它必须基于完整格式的配置信息才能进行活动对象的完全替换。若要基于此前的配置文件进行替换,就必须使用 --force 选项删除此前的活动对象,而后再进行新建操作,否则命令会返回错误信息。例如,将前面第一步创建“创建Pod资源”内的配置清单中的镜像修改为“ikubernetes/myapp:v2”后再进行强制替换,命令如下:

**[terminal]
**[delimiter $ ]**[command kubectl replace -f pod-example.yaml --force]
pod "pod-example" deleted
pod/pod-example replaced

4. 删除 Pod 资源

陈述式对象配置管理方式下的删除操作与创建、查看及更新操作类似,为 delete 命令使用 -f 选项指定配置清单即可,例如,删除 pod-example.yaml 文件中定义的Pod资源对象:

**[terminal]
**[delimiter $ ]**[command kubectl delete -f pod-example.yaml]
pod "pod-example" deleted

之后再次打印相关配置清单中定义的资源对象即可验证其删除的结果,例如:

**[terminal]
**[delimiter $ ]**[command kubectl get -f pod-example.yaml]
Error from server (NotFound): pods "pod-example" not found

results matching ""

    No results matching ""