K8S资源与标签
# Kubernetes资源对象
# 资源对象介绍
- 资源实例化后就是对象,但一般不做区别,所以也可以说资源即是对象。在K8S中所有能被操作的东西都是资源,一切皆资源。
# 资源对象分类
我们一般可以将K8S资源划分为以下几类。
# 工作负载型资源
- 用于实际工作的资源。
- 如:Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、Cronjob。
# 服务发现及服务均衡资源
- 如:Service、Ingress。
# 配置中心与存储卷资源
- 如:Volume、CSI、ConfigMap、Secret。
# 集群级资源
- 需要运行在集群节点上的资源。
- 如:NameSpace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding。
# 元数据型资源
- 用于提供或操作元数据的资源。
- 如:HPA、PodTemplate、LimitRange。
# 资源名简写
某些资源名在kubectl命令中是可以简写的,例如:
全称 | 简写 |
---|---|
pod | po |
service | svc |
replication controller | rc |
replica set | rs |
deployment | deploy |
ingress | ing |
# 创建资源的方法
我们需要通过APIServer来进行资源创建,而APIServer仅接收JSON格式的资源定义,除了直接调API接口创建,我们还可以通过以下方式进行创建。
- 通过kubectl命令行直接创建资源。
- kubectl会先将我们的参数转化为json格式,然后再提交给APIServer执行。
- 通过kubectl命令提交yaml格式配置创建资源。
- 用yaml格式提供配置清单,APIServer会自动将其转为json格式,而后再进行执行。
# 资源配置清单
# 配置清单介绍
- 配置清单就是定义好要创建的资源的yaml文件,用于提交给APIServer进行资源创建,一个yaml文件中可以编写多个资源的配置。
# 配置清单通用参数
# apiVersion: [资源版本]
- 资源版本即是**"API群组名/Version"**。
- 如:
apiVersion: node.k8s.io/v1
、apiVersion: node.k8s.io/v1beta1
- 如:
- 没有组名则表示是核心组最根本的资源。
- 如:
apiVersion: v1
- 如:
- 版本分类 (尽量使用稳定版)
- 带beta的是公测版:大部分稳定,但后续可能会修改
- 带alpha的是内测版:不保证稳定
- 以上都不带的是稳定版:基本不会更改,只会添加新的
- 资源版本即是**"API群组名/Version"**。
# kind: [资源类别]
- 资源类别用于表示要创建的资源的类别,需要注意区分大小写。
- 如:
kind: Deployment
、kind: Service
# metadata
- 用于定义资源实例化后的资源对象元数据。
name <string>
- 指定资源名称,名称只能由'-'和'.'以及字母和数字组成。namespace <string>
- 指定资源所属的名称空间,默认为default。labels <map[string]string>
- 指定资源标签annotations <map[string]string>
- 指定资源注解selfLink
- 资源引用路径,无需配置由K8S自动生成,我们可通过本地打开它,来获取相关资源的信息
# spec
- 用于定义资源对象的配置、特性、目标状态等。
# status (只读)
- 用于显示资源对象的当前状态,K8S即是用于确保我们每一个资源定义完后,使当前状态无限向目标状态转移。
- status字段由kubernetes集群维护,无法随意定义。
# 配置清单创建自主式Pod例子
创建资源配置清单文件。
- vim pod-demo.yml
定义Pod资源。
apiVersion: v1
# 资源类别
kind: Pod
metadata:
# 资源名
name: pod-demo
# 资源标签, 键值对格式
labels:
app: myapp
version: demo
spec:
# 指定容器参数,可定义多个容器,但一般只会定义一个容器
containers:
# 容器名1
- name: myapp
# 容器镜像地址1
image: ikubernetes/myapp:v1
# 容器名2
- name: busybox
# 容器镜像地址2
image: busybox:latest
# 启动命令
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 保存后使用kubectl命令提交创建即可。
kubectl create -f pod-demo.yml
# 配置清单多资源定义
多个资源也可以定义在一个配置清单中,我们一般会将多个相关联的资源定义在一起。
定义方法:配置清单中使用 "---" 将各资源隔开即可。
例如:
appVersion: v1
kind: Service
pass
---
appVersion: v1
kind: Pod
pass
1
2
3
4
5
6
7
2
3
4
5
6
7
# 资源标签
# 资源标签介绍
标签就是附加在对象之上的键值对,标签可以方便我们进行资源的管理,如增删改查等操作。
同时在集群中,也被用于各资源之间关联关系的建立,比如:Service和Pod等。
资源的标签即可在资源创建时定义,也可以在资源创建之后,对资源进行标签的增删改等管理。
标签和资源对象之间是多对多的关系,一个资源对象之上可存在多个标签,一个标签也可以被多个资源对象所使用。
# 打标方式
- 我们可以分不同维度对资源进行打标,例如:
- app应用维度标签,比如redis、mysql等
- tier架构层级维度标签,比如前端、后端、数据层等
- release版本维度标签,稳定版、开发版等
# 标签定义规范
- 标签名称、标签值都必须小于63个字符。
- 标签名称不能为空,只能使用 [a-Z0-9_.-] 来进行定义,且必须以字母或数字开头。
- 标签值可以为空,只能使用 [a-Z0-9_.-] 来进行定义,且必须以字母和数字开头及结尾。
# 标签选择器
标签选择器是提供给我们根据标签筛选或匹配资源用的。
- 基于等值关系进行选择:使用 =, ==, != 的就是等值关系标签选择器。
- 如:
kubectl get pod -l app!=myapp-deploy
- 如:
- 基于集合关系进行选择:使用 in, not in 的就是集合关系标签选择器,会通过指定标签的值来进行集合判断。
- 如:
KEYNAME in (VALUE1, VALUE2...)
、KEYNAME not in (VALUE1, VALUE2...)
- 如:
# 资源内嵌字段定义标签选择器
许多资源支持通过内嵌字段来定义该资源使用的标签选择器,比如定义Pod控制器要管理的Pod资源,就需要用到标签选择器来进行匹配。
# matchLabels
直接给定键值来定义使用的标签选择器,如:
nodeSelector: 标签名称: 标签值 ... ...
1
2
3
# matchExpressions
- 基于给定的表达式来定义使用的标签选择器。
- 会用指定的标签的值,基于operator指定的表达式运算符,来和values指定的值进行比较。
- 格式:
{key: "KEY", operator: "OPERATOR", values: [VAL1,VAL2...]}
- OPERATOR
- In(属于)、NotIn(不属于),使用这两种,values的值必须是一个非空列表。
- Exists(存在)、NotExists(不存在),使用这两种,values的值必须是一个空列表。
# 资源注解
# 资源注解介绍
- annotations - 资源注解,与label相似也是键值对,但不能用于挑选资源对象,仅用于为对象提供"元数据",它没有键/值长度的限制。
- 它可以使用kubectl describe命令来进行查看、kubectl edit命令来进行编辑。
# 定义方式
metadata:
... ...
annotations:
注解名: 注解值
zhuzhi/created-by: sekaiova
1
2
3
4
5
2
3
4
5
?