Docker提供了一种将应用程序安全,隔离运行的一种方式,能够将应用程序依赖和库文件打包在一个容器中,后续再任何地方运行起来即可,其包含了应用程序所依赖相关环境,一次构建,任意运行(build once,run anywhere)
Docker组成:
Docker Daemon 容器管理组件,守护进程,负载容器,镜像,存储,网络等管理
Docker Client 容器客户端,负责和Docker Daemon交互,完成容器生命周期管理
Docker Registry 容器镜像仓库,负责存储,分发,打包
Docker Object 容器对象,主要包含container和images
容器给应用程序开发环境带来很大的便利,从根本上解决了容器的环境依赖,打包等问题,然而,
Docker带来的容器打包的便利,同时也带来了以下的挑战:
容器如何调度,分发
多台机器如何协同工作
Docker主机故障时应用如何恢复
如何保障应用高可用,横向扩展,动态伸缩
Kubernetes是google开源的一套微服务,容器化的编排引擎,提供容器话应用的自动化部署,横向扩展和管理,是google内部容器十多年实战沉淀的结晶,已战胜Swarm,Mesos成为容器编排的行业标准。
kuberntes内置有很多非常优秀的特性使开发者专注于业务本身,其包含的功能如下:
Service discovery and load balancing,服务发现和负载均衡,通过DNS实现内部解析,service实现负载均衡
Storage orchestration,存储编排,通过plungin的形式支持多种存储,如本地,nfs,ceph,公有云快存储等
Automated rollouts and rollbacks,自动发布与回滚,通过匹配当前状态与目标状态一致,更新失败时可回滚
Automatic bin packing,自动资源调度,可以设置pod调度的所需(requests)资源和限制资源(limits)
Self-healing,内置的健康检查策略,自动发现和处理集群内的异常,更换,需重启的pod节点
Secret and configuration management,密钥和配置管理,对于敏感信息如密码,账号的那个通过secret存储,应用的配置文件- 通过configmap存储,避免将配置文件固定在镜像中,增加容器编排的灵活性
Batch execution,批处理执行,通过job和cronjob提供单次批处理任务和循环计划任务功能的实现
Horizontal scaling,横向扩展功能,包含有HPA和AS,即应用的基于CPU利用率的弹性伸缩和基于平台级的弹性伸缩,如自动增加node和删除nodes节点。
参考:生产级别的容器编排系统,kubernetes入门到实战(一)初窥kubernetes全貌
kube-apiserver 功能
(1)k8s nodes上的所有请求都要经过apiserver
(2)认证和授权
(3)将数据写入etcd数据库
etcd
(1)etcd 是兼具一致性和高可用性的键值数据库
(2)保存和持久化集群状态信息
kube-scheduler
(1)过滤:将满足条件的node筛选出来进行排序,最优的节点运行重启
(2)调度策略:硬件/软件/策略约束、亲和性和反亲和性规范等
kube-controller-manager
这些控制器包括:
节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
cloud-controller-manager
(1)与公有云进行集成
(2)下面的控制器都包含对云平台驱动的依赖:
节点控制器(Node Controller): 用于在节点终止响应后检查云提供商以确定节点是否已被删除
路由控制器(Route Controller): 用于在底层云基础架构中设置路由
服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器
Node 组件
(1)容器运行时(Container Runtime)
容器运行环境是负责运行容器的软件。
Kubernetes 支持多个容器运行环境: Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
(2)kubelet
kubelet创建和管理Container Runtime资源,k8s通过kubelet来判断node的健康状态,容器不健康会迁移;
(3)kube-proxy
实现 Kubernetes 服务(Service) 概念的一部分;
通过iptables或lvs定义负载均衡的策略;
暴露容器对外服务的实现;
附加插件(Addons)
(1)DNS
(2)Web 界面(Dashboard )
(3)容器资源监控
监控系统用于采集node和pod的监控数据
metric-server 核心指标监控
prometheus 自定义指标监控,提供丰富功能
heapster+influxdb+grafana 旧核心指标监控方案,现已废弃
(4)集群层面日志
日志采集系统,用于收集容器的业务数据,实现日志的采集,存储和展示,由EFK实现
Fluentd 日志采集
ElasticSearch 日志存储+检索
Kiabana 数据展示
参考:Kubernetes 组件,
云原生相关内容
CNCF