理解Kubernetes对象。
什么是Kubernetes对象?
文章目录
在 Kubernetes 系统中,Kubernetes 对象 是持久化的实体。 Kubernetes 使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息:
- 哪些容器化应用在运行(以及在哪些节点上)
- 可以被应用使用的资源
- 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略
以上是官方所给的理解。以下是我的理解:k8s的对象是“目标性的记录”(一般在.yaml文件中表示,之后被编译成josn):一但创建了k8s的对象,就相当于告知k8s系统我想要实现什么样的期望,所期望的集群是什么样的,这也就是kuernetes集群的期望状态。
对象约束(spec)和状态(status)
- 几乎每个kubernetes对象都拥有spec和status;
- 对于spec 用来描述 对象的的内容,以及描述你希望对象拥有的特征:期待状态!
- 对于status用来描述对象的当前状态!
我们通过官方的对象描述文件来举例描述对象
当我们创建k8s对象时,我们必须提供对象约束spec,用来描述对象的期待状态,以及一些基本信息(name images ns ···)而后则调用k8s API直接创建或者使用kube命令行kubectl。
application/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
创建:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
# 输出
deployment.apps/nginx-deployment created
在描述对象yaml’中的必要字段:
apiserver - 创建该对象使用的apiserver版本,必须且创建后不可更改。
kind - 创建的对象类别。必须且创建后不可更改
metadata - 帮助唯一性标识对象的一些数据、也是etcd所存储的数据、同时各个组件向apis请求返回的也是元数据。包括name uid namespace···
spec - 你所期望的对象状态 。spec拥有很多字段,在文章后面会讲。
k8s的对象管理;
指令式命令:
例子:
建立deployment对象来运行nginx实例。
#创建
kubectl create deployment nginx --image nginx
#删除
kubectl delete pod nginx
指令式配置:
在指令式对象配置中,kubectl 命令指定操作(创建,替换等),可选标志和 至少一个文件名。指定的文件必须包含 YAML 或 JSON 格式的对象的完整定义。
#创建yaml配置定义的对象实例
kubectl create -f nginx.yaml
#删除配置中的对象实例
kubectl delete -f nginx.yaml
#通过覆盖活动来更新配置中的实例对象
kubectl replace -f nginx.yaml
权衡
命令式优缺点:
优点:
- 命令简单易学
- 命令仅需一步即可配置实例
缺点: - 只能查看实时内容,不能追随历史源
- 不便审计,维护
- 不便集成
配置式优缺点:
优点:
- 可以将需要追随的源存在源仓库中,例如Git
- 便于查看流程和历史源审计
- 提供了供新对象使用的模板
缺点:
- 需要格外编写yaml文档
- 需要对整个对象的架构有一定了解。
命名空间namespace
在上一篇文章中我们知道 对于k8s是由多个物理集群组成的。而命名空间则是k8s定义的虚拟机群,k8s可以拥有多个虚拟机群,虚拟机群互相隔离。
命名空间的使用场景
对于只有几个到几十个。当业务量出现重复和庞大的场景则命名空间就是一个非常好的存在,命名空间中的资源名字是唯一的,
使用命名空间
需要注意的是,一般禁止使用kube-作为命名空间名称的开头,因为kube-是系统命名空间的声明。
展示命名空间的常用操作:
# 查看展示命名空间
kubectl get namespace
NAME STATUS AGE
default Active 1d
kube-node-lease Active 1d
kube-system Active 1d
kube-public Active 1d
#系统初始定义了四个命名空间
default 没有指明使用其它名字空间的对象所使用的默认名字空间
kube-system Kubernetes 系统创建对象所使用的名字空间
kube-public 这个名字空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。 这个名字空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。 这个名字空间的公共方面只是一种约定,而不是要求。
kube-node-lease 此名字空间用于与各个节点相关的 租约(Lease)对象。 节点租期允许 kubelet 发送心跳,由此控制面能够检测到节点故障。
#为当前请求设置命名空间
kubectl run nginx --image=nginx --namespace=<名字空间名称>
kubectl get pods --namespace=<名字空间名称>
#创建命名空间
kubectl create namespace myns
#删除命名空间
kubectl delete namespace myns
#设置命名空间偏好
kubectl config set-context --current --namespace=<名字空间名称>
# 验证之
kubectl config view | grep namespace:
需要我们知道的是,并非所有的对象都存在于命名空间中,这表现在命名空间本身就是‘资源’,而有些内容不适存在资源中。
在我的理解中,k8s是以声明资源为对象的方式管控,也就是说意义上,无论是节点还是各组件都是我们需要认知的资源对象,资源对象又分为上层资源(例如 Pod、Service、副本控制器等)大多数资源都是上层资源,且位于namespace中,而下层资源(例如,节点和持久化卷pvc不属于namespace)。
恰恰namespace的意义就是管控资源对象的区域性。
# 位于名字空间中的资源
kubectl api-resources --namespaced=true
# 不在名字空间中的资源
kubectl api-resources --namespaced=false
标签labels
标签是附加到k8s对象(例如pod)上的键值对,意在向用户提供由于的标识属性。标签可以在创建对象时添加,之后也可以创建删除改写,每个键值对对于给定的对象是唯一的。
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
注解annotations
你可以添加k8s对象的任意注解,通过元数据添加到对象中。注解与标签相反在,注解不愿意让用户看到,意指面向开发人员,用来连接客户端程序时的信息(例如:库和工具类)。
注解和标签一样是k-v结构的键值对,可以是结构化也可以是非结构化,
"metadata": {
"annotations": {
"key1" : "value1",
"key2" : "value2"
}
}
终止器Finalizer
Finalizer是golang垃圾收集的体现,finalizer是带有命名空间的键,高数k8s满足一定条件后删除对象。
流程:当你告诉k8s删除一个指定finalizer的对象时,k8s api会立即标注该对象为删除,随之进入只读状态,其他平面控制器会采取finalizer指定的行动,目标对象为终止状态(terminating),所有行动执行完后,控制器会删除目标对象的finalizer,当元数据中metadate.finalizers 字段为空时,k8s才会认为完全删除。
你可以定义一个finalizers来设定收集垃圾,当你删除目标资源时会先情理相关资源或设施。finalizers并不执行代码,更类似于注解。
如想深入了解finalizer可前往kubernetes.io查看
字段选择器Field selectors
本人认为kubernetes.io拥有需要培训机构都不会讲但在企业中时常用到的功能,字段选择就是。
字段选择很简单易懂:在元数据中添加字段选择器,以便我们查找时方便分类。
例:
metadata.name=my-service
metadata.namespace!=default
status.phase=Pending
#筛选status.phase字段的pod
kubectl get pods --field-selector status.phase=Running
#字段选择器就是为了筛选。所以当字段选择器为空时,与查询等价
kubectl get pods
kubectl get pods --field-selector ""
至此 k8s的对象主要内容完毕