一, 什么是 kubernetes(K8s)?
Kubernetes 作为容器编排生态圈中重要一员, 是 Google 大规模容器管理系统 borg 的开源版本实现, 吸收借鉴了 google 过去十年间在生产环境上所学到的经验与教训. Kubernetes 提供应用部署, 维护, 扩展机制等功能, 利用 Kubernetes 能方便地管理跨机器运行容器化的应用. 当前 Kubernetes 支持 GCE,vShpere,CoreOS,OpenShift,Azure 等平台, 除此之外, 也可以直接运行在物理机上. kubernetes 是一个开放的容器调度管理平台, 不限定任何一种言语, 支持 java/C++/go/python 等各类应用程序 .
kubernetes 是一个完备的分布式系统支持平台, 支持多层安全防护, 准入机制, 多租户应用支撑, 透明的服务注册, 服务发现, 内建负载均衡, 强大的故障发现和自我修复机制, 服务滚动升级和在线扩容, 可扩展的资源自动调度机制, 多粒度的资源配额管理能力, 完善的管理工具, 包括开发, 测试, 部署, 运维监控, 一站式的完备的分布式系统开发和支撑平台.
使用 Kubernetes 可以:
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组, 并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性, 如果容器失效就替换它, 等等...
Kubernetes 解决的问题:
调度 - 容器应该在哪个机器上运行
生命周期和健康状况 - 容器在无错的条件下运行
服务发现 - 容器在哪, 怎样与它通信
监控 - 容器是否运行正常
认证 - 谁能访问容器
容器聚合 - 如何将多个容器合并成一个工程
实际上, 使用 Kubernetes 只需一个部署文件, 使用一条命令就可以部署多层容器 (前端, 后台等) 的完整集群
二, kubernetes 角色
(1)Pod
Pod 是 Kubernetes 中最小部署单元, 所有的容器均在 Pod 中运行, 一个 Pod 可以承载一个或者多个相关的容器. Pod 中容器共享存储和网络, 同一个 Pod 中的容器会部署在同一个 docker 宿主机上并且能够共享资源.
(2)Service
Service 是一个应用服务抽象, 定义了 Pod 逻辑集合和访问这个 pod 集合的策略(比如访问策略).Service 代理 Pod 集合对外表现为一个访问入口, 分配一个机器 IP 地址, 来自这个 IP 的请求将负载均衡转发到后端 Pod 中的容器. Service 通过 Lable Selector 选择一组 Pod 提供服务.
(3)Volume
数据卷
可以用来共享 Pod 容器中使用的数据
持久化数据
(4)Namespace
是 kubernetes 系统中的另一个重要的概念, 通过将系统内部的对象 "分配" 到不同的 Namespace 中, 形成逻辑上分组的不同项目, 小组或用户组, 便于不同的分组在共享使用整个集群的资源的同时还能被分别管理. Kubernetes 集群在启动后, 会创建一个名为 "default" 的 Namespace, 如果不特别指明 Namespace, 则用户创建的 Pod,RC,Service 都被系统创建到 "default" 的 Namespace 中.
(5)Label
Label 机制是 K8S 中一个重要设计, 通过 Label 进行对象弱关联, 灵活地分类和选择不同服务或业务, 让用户根据自己特定的组织结构以松耦合方式进行服务部署. Label 是一对 KV, 对用户而言非常有意义的, 但对 K8S 本身而言没有直接意义的. Label 可以在创建对象时指定, 也可以在后期修改, 每个对象可以拥有多个标签, 但 key 值必须是唯一的.
(6)RC(Replication Controller)
Replication Controller 确保任何时候 Kubernetes 集群中有指定数量的 pod 副本 (replicas) 在运行, 如果少于指定数量的 pod 副本(replicas),Replication Controller 会启动新的 Container, 反之会杀死多余的以保证数量不变. Replication Controller 使用预先定义的 pod 模板创建 pods, 一旦创建成功, pod 模板和创建的 pods 没有任何关联, 可以修改 pod 模板而不会对已创建 pods 有任何影响, 也可以直接更新通过 Replication Controller 创建的 pods. 对于利用 pod 模板创建的 pods,Replication Controller 根据 label selector 来关联, 通过修改 pods 的 label 可以删除对应的 pods.
(7)Deployment
Kubernetes Deployment 提供了官方的用于更新 Pod 和 Replica Set(下一代的 Replication Controller)的方法, 您可以在 Deployment 对象中只描述您所期望的理想状态(预期的运行状态),Deployment 控制器为您将现在的实际状态转换成您期望的状态, 例如, 您想将所有的 webapp:v1.0.9 升级成 webapp:v1.1.0, 您只需创建一个 Deployment,Kubernetes 会按照 Deployment 自动进行升级. 现在, 您可以通过 Deployment 来创建新的资源(pod,rs,rc), 替换已经存在的资源等.
Deployment 集成了上线部署, 滚动升级, 创建副本, 暂停上线任务, 恢复上线任务, 回滚到以前某一版本 (成功 / 稳定) 的 Deployment 等功能, 在某种程度上, Deployment 可以帮我们实现无人值守的上线, 大大降低我们的上线过程的复杂沟通, 操作风险.
(8)StatefulSet
使用 Deployment 创建的 Pod 是无状态的, 当挂在 Volume 之后, 如果该 Pod 挂了, Replication Controller 会再 run 一个来保证可用性, 但是由于是无状态的, Pod 挂了的时候与之前的 Volume 的关系就已经断开了, 新起来的 Pod 无法找到之前 volume.StatefulSet 的目的就是给为数众多的有状态负载提供正确的控制器支持.
当应用有以下任意要求时, StatefulSet 的价值就体现出来了.
● 稳定的, 唯一的网络标识.
● 稳定的, 持久化的存储.
● 有序的, 优雅的部署和扩展.
● 有序的, 优雅的删除和停止.
(9)DaemonSet
DaemonSet 能够让所有 (或者一些特定) 的 Node 节点运行同一个 pod. 当节点加入到 kubernetes 集群中, pod 会被 (DaemonSet) 调度到该节点上运行, 当节点从 kubernetes 集群中被移除, 被 (DaemonSet) 调度的 pod 会被移除, 如果删除 DaemonSet, 所有跟这个 DaemonSet 相关的 pods 都会被删除.
(10)Job
在有些场景下, 是想要运行一些容器执行某种特定的任务, 任务一旦执行完成, 容器也就没有存在的必要了. 在这种场景下, 创建 pod 就显得不那么合适. 于是就是了 Job,Job 指的就是那些一次性任务. 通过 Job 运行一个容器, 当其任务执行完以后, 就自动退出, 集群也不再重新将其唤醒. 还可以执行定时任务.
三, kubernetes 组件
1.kubectl
客户端命令行工具, 将接受的命令格式化后发送给 kube-apiserver, 作为整个系统的操作入口.
2.kube-apiserver
作为整个系统的控制入口, 以 REST API 服务提供接口.
3.kube-controller-manager
用来执行整个系统中的后台任务, 包括节点状态状况, Pod 个数, Pods 和 Service 的关联等.
4.kube-scheduler
负责节点资源管理, 接受来自 kube-apiserver 创建 Pods 任务, 并分配到某个节点.
5.etcd
负责节点间的服务发现和配置共享.
6.kube-proxy
运行在每个计算节点上, 负责 Pod 网络代理. 定时从 etcd 获取到 service 信息来做相应的策略.
7.kubelet
运行在每个计算节点上, 作为 agent, 接受分配该节点的 Pods 任务及管理容器, 周期性获取容器状态, 反馈给 kube-apiserver.
8.DNS
一个可选的 DNS 服务, 用于为每个 Service 对象创建 DNS 记录, 这样所有的 Pod 就可以通过 DNS 访问服务了.
四, 工作流程
1.Kubectl(user commands): k8s APIs 客户端工具, 通过用户输入命令操作 APIs 资源
2. 认证, 用户输入命令要通过 APIs 的认证
3. 认证通过之后, 交由 APIs 中 REST 中对象处理(Kubernetes 以 RESTFul 形式开放接口, 用户可操作的 REST 对象有三个 Pod,service,controller)
4.APIs 中的操作处理都会持久化存储到一个分布式存储 etcd
5.Scheduler 调度组件, 会检测 REST 对象中是否有新的动作产生, 并将具体操作, 根据算法下发到 node 节点中
6.Controller 通过 API Server 提供的接口实时监控整个集群的每个资源对象的当前状态, 当发生各种故障导致系统状态发生变化时, 会尝试将系统状态修复到 "期望状态"
7.kubeletl 类似于一个 agent, 处理 AIPs 下发的任务, 如创建 Pod, 容器, 获取节点信息等
8.proxy 负责网络代理, Service 具体实现就是有 proxy 处理, 维护网络规则和四层负载均衡工作
来源: http://www.bubuko.com/infodetail-2849136.html