Pod资源的基础管理操作
Pod是K8S API中的核心资源类型,它可以定义在JSON或YAML格式的资源清单中,由资源管理命令进行陈述式或声明式管理。创建时,用户通过create或apply命令将请求提交到API Server并将其保存集群状态存储系统etcd中,而后由调度器将其调度至最佳目标节点,并被相应节点的kubelet借助于容器引擎创建并启动。这种由用户直接通过API创建的Pod对象也称为自主式Pod
陈述对象配置管理方式
陈述式对象配置管理机制,是由用户通过配置文件指定要管理的目标资源对象,而后再由用户借助于命令直接指定K8S系统要执行的管理操作的管理方式,常用的命令由create、delete、replace、get和describe等
创建Pod资源
Pod是标准的K8S API资源,在配置清单中使用apiVersion、kind、metadata和spec字段进行定义,status字段为只读字段,由系统自行填充维护。Pod对象的核心功能在于运行容器化应用,在其spec字段中嵌套的需要字段是containers,它的值是一个容器对象列表,支持嵌套一到多个容器。下面是一个Pod资源清单示例文件,在spec中定义的期望的状态是在Pod对象中基于
docker pull registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1
镜像运行一个名称为mybox的容器
[root@k8s-master01 nginx]# cat box.yaml
apiVersion: v1
kind: Pod
metadata:
name: mybox
spec:
containers:
- name: mybox
image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1
[root@k8s-master01 nginx]#
将上面的内容保存在配置文件中,使用
kubectl [command] -f [/path/filename]
命令以陈述式对象配置进行资源对象的创建
[root@k8s-master01 nginx]# kubectl create -f /etc/kubernetes/nginx/box.yaml
pod/mybox created
[root@k8s-master01 nginx]#、
命令的返回信息表示目标Pod对象mybox成功创建。事实上,create命令中的-f选项也支持使用目录路径或者URL,而且目标路径为目录时,还支持使用-R选项进行子目录递归。另外,—record选项可以将命令本身记录为目标对象的注解信息kubernetes.io/change-cause,而—save-config则能够将提供给命令的资源对象配置信息保存于对象的注解信息kubectl.kubernetes.io/last-applied-configuration中,最后一个命令的功用与声明式对象配置命令apply的功能相近
查看Pod状态
get命令默认显示资源对象最为关键的状态信息,而describe等命令则能够打印出k8s资源对象详细状态。不过,虽然创建时给出的资源清单文件较为简洁,但
kubectl get
命令既可以使用-o yaml
或-o json
选项输出资源对象的配置数据及状态,也能够借助于--custom-columns
选项自定义要显示的字段
[root@k8s-master01 nginx]# kubectl get pods mybox
NAME READY STATUS RESTARTS AGE
mybox 1/1 Running 0 5m59s
[root@k8s-master01 nginx]# kubectl get pods mybox -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mybox 1/1 Running 0 6m4s 10.244.82.8 192.168.1.18 <none> <none>
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl get pods mybox -o custom-columns=NAME:metadata.name,STATUS:status.phase
NAME STATUS
mybox Running
[root@k8s-master01 nginx]#
使用
-o yaml
或者-o json
选项时,get命令能够返回资源对象的元素据,期望的状态及当前状态数据信息,而要打印活动对象的详细信息,则需要使用describe命令,它可以根据资源清单、资源暴名称或卷标等方式过滤输出符合条件的资源对象信息。命令各位为kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)
[root@k8s-master01 nginx]# kubectl describe -f box.yaml
Name: mybox
Namespace: default
Priority: 0
Node: 192.168.1.18/192.168.1.18
Start Time: Sun, 07 Jun 2020 15:02:34 +0600
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.244.82.8
IPs:
IP: 10.244.82.8
Containers:
mybox:
Container ID: docker://9f46d2b0f9221f60ececa51b9048744d5ffe86c580abe3ba01372542b8c50022
Image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1
Image ID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox@sha256:0fc4899e1c59495b980bea7ba1e92c6493f4cdf420edaa5887b1789387b86ac3
Port: <none>
Host Port: <none>
State: Running
Started: Sun, 07 Jun 2020 15:02:35 +0600
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-dk6pt (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-dk6pt:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-dk6pt
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/mybox to 192.168.1.18
Normal Pulled 130m kubelet, 192.168.1.18 Container image "registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1" already present on machine
Normal Created 130m kubelet, 192.168.1.18 Created container mybox
Normal Started 130m kubelet, 192.168.1.18 Started container mybox
[root@k8s-master01 nginx]#
对于Pod资源对象来说,它能够返回活动的元素据、当前状态、容器列表及个容器的详情、存储卷对象列表、Qos类别、事件及相关信息,这些详情对于了解目标资源对象的状态或进行排错等操作来说至关重要
更新Pod资源
对于活动对象,并非其每个属性值都支持修改,例如,Pod资源对象的metadata.name字段就不支持修改,除非删除并重建它。对于那些支持修改的属性,比如,容器的image字段,可将其完整的配置清单导出于配置文件中并更新相应的配置数据,而后使用replace命令基于陈述式对象配置的管理机制进行资源对象的更新
[root@k8s-master01 nginx]# kubectl get pods mybox -o yaml > box-update.yaml
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# cat box-update.yaml |grep image
- image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.2
imagePullPolicy: IfNotPresent
image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1
imageID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox@sha256:0fc4899e1c59495b980bea7ba1e92c6493f4cdf420edaa5887b1789387b86ac3
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl replace -f box-update.yaml
pod/mybox replaced
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl describe pods mybox |grep Image
Image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.2
Image ID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox@sha256:f034739d36045620da266dc52f99dfce0aeb54088d46274f395afecc0b8dff3a
[root@k8s-master01 nginx]#
更新活动的配置时,replace命令要重构整个资源对象,故此它必须基于完整格式的配置信息才能进行活动对象的完全替换。若要基于此前的配置进行替换,就必须使用—force选项删除此前的活动对象,而后再进行重建操作,否则命令会返回错误信息,例如,将前面第一步“创建Pod对象资源”内的配置清单中的镜像修改为0.2后再进行强制替换
[root@k8s-master01 nginx]# kubectl replace -f box-update.yaml --force
pod "mybox" deleted
pod/mybox replaced
[root@k8s-master01 nginx]#
可以看到上述命令的返回结果,则是先删除Pod,然后再重建Pod
删除Pod资源
陈述式对象配置管理方式下的删除操作与创建、查看及更新类操作类似,为delete命令使用-f选项指定清单文件即可,例如删除box.yml文件中定义的pod对象
[root@k8s-master01 nginx]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 5 6d17h
my-nginx-854bbd7557-44wpn 1/1 Running 1 6d17h
my-nginx-854bbd7557-7xnxz 1/1 Running 1 6d17h
my-nginx-854bbd7557-cmtzp 1/1 Running 1 6d17h
my-nginx-854bbd7557-fcpmp 1/1 Running 0 149m
my-nginx-854bbd7557-gz8tr 1/1 Running 0 149m
my-nginx-854bbd7557-jhmkd 1/1 Running 1 6d17h
my-nginx-854bbd7557-l9rgd 1/1 Running 1 6d17h
my-nginx-854bbd7557-lv87f 1/1 Running 0 150m
my-nginx-854bbd7557-m67c6 1/1 Running 0 149m
my-nginx-854bbd7557-whrfc 1/1 Running 0 149m
mybox 1/1 Running 0 118s
[root@k8s-master01 nginx]# kubectl delete -f box.yaml
pod "mybox" deleted
[root@k8s-master01 nginx]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 5 6d17h
my-nginx-854bbd7557-44wpn 1/1 Running 1 6d17h
my-nginx-854bbd7557-7xnxz 1/1 Running 1 6d17h
my-nginx-854bbd7557-cmtzp 1/1 Running 1 6d17h
my-nginx-854bbd7557-fcpmp 1/1 Running 0 150m
my-nginx-854bbd7557-gz8tr 1/1 Running 0 150m
my-nginx-854bbd7557-jhmkd 1/1 Running 1 6d17h
my-nginx-854bbd7557-l9rgd 1/1 Running 1 6d17h
my-nginx-854bbd7557-lv87f 1/1 Running 0 150m
my-nginx-854bbd7557-m67c6 1/1 Running 0 150m
my-nginx-854bbd7557-whrfc 1/1 Running 0 150m
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl get -f box.yaml
Error from server (NotFound): pods "mybox" not found
[root@k8s-master01 nginx]# kubectl get -f box-update.yaml
Error from server (NotFound): pods "mybox" not found
[root@k8s-master01 nginx]#
声明式对象配置管理方式
陈述式对象配置管理机制中,同时指定的多个资源必须进行同一种操作,而且其replace命令是通过完全替换现有的活动对象来进行资源的更新操作,对于生产环境来说,这并非理想的选择。声明式对象配置操作在管理资源对象时将配置信息保存于目标对象的注解中,并通过比较活动对象的当前配置、前一次管理操作时保存于注解中的配置,以及当前命令提供的配置生成更新补丁从而完成活动的补丁式更新操作。此类管理操作的常用命令有apply和patch等,例如, 之前定义的主容器使用的是0.1镜像的Pod资源,还可以使用如下命令进行创建
[root@k8s-master01 nginx]# cat box.yaml
apiVersion: v1
kind: Pod
metadata:
name: mybox
spec:
containers:
- name: mybox
image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl apply -f box.yaml
pod/mybox created
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl describe pods mybox |grep Image
Image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1
Image ID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox@sha256:0fc4899e1c59495b980bea7ba1e92c6493f4cdf420edaa5887b1789387b86ac3
[root@k8s-master01 nginx]#
更新对象的操作,可以直接修改原有资源清单文件再次对其进行apply命令来完成,例如,修改Pod资源清单文件中的镜像版本为0.2
[root@k8s-master01 nginx]# cat box.yaml
apiVersion: v1
kind: Pod
metadata:
name: mybox
spec:
containers:
- name: mybox
image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.2
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl apply -f box.yaml
pod/mybox configured
[root@k8s-master01 nginx]#
[root@k8s-master01 nginx]# kubectl describe pods mybox |grep Image
Image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.2
Image ID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox@sha256:0fc4899e1c59495b980bea7ba1e92c6493f4cdf420edaa5887b1789387b86ac3
[root@k8s-master01 nginx]#
命令结果显示资源重新配置完成,并且已经生效。实际上,此类操作也能使用patch命令直接进行补丁操作。而资源对象的删除操作依然可以使用apply命令,但要同时使用—prune选项,命令的格式为
kubectl apply -f <filename> --prune -l <labels>
。需要注意的是此命令异常凶险,因为它将基于标签选择器过滤出所有符合条件的对象,并检查-f指定的目录中是否存在某配置文件已经定义了相应的资源对象,那些不存在相应定义的资源对象将被删除。因此,删除对象的操作依然建议使用陈述式对象配置方式的命令kubectl delete
进行,这样的命令操作目标明确且不易出现偏差
小结
主要介绍了K8S系统上常用的资源对象类型及其管理方式,在说明kubectl命令行工具的基础用法后借助于namespace资源对象简单说明了其使用方式
- K8S提供了RESTful风格的API,它将各类组件均抽象为资源,并通过属性赋值完成实例化
- K8S API支持的资源类型众多,包括Node、Namespace、Pod、Service、Deployment、ConfigMap等上百种
- 标准格式的资源配置大多都是由apiVersion、kind、metadata、spec和status等一级属性字段组成,其中spec是由用户定义的期望状态,而status则是由系统维护的当前状态
- K8S API主要提供的是声明式对象配置接口,但它也支持陈述式命令及陈述式对象配置的管理方式
- kubectl命令功能众多,它将通过子命令完成不同的任务,如create、delete、edit、replace、apply等
- namespace和Pod是K8S系统的基础资源类型