一:什么是Kubernetes对象
Kubernetes对象指的是Kubernetes系统的持久化实体,所有这些对象合起来,代表了你集群的实际情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes将其数据以Kubernetes对象的形式通过 api server存储在 etcd 中。具体来说,这些数据(Kubernetes对象)描述了:
- 集群中运行了哪些容器化应用程序(以及在哪个节点上运行)
- 集群中对应用程序可用的资源
- 应用程序相关的策略定义,例如,重启策略、升级策略、容错策略
- 其他Kubernetes管理应用程序时所需要的信息
操作 Kubernetes 对象(创建、修改、删除)的方法主要有:
- kubectl 命令行工具
- kuboard 图形界面工具
kubectl、kuboard 最终都通过调用 kubernetes API (opens new window)来实现对 Kubernetes 对象的操作
对象的spec和status
每一个 Kubernetes 对象都包含了两个重要的字段:
- spec 必须由您来提供,描述了您对该对象所期望的 目标状态
- status 只能由 Kubernetes 系统来修改,描述了该对象在 Kubernetes 系统中的 实际状态
二:管理Kubernetes对象的方式
方式一:指令性的命令行
当使用指令性的命令行(imperative commands)时,用户通过向 kubectl 命令提供参数的方式,直接操作集群中的 Kubernetes 对象。此时,用户无需编写或修改 .yaml 文件。
这是在 Kubernetes 集群中执行一次性任务的一个简便的办法。由于这种方式直接修改 Kubernetes 对象,也就无法提供历史配置查看的功能
例如:
创建一个 Deployment 对象,以运行一个 nginx 实例:
kubectl run nginx --image nginx
下面的命令完成了相同的任务,但是命令格式不同:
kubectl create deployment nginx --image nginx
方式二:指令性的对象配置
使用指令性的对象配置(imperative object configuration)时,需要向 kubectl 命令指定具体的操作(create,replace,apply,delete等),可选参数以及至少一个配置文件的名字。配置文件中必须包括一个完整的对象的定义,可以是 yaml 格式,也可以是 json 格式。
例子:
通过配置文件创建对象
kubectl create -f nginx.yaml
删除两个配置文件中的对象
kubectl delete -f nginx.yaml -f redis.yaml
直接使用配置文件中的对象定义,替换Kubernetes中对应的对象:
kubectl replace -f nginx.yaml
方式三:声明式的对象配置
当使用声明式的对象配置时,用户操作本地存储的Kubernetes对象配置文件,然而,在将文件传递给 kubectl 命令时,并不指定具体的操作,由 kubectl 自动检查每一个对象的状态并自行决定是创建、更新、还是删除该对象。使用这种方法时,可以直接针对一个或多个文件目录进行操作(对不同的对象可能需要执行不同的操作)。
例子:
处理 configs 目录中所有配置文件中的Kubernetes对象,根据情况创建对象、或更新Kubernetes中已经存在的对象。可以先执行 diff 指令查看具体的变更,然后执行 apply 指令执行变更:
kubectl diff -f configs/
kubectl apply -f configs/
递归处理目录中的内容:
kubectl diff -R -f configs/
kubectl apply -R -f configs/
三:名称空间
Kubernetes通过名称空间(namespace)在同一个物理集群上支持多个虚拟集群。
名称空间的用途是,为不同团队的用户(或项目)提供虚拟的集群空间,也可以用来区分开发环境/测试环境、准上线环境/生产环境。
名称空间为 名称 提供了作用域。名称空间内部的同类型对象不能重名,但是跨名称空间可以有同名同类型对象。名称空间不可以嵌套,任何一个Kubernetes对象只能在一个名称空间中。
通过kubectl使用名称空间
1、查看名称空间
执行命令 kubectl get namespaces 可以查看名称空间,输出结果如下所示:
NAME STATUS AGE
default Active 1d
kube-system Active 1d
kube-public Active 1d
Kubernetes 安装成功后,默认有初始化了三个名称空间:
- default 默认名称空间,如果 Kubernetes 对象中不定义 metadata.namespace 字段,该对象将放在此名称空间下
- kube-system Kubernetes系统创建的对象放在此名称空间下
- kube-public 此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些未登录的用户)。主要是为集群预留的,例如,某些情况下,某些Kubernetes对象应该被所有集群用户看到
2、在执行请求时设定namespace
执行 kubectl 命令时,可以使用 --namespace 参数指定名称空间,例如:
kubectl run nginx --image=nginx --namespace=<您的名称空间>
kubectl get pods --namespace=<您的名称空间>
通过kuboard使用名称空间
1、查看名称空间
进入集群概要中,右侧就是所有的名称空间
2、创建名称空间
3、使用名称空间
直接先进入名称空间,在进行其他的操作,比如创建负载
四:标签
使用标签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何修改。
应用程序的部署或者批处理程序的部署通常都是多维度的(例如,多个高可用分区、多个程序版本、多个微服务分层)。管理这些对象时,很多时候要针对某一个维度的条件做整体操作,例如,将某个版本的程序整体删除,这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就会非常地便捷。
这里讲一个使用kuboard 使用标签来标记不同节点的情况,这样一个集群可以分测试环境和正式环境,比如集群总共有8个工作节点,可以用5在做为正式环境,就可以在这5台上打上release的标签,其他3台可以打上test的标签,这样就可以可以区分正式环境和测试环境了。
1、在节点上创建标签
进入节点,选择一台服务器,点击进入。
点击编辑标签
输入标签名称和值, 要打相同标签的服务器节点,标签名和值要一样。
2、创建工作负载的时候通过标签指定节点