k8s是什么?
go语言开发的开源的跨主机的容器编排工具;全称是kubernetes;
k8s的组件:
master:
①kube-apiserver 所有服务统一的访问入口,无论对内还是对外;
②kube-controller-manager 资源控制中心,负责管理pod的资源对象和部署的控制器,确保资源在预期值;
③kube-scheduler 管理pod的资源调度,根据调度算法给pod放入合适的node中;
etcd:kubernetes的数据库,以键值对的形式将数据储存在分布式数据库中,只有apiserver有读写权限;
worker node:
④kubelet 管理和创建pod中的容器,和容器引擎交互,管理容器的生命周期。检测node的资源信息和pod的运行状态,发送给master的apiserver
⑤kube-proxy 是service的载体,是pod的网络代理,实现负载均衡和服务发现,同时监听service/endpoints的变化刷新负载均衡的策略
⑥容器引擎,运行容器的
控制器:
1、node controller 节点控制器,在节点发生故障时及时发现和响应;
2、replication controller 副本控制器,控制副本数达到客户的期望值;
3、endpoints controller 端点控制器,负载均衡和服务发现使用
4、service account & token controller 账户和令牌控制器,在创建命名空间时添加默认账户和api访问令牌
5、resourcequota controller 资源限制控制器
6、namespace controller 命名空间控制器,管理namespace的生命周期
K8S创建Pod的工作流程?
1、用户通过客户端发送创建pod的请求到master节点上的apiserver
2、apiserver会先把相关的请求信息写入到etcd中,再找controller-manager根据预设的资源模板创建pod清单
3、然后controller-manager会通过apiserver去找scheduler为新创建的pod选择最适合的Node节点
4、scheduler会通过调度算法的预选策略和优选策略筛选出最适合的Node节点
5、然后再通过apiserver找到对应的Node节点上的kubelet去创建和管理pod
6、kubelet会直接跟容器引擎交互来管理容器的生命周期
7、用户通过创建承载在kube-proxy上的service资源,写入相关的网络规则,实现对pod的服务发现和负载均衡
kubernetes的资源对象:
k8s可以进行增删改查的操作并持久化存储在etcd中,k8s可以根据etcd的预期值和现实中的资源情况进行自动控制和自动纠错;
①pod,是k8s最小/最简单的基本单位。
一个pod是一个集群中正在运行的进程。
pod中的容器(一个或多个)共享命名空间。
pod中的容器可以通过localhost互相访问,也可以进行挂载数据卷,不同的pod不可以。
②pod控制器,是pod启动的一种模板,保证pod按照客户的资源预期值启动。
③label标签 自带也可手动设置标签,便于分类管理资源。
键值对的方式,一个资源对象可以有多个label,一个label也可以给多个资源对象使用。可以被删除和添加
④label selector 标签选择器,根据标签筛选资源对象。
⑤service,每个pod会有一个单独的ip和端口,但是pod有生命周期,ip和端口会变化。
根据标签选择器去选择标签,就可以获取到变化的endpoints,刷新负载均衡了
⑥ingress,七层代理,service只可以四层,对外访问时使用,负责集群内外通讯。
控制器:
1、deployment 无状态应用部署,管理和控制pod和replicaset,管理他们的预期值不变。
相当于deployment是总包,replicaset是小包,干活的是pod,replicaset控制pod的数量,达到用户的预期值。
2、daemonset,保证每个节点都有一个pod运行,可以根据节点的状态添加或删除pod
3、statefulset ,部署有状态应用
4、job:部署一次性任务的pod,pod执行完任务就会自动退出,只部署一次
5、cronjob:周期性的部署一次性任务的pod
资源配置信息:
Apiversion 每种资源对象在K8S中所使用的 api 接口版本
Kind 资源对象的类型
Matedate 资源对象的元数据,比如 资源名称name 命名空间namespace 标签label
Spec 资源对象的资源配置清单,比如 副本数 镜像名 数据卷 资源限制 标签选择器label selector
Status 资源对象当前的运行状态信息