一:概念
1. 概述
1.1 kubernetes对象.
k8s对象包含俩个嵌套对象字段。
spec(规约):期望状态
status(状态):当前状态
当创建对象的时候,会按照spec的状态进行创建,如果这些实例中有些失败了。那么会重新启动一个新的来替换这个实例。
对象样例
按照规定,app要求主体是json格式。但是也可以使用YAML清单格式,后续通过http访问app的时候,会将信息转化位JSON格式或者其他受支持的序列化格式。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
-
apiVersion - 创建该对象所使用的 Kubernetes API 的版本
-
kind - 想要创建的对象的类别
-
metadata - 帮助唯一标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace
-
spec - 你所期望的该对象的状态
1.1.1 对象的管理(增删)
三种模式
- 指令式命令
案例:通过创建 Deployment 对象来运行 nginx 容器的实例。
kubectl create deployment nginx --image nginx
权衡
与对象配置相比的优点:
- 命令用单个动词表示。
- 命令仅需一步即可对集群进行更改。
与对象配置相比的缺点:
- 命令不与变更审查流程集成。
- 命令不提供与更改关联的审核跟踪。
- 除了实时内容外,命令不提供记录源。
- 命令不提供用于创建新对象的模板。
- 指令式对象配置
创建对象
kubectl create -f nginx.yaml
删除俩个对象
kubectl delete -f nginx.yaml -f redis.yaml
通过覆盖活动配置来更新配置文件中定义的对象
kubectl replace -f nginx.yaml
权衡
与指令式命令相比的优点:
对象配置可以存储在源控制系统中,比如 Git。
对象配置可以与流程集成,例如在推送和审计之前检查更新。
对象配置提供了用于创建新对象的模板。
与指令式命令相比的缺点:
对象配置需要对对象架构有基本的了解。
对象配置需要额外的步骤来编写 YAML 文件。
与声明式对象配置相比的优点:
指令式对象配置行为更加简单易懂。
从 Kubernetes 1.5 版本开始,指令对象配置更加成熟。
与声明式对象配置相比的缺点:
指令式对象配置更适合文件,而非目录。
对活动对象的更新必须反映在配置文件中,否则会在下一次替换时丢失。
- 声明式对象配置
案例
处理 configs 目录中的所有对象配置文件,创建并更新活跃对象。 可以首先使用 diff 子命令查看将要进行的更改,然后在进行应用:
kubectl diff -f configs/
kubectl apply -f configs/
递归处理目录:
kubectl diff -R -f configs/
kubectl apply -R -f configs/
权衡
与指令式对象配置相比的优点:
对活动对象所做的更改即使未合并到配置文件中,也会被保留下来。
声明性对象配置更好地支持对目录进行操作并自动检测每个文件的操作类型(创建,修补,删除)。
与指令式对象配置相比的缺点:
声明式对象配置难于调试并且出现异常时结果难以理解。
使用 diff 产生的部分更新会创建复杂的合并和补丁操作。
1.1.2 对象名称和ID。
对象名称
三种命名规则
DNS 子域名
很多资源类型需要可以用作 DNS 子域名的名称。 DNS 子域名的定义可参见 RFC 1123。 这一要求意味着名称必须满足如下规则:
不能超过 253 个字符
只能包含小写字母、数字,以及 ‘-’ 和 ‘.’
必须以字母数字开头
必须以字母数字结尾
RFC 1123 标签名
某些资源类型需要其名称遵循 RFC 1123 所定义的 DNS 标签标准。也就是命名必须满足如下规则:
最多 63 个字符
只能包含小写字母、数字,以及 ‘-’
必须以字母数字开头
必须以字母数字结尾
RFC 1035 标签名
某些资源类型需要其名称遵循 RFC 1035 所定义的 DNS 标签标准。也就是命名必须满足如下规则:
最多 63 个字符
只能包含小写字母、数字,以及 ‘-’
必须以字母开头
必须以字母数字结尾
ID
k8s会对整个生命周期中创建的每一个对象都有不同的UID。
1.1.3 标签和选择算符。
标签
定义
标签是附加到kubenetes对象上的键值对。标签在用于指定的用户有意义且相关的对象的标识属性,但不对核心系统有语义含义。
标签使用户能够以松散耦合的方式将他们自己的组织结构映射到系统对象,而无需客户端存储这些映射。
标签能够支持高效的查询和监听操作,对于用户界面和命令行是很理想的
规则
必须为 63 个字符或更少(可以为空)
除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
包含破折号(-)、下划线(_)、点(.)和字母或数字
选择运算符
用户外面根据标签进行选择。
等值需求 =(等于)、==(等于) 和 !=(不等于)
基于集合 in、notin 和 exists
1.1.4 命名空间。
名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。
k8s在启动的时候会有四个初始化名字空间
default
Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。
kube-node-lease
该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。
kube-public
所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。 该名字空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。 该名字空间的公共属性只是一种约定而非要求。
kube-system
该名字空间用于 Kubernetes 系统创建的对象。
增加命名空间
要为当前请求设置名字空间,请使用 --namespace 参数。
kubectl run nginx --image=nginx --namespace=<名字空间名称>
kubectl get pods --namespace=<名字空间名称>
1.1.5 注释。
apiVersion: v1
kind: Pod
metadata:
name: annotations-demo
annotations:
imageregistry: "https://hub.docker.com/"
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
annotations:
imageregistry: “https://hub.docker.com/”
1.1.6 字段选择器。
允许你根据一个或多个资源字段的值筛选 Kubernetes 对象。
语法 一:=、== 和 != (= 和 == 的意义是相同的)操作符
kubectl get pods --field-selector status.phase=Running
语法二:链式选择器,使用’,‘隔开。
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
1.1.7 Finalizers。
Finalizer 是带有命名空间的键,告诉 Kubernetes 等到特定的条件被满足后, 再完全删除被标记为删除的资源。
当你使用清单文件创建资源时,你可以在 metadata.finalizers 字段指定 Finalizers。
1.1.8 属主合附属。
在 Kubernetes 中,一些对象是其他对象的“属主(Owner)。一个有效的属主引用, 包含与附属对象同在一个命名空间下的对象名称和一个 UID。 Kubernetes 自动为一些对象的附属资源设置属主引用的值。
metadata.ownerReferences
附属对象有一个 metadata.ownerReferences 字段,用于引用其属主对象。一个有效的属主引用。
ownerReferences.blockOwnerDeletion
附属对象还有一个 ownerReferences.blockOwnerDeletion 字段,该字段使用布尔值, 用于控制特定的附属对象是否可以阻止垃圾收集删除其属主对象
1.1.9 共享标签。
除了 kubectl 和 dashboard 之外,你还可以使用其他工具来可视化和管理 Kubernetes 对象。 一组通用的标签可以让多个工具之间相互操作,用所有工具都能理解的通用方式描述对象。
# 这是一段节选
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/name: mysql
app.kubernetes.io/instance: mysql-abcxzy
app.kubernetes.io/version: "5.7.21"
app.kubernetes.io/component: database
app.kubernetes.io/part-of: wordpress
app.kubernetes.io/managed-by: helm