Pod资源的基础管理操作(Kubernetes)
Pod是Kubernetes API中的核心资源类型,它可以定义在JSON或者YAML格式的资源清单中,由资源管理命令进行陈述式声明管理。创建时通过create或apply命令将请求提交到API Server并将其保存至集群状态存储系统etcd中,然后由调度器将其调度至最佳节点,并被相应节点的kubelet借助于容器引擎创建并启动。这种由用户直接通过API创建的Pod对象也称为自主式Pod。
陈述式对象配置管理方式
陈述式对象配置管理机制,是由用户通过配置文件指定要管理的目标资源对象,而后再由用户借助于命令直接指定Kubernetes系统要执行的管理操作的管理方式,常用的命令有create、delete、replace、describe等。
创建Pod资源
Pod是标准Kubernetes API资源,在配置清单中使用kind、apiVersion、metadata、spec字段进行定义,status字段在对象创建后由系统自行维护。Pod对象的核心功用在于运行容器化应用。在spec字段中嵌套的必选字段是containers,它的值是一个容器对象列表,支持嵌套创建一到多个容器。
下面是一个Pod资源清单示例文件,在spec中定义的期望的状态是在Pod对象中基于ikubernetes/myapp:v1镜像运行一个名为myapp的容器:
vi pod-example.yaml apiVersion: v1 kind: Pod metadata: name: pod-example spec: containers: - name: myapp image: ikubernetes/myapp:v2
把上面的内容保存于配置文件中,使用 “kubectl [COMMAND] -f /PATH/TO/YAML_FILE” 命令以陈述式对象配置进行资源对象的创建。
kubectl create pod-example.yaml pod/pod-example created
注意:如果熟悉JSON,也可以直接将清单文件定义为JSON格式YAML格式的清单文件本身也是由API Server事先将其转换为JSON格式而后才进行应用的。
命令返回信息表示目标Pod对象pod-example创建成功。事实上,create命令中的-f选项也支持使用目录路径或URL,而且目标路径为目录时,还支持使用-R选项进行子目录递归。另外,--record选项可以将命令本身记录为目标对象的注解信息kubernetes.io/change-sause ,而--save-config则能够将提供给命令的资源对象配置信息保存于对象的注解信息kubelet.kubernetes.io/last-applied-configuration 中,后一个命令的功用与声明式对象配置命令apply的功能相近。
查看Pod状态
get命令默认显示资源对象最为关键的状态信息,而describe等命令则能够打印出Kubernetes资源对象的详细状态。不过虽然创建时给出的资源清单文件比较简洁,但“kubectl get”命令可以使用“-o yaml”或“-o json”选项输出资源对象的配置书记和状态,也能借助“--custom-columns”选项自定义要显示的字段:
kubectl get -f pod-example.yaml NAME READY STATUS RESTARTS AGE pod-example 1/1 Running 0 1m
kubectl get -f pod-example.yaml -o custom-columns=NAME:metadata.name,STATUS:status.phase NAME STATUS pod-example Running
kubectl describe -f pod-example.yaml
对于Pod资源对象来说,它能够返回活动对象的元数据、当前状态、容器列表及各容器的详情、存储卷对象列表、Qos类别、事件及相关信息,这些详情对于了解目标资源对象的状态或进行错误排查等操作来说至关重要~
更新Pod资源
对于活动对象,并非每个属性值都支持修改,比如,Pod资源对象的metadata.name字段就不支持修改,除非删除并重建它。对于那些支持修改的属性,比如容器的image字段,可将其完整的配置清单导出于配置文件中并更新相应的配置数据,而后使用replace命令基于陈述式对象配置的管理机制进行资源对象的更新。比如,将前面创建的pod-example时使用的资源清单中的image值修改为“ikubernetes/myapp: v1”,而后执行更新操作:
kubectl get pods pod-example -o yaml > pod-example-update.yaml sed -i 's@\(image:\).*@ikubernetes/myapp:v1@' pod-example-update.yaml kubectl replace -f pod-example-update.yaml
#sed -i 's/myapp:v1/myapp:v2/' pod-example-update.yaml
#'/'-----'#'
kubectl replace -f pod-example.yaml --force pod “pod-example” deleted pod/pod-example replaced
删除Pod资源
陈述式对象配置管理方式下的删除操作与创建、查看及更新操作类似,为delete命令使用-f选项指定配置清单即可,比如删除pod-example.yaml文件中定义的Pod资源对象:
kubectl delete -f pod-example.yaml pod “pod-example” deleted
之后再打印相关配置清单中定义的资源对象即可验证其删除结果:
kubectl get -f pod-example.yaml No resource found. Error from server (NotFound) :pods “pod-example” not found
声明式对象配置管理方式
陈述式对象配置管理机制中,同时指定的多个资源必须进行同一种操作,而且其replace命令是通过完全替换现有的活动对象来进行资源的更新操作,对于生产环境来说并非理想选择。声明式对象配置操作在管理资源对象时将配置信息保存于目标对象的注解中,并通过比较活动对象的当前配置、前一次管理操作时保存于注解中的配置,以及当前命令提供的配置生成更新补丁从而完成活动对象的补丁式更新操作。这类操作常用命令有apply和patch等。
上面定义的主容器使用“ikubernetes/myapp: v2”镜像的Pod资源对象还可以使用下面命令进行:
kubectl apply -f pod-example.yaml pod/pod-example created
而更新对象的操作可以直接修改原有资源清单文件后再次对其执行apply命令来完成,比如修改Pod资源配置清单中的镜像文件为“ikubernetes/myapp: v1”后再次执行上面命令
kubectl apply -f pod-example.yaml pod/pod-example configured
总结:kubectl create和kubectl apply的区别:
·apply可更新已存在的资源
·create如果已经存在会报already exists(已经存在)。