k8s 说明
Kubernetes主要由以下几个核心组件组成: 一、etcd保存了整个集群的状态,兼具一致性和高可用性的键值数据库,可以作为保存Kubernetes所有集群数据的后台数据库,支持分布式集群功能,生产环境使用时需要为 etcd 数据提供定期备份机制。 二、apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制. Kubernetes API 服务器验证并配置 API 对象的数据, 这些对象包括 pods、services、replicationcontrollers 等。 API 服务器为 REST 操作提供服务,并为集群的共享状态提供前端, 所有其他组件都通过该前端进行交互。 三、controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等. controller-manager作为集群内部的管理控制中心,负责集群内的Node、Pod 副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。 四、scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上; scheduler是一个拥有丰富策略、能够感知拓扑变化、支持特定负载的功能组件,它对集群的可用性、性能表现以及容量都影响巨大。scheduler 需要考虑独立的和集体的资源需求、服务质量需求、硬件/软件/策略限制、亲和与反亲和规范、数据位置、内部负载接口、截止时间等等。如有必要,特定的负载需求可以通过 API 暴露出来。 五、kubelet是主要的节点代理(与master的apiserve交互),它会监视已分配给节点的 pod,kubelet负责维护容器的生命周期,管理pods和它们上面的容器,images镜像、volumes、etcd。同时也负责Volume(CVI)或Storage(CSI)和网络(CNI)的管理; 1.向 master 汇报 node 节点的状态信息 2.接受指令(Kubernetes API)并在 Pod 中创建 docker 容器 3.准备 Pod 所需的数据卷 4.返回 pod 的运行状态 5.在 node 节点执行容器健康检查 六、kube-proxy负责为Service提供cluster内部的服务发现和负载均衡,维护node节点上的网络规则(iptables/IPVS),实现用户访问请求的转发,其实就是转发给service,需要管理员指定service和nodeport对应关系。 Kubernetes 网络代理运行在 node 上,它反映了 node 上 Kubernetes API 中定义的服务,并可以通过一组后端进行简单的 TCP、UDP 流转发或循环模式(round robin)) 的 TCP、UDP 转发,用户必须使用 apiserver API 创建一个服务来配置代理,其实就是 kube-proxy 通过在主机上维护网络规则并执行连接转发来实现 Kubernetes 服务访问。 七、Container runtime负责镜像管理以及Pod和容器的真正运行(CRI); 八、Docker来负责所有具体的映像下载和容器运行,每个节点上都要运行Docker或rkt。 九、replicationcontrollers(RC):Pod控制器,保证pod的正常运行.(老版本) 十、deployment:Pod控制器,保证pod的正常运行.(新版本)定义Deployment来创建Pod和ReplicaSet、滚动升级和回滚应用、扩容和缩容、暂停和继续Deployment 十一、除了核心组件,还有一些推荐的插件: kube-dns负责为整个集群提供DNS服务 coreNDS负责为整个集群提供DNS服务 Ingress Controller为服务提供外网入口 Heapster提供资源监控 Dashboard提供GUI,即仪表盘 Federation提供跨可用区的集群 Fluentd-elasticsearch提供集群日志采集、存储与查询 flannel:Kubernetes设计的一个网络规划服务(CNI网络插件),简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。实现POD资源能够跨宿主机是进行能信. Kubernetes设计理念和功能其实就是一个类似Linux的分层架构 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等) 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等) 接口层:kubectl命令行工具、客户端SDK以及集群联邦 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴 Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等 Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等 Container Storage Interface (CSI)容器存储接口 Container Volume interface CVI容器卷接口 Container network interface CNI容器网络接口 Container Runtime interface CRI容器运行时接口 三种网络,不能同一个网段。 1.宿主机网络.即node的IP。(nodePort) 2.service 网络,k8s内部负载网络,处理nodeport,容器的 转发。 3.POD网络 ,容器的IP地址,建议范围设置较大,随时会变。 service的网络类型: ExternalName ClusterIP k8s内部访问,pod与pod是经过service访问,而不是IP。 NodePort: k8s内外部可以访问,外网通过nodePort到service到pod. LoadBalancer 名词解释: 1.nodeport: node宿主机监听的端口,转发到service。 2.service:k8s内部负载网络,基于label标签转发到容器上(pod)。标签也叫筛选器。services实现了从宿主机外层访问k8s内部不同宿主机上多个容器的访问方式,而且还实现了pod的动态发现,因此可以说service是k8s内部的负载均衡器,service的实现早期使用iptables,在k8s 1.11之后支持使用IPVS 3.pods:豌豆意思,pod是为容器,多个pod为pods,一个pod可以有多个容器。在k8s里面运行容器的最小单元,k8s如果想替换CRI的话,CVI,替换容器技术,只需要将pod使用相关的容器技术封装即可 4.亲和性/反亲和性:设置一些策略,让Pod运行在指定node 如:label标签节点上group=linux39 5.Namespace:隔离不同业务的Pod名称 如:根据不同部分在指定节点上创建容器。 6.ResourceQuota:限制硬件资源。 7.pause:pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名称空间,pause进程是pod中所有容器的父进程(即第一个进程) 8.service label:会用户HPA(动态扩容缩容),k8s动态实现pod扩容缩容 9.deployment label: service 对deployment的label进行删选和调用 10.nodeselector:叫节点筛选器,根据标签把pod布署在筛选器中的node节点。 11.serviceaccount:服务账号,支持多账号登录管理,类似阿里子账号。。 Service Controller:管理维护Service,提供负载以及服务代理。 Endpoints Controller:管理维护Endpoints,即维护关联service和pod的对应关系,其对应关系通过Label来进行关联的 Service Account Controller:管理维护Service Account,为每个Namespace创建默认的Service Account,同时为Service Account创建Service Account Secret。 Persistent Volume Controller:持久化数据控制器,用来部署有状态服务 Deamon Set Controller:让每一个Node节点都运行相同的服务 Deployment Controller:无状态服务部署控制器 StateFulSet Controller:有状态服务部署控制器 Job Controller:管理维护Job,为Job创建一次性任务Pod,保证完成Job指定完成的任务数目。 Pod Autoscaler Controller:实现pod的自动伸缩,定时获取监控数据,进行策略匹配,当满足条件时执行pod的伸缩动作。 kubernetes 创建Pod的工作流 1、首先,管理员访问HAproxy 向api-serve发送创建pod请求。 2、api-serve做出认证响应,然后检查信息并把数据存储到ETCD里,创建deploment资源初始化。 3、controller通过list-watch机制,检查发现新到deployment,将资源加入到内部工作队列,反省资源没有关联的pod和replicaset,启用depliyment controller创建replicaset资源,再启用replicaset controller创建pod。 4、所有controller被创建完成后.将deployment,replicaset,pod资源更新存储到etcd。 5、scheduler通过list-watch机制,监测发现新的pod,经过主机过滤、主机打分规则,将pod绑定(binding)到合适的主机。 6、将绑定结果存储到etcd。 7、kubelet每隔 20s(可以自定义)向apiserver通过NodeName 获取自身Node上所要运行的pod清单.通过与自己的内部缓存进行比较,新增加pod 8、kubelet创建pod。 9、kube-proxy为新创建的pod注册动态DNS到CoreOS。给pod的service添加iptables/ipvs规则,用于服务发现和负载均衡。 10、controller通过control loop(控制循环)将当前pod状态与用户所期望的状态做对比,如果当前状态与用户期望状态不同,则controller会将pod修改为用户期望状态,实在不行会将此pod删掉,然后重新创建pod。 node节点:客户端访问网站流程 1.客户端访问到公网IP到HAproxy 2.HAproxy到其中某一node宿主机上监听的端口(nodeport) 3.nodeport转发到service,service根据标签转发到nginx(service指的是网络,筛选器) 4.nginx如有后端,这里配置没有写IP,是标签名,根据kube-dns解析得到tomcat的label标签. 防火墙端口设置: Master节点 协议 方向 端口范围 目的 使用者 TCP协议 入站 64430-64439 Kubernetes APlserver 所有 TCP协议 入站 2379-2380 etcd server client API kube-apiserver,etcd TCP协议 入站 10250 Kubelet API SelfControl plane TCP协议 入站 10251 kube-scheduler Self TCP协议 入站 10252 kube-controller-manager Self Node节点 协议 方向 端口范围 目的 使用者 TCP协议 入站 10250 Kubelet API SelfControlplane TCP协议 入站 30000-32767 NodePort Servicest 所有
Dockerfile文件的制作镜像和K8s项目的分层结构
把服务分为运行在工作节点上的服务和组成集群级别控制面板的服务。 master:容器的编排和调度 kube-apiserver kube-controller-manager kube-scheduler pause etcd coredns Docker kubectl kubeadm 部署工具,加入 k8s 成为master node:存放容器 kube-proxy kubelet docker kubeadm 部署工具,加入 k8s master成为node kubectl (可选)客户端命令工具,集群管理及 pod 管理等操作(需要CA文件认证) 安装k8s方式: 1.手动二进制 2.apt-get/yum 等方式安装,以守护进程的方式启动在宿主机上,类似于是 Nginx 一样使用 service 脚本启动。 3.kubeadm:部署简单,官方出品,使用场景:开发环境、测试环境 4.ansible:使用批量部署工具如(ansible/saltstack)、生产环境,kubernetes后期维护,怎么样后期快速的简单的添加新的master和node节点到k8s