K8S进阶-01-架构及基础概念
K8S进阶-01-架构及基础概念
·
1. Kubernetes架构
1.1. 基础结构
- 是一个master-slave结构
- master和slave通过kubelet来通信
1.2. Master
1.2.1. API server
- 是集群访问的入口
- 用户可以通过kubectl、helm、http请求、自定义sdk等方式访问集群,本质都是调用api server
1.2.2. Controller manager
- controller控制组件或者workload的生命周期
- 有一组controller
1.2.3 ETCD
- 所有k8s对象对存储在ETCD里
1.3. Slave
1.3.1. Kubelet
- 是master和slave之间通信的组件
- pod被调度后,负责pod完整生命周期的管理
1.3.2. Kube-proxy
- 外部访问的入口
- 负责管理service和pod之间关系的生命周期
- 给pod配置loadbalance规则
2. 工作原理
2.1. 原理
2.1.1. list-watch机制
- 一种消息通信机制
- 是基于变化的,每次k8s对象变化后,组件都会收到event对象
- 组件收到event对象后,做数据差异的对比分析,决定后续动作
2.1.2. 生命周期管理
- 不同的组件管理的是不同api对象的生命周期,或者同一对象不同的生命周期
2.1.3. 解耦
- 不同组件并不是和ETCD直接交互,而是通过api-server
2.1.4. ETCD
- api-server每次收到组件的api之后,都是把变化(创建或更新)存储到ETCD里
2.2. 流程
- 这是一个ReplicaSet(多副本应用),从创建到pod被拉起的生命周期流程。
2.2.0. 第0步
- 集群启动后,不同组件和api-server建立list-watch的请求连接
2.2.1. 第1步
- 用户通过kubectl调用一个创建ReplicaSet的api
2.2.2. 第2步
- api-server把创建ReplicaSet命令传递给etcd
2.2.3. 第3步
- etcd创建完ReplicaSet对象后,上报一个ReplicaSetCreated的event给api-server
2.2.4. 第4步
- api-server把ReplicaSetCreated event上报给contoller-manager
- contoller-manager里有一个ReplicaSetController,它会订阅这个event
- ReplicaSetController关注的是ReplicaSet创建生命周期
- ReplicaSetController收到event后,会处理和它相关的对象字段
- 比如需要多少个副本,就需要创建多少个pod
2.2.5. 第5步
- ReplicaSetController的输出:调用api创建pod对象
2.2.6. 第6步
- api-server把创建pod对象命令传递给etcd
2.2.7. 第7步
- etcd创建完pod对象后,上报一个PodCreated的event给api-server
2.2.8. 第8步
- api-server把PodCreated event上报给scheduler
- scheduler会订阅这个event
- scheduler关注的是event对象里面nodeName为空的pod,也就是没有被调度的pod
2.2.9. 第9步
- scheduler的输出:更新pod,并绑定一个node
2.2.10. 第10步
- api-server把绑定pod对象命令传递给etcd
2.2.11. 第11步
- etcd更新完pod对象后,上报一个PodBound的event给api-server
2.2.12. 第12步
-
api-server把绑定pod对象命令传递给kubelet
-
kubelet会订阅这个event
-
kubelet负责pod绑定node之后后续动作的执行
-
它watch的是pod.nodeName等于kubelet所在node的name的pod
-
处理pod被拉起的请求,包括创建容器、网络等
3. 基本概念
3.1. POD
- 一组功能相关的Container的封装
- 多个Container共享存储和Network Namespace
- K8S调度和作业运行的基本单位(Scheduler调度,Kubelet运行)
- 容易“走失”(很容易故障或失联),需要Workload和Service的“呵护”
3.2. Workload
- 一组功能相关的Pod的封装
- Deployment:多副本pod的封装,每个pod是一样的,有相同的template
- StatefulSet:每个pod有独立的编号,会按顺序逐个启动。某个pod故障,会创建相同编号的pod来替代。
- DaemonSet:集群中每个节点上都需要一个且仅一个pod,比如网络插件
- Job:一次性或者反复执行的任务
3.3. Service
- Pod“防失联”
- 给一组pod设置反向代理,pod的IP都不一样,service是统一入口
4. API对象的基本构成
- annotation:一般是给后台逻辑处理用的
- spec:声明式的,期望状态
- lable和selector机制,workload通过它来过滤pod
- template:一组pod的模板
5. 使用kubectl与集群交互
5.1. 基础命令
create | 从文件或stdin创建资源 |
expose | 为deployment,pod创建Service |
run | 在集群上运行特定映像 |
set | 在对象上设置特定功能 |
get | 查询 |
explain | 查看资源定义 |
edit | 使用系统编辑器编辑资源 |
delete | 删除指定资源,支持文件名、资源名、label selector |
5.2. 部署命令
rollout | Deployment, Daemonset的升级过程管理(查看状态、操作历史、暂停升级、恢复升级、回滚等) |
rolling-update | 客户端滚动升级,仅限ReplicationController |
scale | 修改Deployment, ReplicaSet, ReplicationController, Job的实例数 |
autoscale | 为Deploy, RS, RC配置自动伸缩规则(依赖heapster和hpa) |
5.3. 集群管理命令
certificate | 修改证书资源 |
cluster-info | 查看集群信息 |
top | 查看资源占用率(依赖heapster) |
cordon | 标记节点为unschedulable |
uncordon | 标记节点为schedulable |
drain | 驱逐节点上的应用,准备下线维护 |
taint | 修改节点taint标记 |
5.4. 故障排除和debug命令
describe | 查看资源详情 |
logs | 查看pod内容器的日志 |
attach | Attach到pod内的一个容器 |
exec | 在指定容器内执行命令 |
port-forward | 为pod创建本地端口映射 |
proxy | 为Kubernetes API server创建代理 |
cp | 容器内外/容器间文件拷贝 |
5.5. 高级命令
apply | 从文件或stdin创建/更新资源 |
patch | 使用strategic merge patch语法更新对象的某些字段 |
replace | 从文件或stdin更新资源 |
convert | 在不同API版本之间转换对象定义 |
5.6. 设置命令
label | 给资源设置label |
annotate | 给资源设置annotation |
completion | 获取shell自动补全脚本(支持bash和zsh) |
5.7. 其他命令
api-versions | 查看支持的API版本 |
config | 修改kubectl配置(kubeconfig文件),如context |
help | 查看命令帮助 |
version | 查看客户端和Server端K8S版本 |
5.8. 高级玩法
导出yaml文件
- 用run命令生成
kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml
- 用get命令导出
kubectl get statefulset/foo -o=yaml --export > new.yaml
更多推荐
已为社区贡献33条内容
所有评论(0)