开发者学堂课程【Kubernetes 入门: 应用编排与管理:核心原理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/51/detail/1011
应用编排与管理:核心原理
内容介绍:
一、资源元信息
二、操作演示
三、控制器模式
四、控制器模式总结
一、资源元信息
1、Kubernetes 资源对象
l Spec:期望的状态
l Status:观测到的状态
l Metadata
l Labels
l Annotations
l OwnerReference
2、Labels
l 标识型的Key: Value 元数据
l 作用
用于筛选资源
唯一的组合资源的方法
可以使用 selector 来查询
类似于 SQL'select * where ...'
例子:
environment: production
release: stable
app.kubernetes.io/version: 5.7.21
failure-domain.beta.kubernetes.io/region:
cn-hangzhou
3、Selector
l 集合型 Selector:Env in (test,gray )
l 其他集合 Selector 例子:
tie notin (front, back)
release
!release
annotations
l Key: Value
l 作用:
存储资源的非标识性信息
扩展资源的 spec/status
l 特点:
一般比 label更大
可以包含特殊字符
可以结构化也可以非结构化
4、Ownereference
l “所有者"即集合类资源
Pod 的集合: replicaset, statefulset
l 集合类资源的控制器创建了归属资源
Replicaset 控制器创建 pod
双击可隐藏空白
l 作用
方便反向查找创建资源的对象
方便进行级联删除
二、操作演示
No resources fourd.
a kubectl apply -f pod
Pod1.yuml
pod2.yuml
a kubectl apply -f pod
Pod1.yuml
pod2.yuml
a kubectl apply -f pod1.yuml
bod/nginx1 created
a kubectl apply -f pod2.yuml
bod/nginx2 created
a kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABLES
Nginx1 1/1 Running 0 12s env=dev.tie=front
Nginx2 1/1 Running 0 8s env=dev.tie=front
a kubectl get pods nginx1 -o yuml 1 less
a kubectl lable pods nginx1 env=test
Error:”env” already has a value(dev).and overwrite is false
a kubectl lable pods nginx1 env=test overwrite
Pod\nginx1 labeled
a kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABLES
Nginx1 1/1 Running 0 91s env=test.tie=front
Nginx2 1/1 Running 0 87s env=dev.tie=front
a kubectl label pods nginx1 tie-
Pod\nginx1 labeled
a kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABLES
Nginx1 1/1 Running 0 2m11s env=test
Nginx2 1/1 Running 0 2m7s env=dev.tie=front
a kubectl get pods --show-labels
-1 env=test
NAME READY STATUS RESTARTS AGE LABLES
Nginx1 1/1 Running 0 2m41s env=test
a kubectl get pods --show-labels
-1 env=test.env=dev
No resources found.
a kubectl get pods --show-labels
-1 env=dev.tie=front
NAME READY STATUS RESTARTS AGE LABLES
Nginx2 1/1 Running 0 3m8s env=dev.tie=front
a kubectl get pods --show-labels
-1 env in (test.dev)
NAME READY STATUS RESTARTS AGE LABLES
Nginx1 1/1 Running 0 3m43s env=test
Nginx2 1/1 Running 0 3m39s env=dev.tie=front
三、控制器模式
1、控制循环
控制循环包括控制器、被控制的系统以及能够观测系统的控制器三个
控制操作会使得系统产生新的输出
2、逻辑组件
各组件独立自主地运行
不断使系统向终态趋近 status -> spec
3、sensor
List 进行系统资源的全量更新
Watch 只在多次 List 之中进行增量分析
事件处理函数会监听事件,控制循环中的控制器组件主要由事件处理函数以及 work 组成,事件处理函数会监听 informer 资源的新增,更新,删除的事件并根据控制器的逻辑决定是否需要处理,对需要处理的事件,会把事件关联资源命名空间以及名字塞入一个工作队列中并且由后续处理
4、控制循环例子-扩容
ReplicaSet 中通过 Selector 来匹配所有关联的 prod
5、两种 API 设计方法
(1)命令式(和孩子交流)
l 吃饭
l 刷牙
l 睡觉
l 唱一首歌
l 新扩一个 pod
l 删除一个 pod
(2)声明式(和员工交流)
l 市场占有率达到80%
l 稳定性达到99.99%
l 做一个身高体重正常的孩子
l 副本数保持在3个
6、命令式
l 如果命令没有响应怎么办?
反复重试
需要记录当前的操作-复杂
l 如果多重试了怎么办?
巡检做修正-额外工作、危险
l 如果多方并发访问怎么办?
需要加锁-复杂、低效
7、声明式
天然地记录了状态
幂等操作、可在任意时刻反复操做
正常操作即巡检
可合并多个变更
四、控制器模式总结
由声明式的 API 驱动-K8S 资源对象
由控制器异步地控制系统向终态驱近
使系统的自动化和无人值守化成为可能
便于扩展-自定义资源和控制器
(特别的,operator)



