Docker集群管理与编排的方法
docker_compose
(单机编排)+docker_swarm
(整合资源池)+docker_machine
(快速安装docker)mesos
(AS旗下,IDC级别的硬件编排,但接口不是容器接口)+marathon
(容器接口)kubernetes
- 孕育而生的概念:
DevOps、MicroServices、Blockchain
devops概念
CI/CD
持续集成、持续交付、持续部署- 持续集成:用户提交代码后,自动构建、自动构建测试环境并测试
- 持续交付:自动打包到共享的文件服务或仓库中
- 持续部署:自动触发发布到线上
- 整个环境持续自动进行即
devops
,其中自动部署是极其困难的,但pod
技术极好的解决了这个问题 - 大部分复杂的
devops
构建在pod
编排工具之上 devops
是文化、是自动化的精神,是打破dev
和ops
墙壁的方式
kubernetes架构
Go
语言重铸的Borg
系统- 大部分云厂商已经原生支持
kubernetes
,甚至有些厂商提供pod
即服务 - 自动装箱(基于某些约束完成
pod
部署,且不影响使用),自动修复,自动水平拓展、自动服务发现和负载均衡、自动发布与回滚 - 密钥和模拟配置中心、存储编排(存储卷动态供给)、任务的批量处理运行
master/nodes
模型的集群,整合资源池,master
组件负责接收用户请求,由调度器通过算法调度到符合条件的node
,再由node
上的容器引擎创建出pod
master核心组件
APIServer
:负责接收、解析和处理请求schedule
: 调度器,负责观测每个node
上计算和存储资源,并根据用户申请的pod
所需的最低资源做调度分配最终生成pod
的node
,schedule
分配资源有两级调度:预选、筛选那些节点符合标准,再根据优选算法从预选的节点中选择出最终落盘controllermanager
:确保node
上的controller
正常,而controllermanager
处于master
之上,master
冗余确保高可用etcd
:键值存储、类似zk
可以选举leader
等,为master
提供共享存储,因为存储集群内所有对象的动态信息所以需要高可用,数量通常与master
数量一直,需要https
或http
协议通信,有两个端口一个给客户端提供服务,一个给内部通信服务- 关于证书:
etcd
内部通信需要一套点对点证书来配置https
、与自己的客户端(APIserver
)通信需要证书和CA
,APIserver
与客户端通信需要一套证书和CA
、和node
之上的两个组件通讯分别各需要一套独立的证书和CA
,一共需要5组CA
来进行互相认证
node核心组件
kubelet
:执行schedule
下发的任务,与APIserver
交互Docker
:容器引擎,最终产生容器的服务keeplive
:确保pod处于健康controller
:控制器会在node
节点上一直looppod
,如果一旦出现pod
不符合客户预期,控制器会保证该pod
恢复正常或重建,控制pod
的controller
只是众多控制器中的一种kube-proxy
:负责与APIserver
交互,而APIserver
上会记录所有pod
变化的信息,当信息改变时会由APIserver
发出一个通知事件,会告知给所有相关的组件,这时kub-proxy
就可以动态管理service
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dLEAYan9-1624627825373)(https://i.loli.net/2020/02/27/JFHP7XWd95jYwxS.png)]
pod的核心概念
pod
是kubernetes
中最小的逻辑单位用来存放容器- 虽然
pod
中可以存放多个容器,但除非容器与容器存在紧密高耦合度,否则不会这么做 - 如果一个
pod
中存在多个容器,这些容器共享一个网络名称空间(PIC、NET和UTS
)与存储卷,这些容器的关系应该是master
和sidecar
(主容器和边车容器) kubernetes
中调度器、控制器的操作对象都是pod
,多个容器的pod
被调度到node
后,pod
里所有的容器只能运行在这个node
上labselector
:通过标签选择器来筛选标签,标签不止有pod
可以用- 可以使用
labelselector
来过滤筛选条件,使得控制器或人用来识别和管理pod
等对象 - 自主式
pod
:自我管理的pod
,如果node
挂掉,pod
不会被自动重建不能全局调度 - 控制器管理的
pod
:调度器调度到集群的某个节点并启动和管理 - 常见的控制器分类
ReplicationController
:用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod
来替代,而如果异常多出来的容器也会自动回收,同时还支持滚动更新与回滚操作,早期时pod
控制器只有这一个ReplicaSet
:新版本后加入的新的pod
控制器,代用户创建指定数量的pod
副本数量,确保pod
副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能,但不直接使用而是使用Deployment
提供声明式更新Deployment
:工作在ReplicaSet
之上,用于管理无状态应用,支持滚动更新和回滚功能,还提供声明式配置:只需要在Deployment
中描述想要的目标状态是什么,Deployment
就会将Pod
和ReplicaSet
的实际状态改变到目标状态,也可以定义一个全新的Deployment
来创建ReplicaSet
或者删除已有的Deployment
并创建一个新的来替换,此外它还支持二级控制器,HPA
HPA
:实现POD
水平自动伸缩的功能,确保负载均衡StatefulSet
:管理有状态的应用DaemonSet
:用于确保集群中的每一个node
只运行一个特定的pod
副本,通常用于实现系统级后台任务。(比如ELK
服务)特性:服务是无状态的,服务必须是守护进程Job
:只要完成就立即退出,不需要重启或重建(如备份操作、临时操作)Cronjob
:周期性任务控制,不需要持续后台运行
service
kubernetes
中所有应用运行在pod
里,但由于pod
的特性问题使得客户端的访问变的十分困难,所以kubernetes
中提供了service
的中间层,service
是一个iptables
的Dnet
规则且不会改变IP
和host
当客户端需要访问服务时就可以经由service
代理到对应的pod
,iptables
规则已经更换为了ipvs(LVS)
以便提高负载效率service
通过探测pod
的标签选择器来关联pod
,同时service
还具有负载功能- 这个
service
的ip
由于没有协议栈所以不能ping
通,仅仅存在于规则中
AddOns
- 如
dns
、监控等,且都是可以运行为pod
之上的
名称空间
- 不同于
docker
的命名空间,kubernetes
的名称空间单纯的是一个管理逻辑概念,便于管理不同类型的pod
,但是不能限制pod
网络,所以需要网络策略的限制
kubernetes网络
- 集群中有三个网络
pod
网络:同一个pod
内多个容器间可以靠lo
接口实现互访,而各pod
间的通信使用overlay network
实现
overlay network
- 使用隧道网络实现,V1机器与不在同一台宿主机的V2预先设置在同一网段内,通信时由软交换机在数据包原本结构(源IP目标IP不变)的情况下,封装一个三层、四层的
IPdemo(TCP、UDP)
源地址为V1宿主机目标为V2宿主机 - 基于隧道实现的叠加网络,可以隧道二层和三层
pod
与service
的通信:service
的ip
只不过是iptables
规则或lvs
虚拟的ip
,所以通信方式实现起来只要pod
将报文发给网关(通常是docker0
桥)网关再根据本机规则找到service
,当规则改变时则需要kube-proxy
组件来更新各个node
上的规则- 最少的网络划分需要三种:节点网络、
service
网络(集群网络)、pod
网络 kubernetes
不负责提供实现网络的方案,需要第三方插件来实现,无论是哪种第三方方案,需要至少负责两种:service
和pod
网络,kubernetes
开放CNI
(容器网络接口),只要是基于CNI
开发的方案都可以被kubernetes
基于pod
托管在自身上,但这些pod
是特殊的,它们需要和node
共享网络名称空间,除此之外也可以在node
上以守护进程运行CNI
:需要两种维度,除了实现pod
和service
网络之外,他们还需要负责隔离和限制各个pod
之间的通信,flannel
是一个ovrtlay
网络可以实现网络配置,而calico
是一个三层隧道网络,可以支持网络配置和网络策略,甚至支持bgp
协议实现直接路由通信,flannel
方便配置简单,calico
困难但强大所以现在有把二者结合起来的项目:canel
,用flannel
配置网络calico
来做限制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjNP0hlf-1624627825375)(https://i.loli.net/2020/02/27/bDEumKTUW3Jwx6v.png)]