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. 部署命令

rolloutDeployment, 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内容器的日志
attachAttach到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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐