pod启动流程:
- 管理员使用kubectl给apiserver发起请求,执行相关操作
- apiserver接受请求。将数据写到etcd数据库
- 通过watch机制apiserver通知控制器管理器创建相关副本控制器,副本控制器根据yaml文件创建副本pod,镜像等信息,然后返回给apiserver,再写到etcd数据库中
- 通过watch,通知scheduler调度器生成调度信息,选择哪个节点启动pod.再返回给apiserver ,api写到etcd
- 通过watch,api 会通知被选中执行启动pod节点服务器上的kubelet去启动pod,kubelet通知宿主机上的docker启动容器
- kube-proxy配置pod的网络信息(ip,连通网络)
- kubelet启动pod完成后,再返回api,etcd
- pod终止流程:
- pod生命周期:
- 容器类型:init 初始化(init)容器像常规应用容器一样,只有一点不同:初始化(init)容器必须在应用容器启动前运行完成。 Init 容器的运行顺序:一个初始化(init)容器必须在下一个初始化(init)容器开始前运行完成。必须在pod就绪之前完成
- pause :在创建一个pod的时候,最先创建的容器 Pod 的基础设施容器 infrastructure infra容器
- 把pod公用的命名空间创建好->init->app
sidecar 多个软件配合互相共享资源
app容器
静态pod和动态pod
1. 创建和管理方式 静态Pod: 由kubelet直接管理的,其配置文件存储在节点本地而非通过API Server创建。 创建:kubelet在启动时或运行时,会监视特定目录(如/etc/kubernetes/manifests)下的静态Pod配置文件,并根据这些配置文件创建和管理Pod。 管理:kubelet周期性地检查配置文件目录,根据文件内容更新或删除Pod。 特点:静态Pod的元数据不存储在etcd中,因此不能通过kubectl命令进行直接操作。动态Pod通常指的是由控制器(如Deployment、StatefulSet、DaemonSet等)管理的Pod。 创建:通过Kubernetes API创建,Pod的配置存储在etcd中。 管理:控制器负责监视集群状态,并根据需要创建、更新或删除Pod,以确保实际运行的Pod数量符合预期。 特点:动态Pod的生命周期受到控制器策略的严格管理和维护,包括健康检查、滚动更新、扩展缩容等功能。
2. 可见性和可控性 静态Pod:在API Server上不可见,无法通过kubectl等工具直接查看或操作。 可控性:完全由用户通过修改配置文件和重启kubelet来控制。 动态Pod:在API Server上可见,可以通过kubectl等工具进行查看、操作和管理。 可控性:由Kubernetes系统及其控制器自动管理,用户也可通过kubectl等工具进行干预。
3. 灵活性和动态性 静态Pod: 灵活性相对较低,配置文件一旦创建,就需要通过修改文件并重启kubelet来更新Pod配置。不支持动态扩缩容,数量和配置是静态定义的。 动态Pod: 灵活性较高,可以根据业务需求动态地创建、更新或删除Pod。 动态性:支持自动扩缩容,以满足不同的负载需求。
4. 适用场景 静态Pod: 适用于需要在特定节点上始终运行且无需集群级别管理的应用场景,如kubelet自身的配置、网络插件或其他系统级别的组件。 动态Pod: 是Kubernetes中常态化的应用部署方式,适用于需要根据业务需求动态创建或销毁的Pod。
deployment升级发生了什么:修改yaml文件 不会重新创建 只会新增或减少 会保留原来
rc 旧版副本控制器 rs 新版副本控制器
k8s里有哪些控制器?
deployment replicaSet scheduler
daemonSet会在每台node节点上启动一个pod
job 批量处理任务 cronjob 计划任务
重启策略:always(默认),onfailure,never