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

  

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

#'/'-----'#'

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

  

命令结果显示资源重新配置完成并且已经生效。事实上这类操作也能完全使用patch命令直接进行补丁操作。而资源对象的删除操作依然可以使用apply命令,但要同时使用--prune选项,命令格式为“kubectl apply -f --prune -l ”。需要注意的是这条命令比较niubi(特别凶险),因为它将基于标签选择器过滤出所有符合条件的对象,并检查由-f指定的目录中是否存在某配置文件已经定义了相应的资源对象,那些不存在相应定义的资源对象将被删除。所以删除资源对象的操作依然建议使用陈述式对象配置方式的命令“kubectl delete”进行,这样的命令的格式操作目标明确并且不易出现偏差。
总结:kubectl create和kubectl apply的区别:
·apply可更新已存在的资源
·create如果已经存在会报already exists(已经存在)。

Pod资源的基础管理操作(Kubernetes)的更多相关文章

  1. k8spod资源的基础管理操作

    pod是k8s api中的核心资源类型,它可以定义在json或yaml格式的资源清单中,由资源管理命令进行陈述式或声明式管理.创建时,用户可通过create或apply命令将请求提交到apiserve ...

  2. k8s管理pod资源对象(下)

    一.标签与标签选择器 1.标签是k8s极具特色的功能之一,它能够附加于k8s的任何资源对象之上.简单来说,标签就是键值类型的数据,它们可于资源创建时直接指定,也可随时按需添加于活动对象中,而后即可由标 ...

  3. k8s管理pod资源对象(上)

    一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...

  4. Kubernetes Pod 资源限制

    Kubernetes Pod 资源限制 官方文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources- ...

  5. Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize

    追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...

  6. Docker集群管理工具 - Kubernetes 部署记录 (运维小结)

    一.  Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...

  7. 在 Web 级集群中动态调整 Pod 资源限制

    作者阿里云容器平台技术专家 王程阿里云容器平台技术专家 张晓宇(衷源) ## 引子 不知道大家有没有过这样的经历,当我们拥有了一套 Kubernetes 集群,然后开始部署应用的时候,我们应该给容器分 ...

  8. 容器编排系统之Pod资源配置清单基础

    前文我们了解了k8s上的集群管理工具kubectl的基础操作以及相关资源的管理,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14130540.html:今天我 ...

  9. docker集群管理之kubernetes

    一.简介 kubernetes又叫做k8s,是Google开发的一款开源的docker集群管理工具,在这里对它的“发家史”,我不做过多的阐述,有时间大家可以自己去百度一下: 下面我要讲的就是容易混淆的 ...

  10. Kubernetes-5.Pod资源控制器(1)

    docker version:20.10.2 kubernetes version:1.20.1 本文概述Kubernetes Pod资源控制器的ReplicaSet.Deployment.Daemo ...

随机推荐

  1. gcc_to_use

    gcc 目录 gcc 概要 基本指令及功能(以gcc为例) gcc -gdb gcc -cmake 概要 GCC:GNU Compiler Collection(GUN 编译器集合),是GNU项目中符 ...

  2. 微服务减少jar包体积

    <build> <finalName>${project.artifactId}</finalName> <plugins> <!--打包jar- ...

  3. windows 链接 MySQL8.0.28 报错: SSL connection error: unknown error number 解决办法

    找到 My.ini文件,以管理员身份打开并在  [mysqld]   节点下 增加   skip_ssl   选项并保存,重启 MySQL 服务 执行SQL语句    SHOW VARIABLES L ...

  4. C# 生成二维码方法(QRCoder)

    前言 二维码很多地方都有使用到.如果是静态的二维码还是比较好处理的,通过在线工具就可以直接生成一张二维码图片,比如:草料二维码. 但有的时候是需要动态生成的(根据动态数据生成),这个使用在线就工具就无 ...

  5. KingbaseES V8R6备份恢复案例之---自定义表空间指定恢复目录数据恢复

    案例说明: KingbaseES V8R6在通过sys_rman执行物理备份恢复时,可以通过参数'--kb1-path',指定恢复的数据(data)目录,但如果原备份中包含自定义表空间时,需要建立表空 ...

  6. Python-numpy基本用法

    import numpy as np import numpy as np #导入numpy库 _version_显示版本号 show_config() 显示配置文件 print(np.__versi ...

  7. Linux编译安装中的--prefix

    本文主要说明--prefix参数的作用,其主要用在编译安装源代码应用中的./configure环节. 1.源码安装一般包括几个步骤:配置(configure),编译(make),安装(make ins ...

  8. x264码率控制

    1. x264 1.1 preset 的参数主要调节编码速度和质量的平衡,有ultrafast.superfast.veryfast.faster.fast.medium.slow.slower.ve ...

  9. java中post发送json格式数据

    /** * 发送post请求 * @param URL 数据发送地址 * @param json json格式数据内容 * @param headParams 请求头内容 * @return 请求结果 ...

  10. Mybatis拦截器,修改Date类型数据。设置毫秒为0

    1:背景 Mysql自动将datetime类型的毫秒数四舍五入,比如代码中传入的Date类型的数据值为  2021.03.31 23:59:59.700     到数据库   2021.04.01 0 ...