Kubernetes(简称K8s,用8代替8个字符“ubernete”)是Google开源的一个容器编排引擎。
目前最为广泛且流行的容器编排调度系统,也是现在用来构建云原生应用编排的最佳平台。
已成为在私有云,公共云以及混合云环境中大规模部署容器化应用程序的事实标准。
- 大规模可伸缩:随时扩展或收缩容器规模,模块化,插件化,可挂载,可组合
- 应用容器化管理:容器间的负载均衡、升级版本、弹性替换等等
- 支持自动化:自动化容器的部署,自动重启,自动复制,自动扩容和缩容
- 可移动:公有云,私有云,混合云等
简而言之,K8s是一套自动化容器运维的开源平台,用来管理容器集群,能在物理机或者虚拟机集群上调度和运行容器。
可以将Dokcer看作是K8s内部使用的低级别组件,而K8s是管理Docker容器的工具,也就是“飞机”与“飞机场”的关系。
K8s能够让用户有效搭建以容器为中心的架构与开发环境。
使用Kubernetes,只需一个yaml格式的部署文件,使用kubectl命令与就Kubernetes API交互,就可以部署多层容器的完整集群。
目前所有云原生应用基本上都会基于 Kubernetes API 去构建。
1.1 实用的特性
- 一致性:是指在 Kubernetes 上构建的应用可以无缝的迁移到任何环境里,不论公有云、私有云还是跨云。
- 可扩展性:是指把 Kubernetes 的插件机制运用到任何环境里,通过 Kubernetes 这些插件都可以实现自定义化。
- 自我修复功能:包括健康检查、故障的自动恢复、自动扩展等机制,这些对于系统运行至关重要。
1.2 官方信息
- kubernetes官网:https://kubernetes.io/
- kubernetes官网文档:https://kubernetes.io/docs/home/
- kubernetes官网中文文档: https://kubernetes.io/zh/docs/home/
- GitHub:https://github.com/kubernetes/kubernetes
2 - 基础概念
2.1 - Kubernetes组成
Pod
K8s 的最基本的构建模块和部署调度单元,用于处理 Volume、Secret 以及容器的相关配置,一个 Pod 表示某个应用的一个实例
Pod在Node节点上被创建/启动或者销毁,运行在 Worker Node 中,非持久的,会在宕掉时自动重启
- 每个 Pod 可以由一个或多个业务容器和一个根容器(Pause 容器)组成。,通常每个 Pod 只包含一个业务容器
- 同一个Pod里的业务容器共享Pause 容器的网络栈和Volume挂载卷,可以使用localhost互相通信
- 如果容器之间的联系非常紧密并且需要直接共享资源,可以考虑将一组容器放在同一个Pod
- 通过使用持久化的卷类型来持久化容器数据
- 同一个Pod里的容器共享存储, 当Kubernetes挂载volume到Pod, 本质上是将volume挂载到Pod中的每一个容器
- 每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失
特别说明:
- Kubernetes管理的对象是Pod,而不是直接管理容器,即便Pod中只有一个容器。
- 也就是说,Kubernetes只可以看到Pod,而Pod也只可以看到容器。
Service
一个服务可以看作是一组提供相同服务的Pod的对外访问接口,通过标签选择器来定义作用于哪些Pod
拥有一个指定的名字,一个虚拟IP地址和端口号(销毁之前不会改变,只能内网访问)
如果服务要提供外网服务,就需要指定公共IP和Node端口,或外部负载均衡器
- 定义了外界访问一组特定Pod的方式以及访问这些Pod的策略
- 为Pod提供负载均衡,在一定数量的Pod之间均衡流量
- 通过Label找到Pod组
Node(节点)
承担主要计算功能的工作节点,可以是单独物理机或虚拟机,用来承载Pod,作为Kubernetes worker,为容器提供一些必要的环境,比如存储、网络等。
每个节点都运行如下Kubernetes关键组件:
- Kubelet:处理Master节点下发的任务,管理Pod和其中的容器,是Node节点上的Pod管家
- Kube-proxy:监听每个节点上Kubernetes API中定义的服务变化情况,并创建路由规则来进行服务负载均衡,也就是说,Service使用Kube-proxy将链接路由到Pod
- Docker或Rocket:创建和管理容器
Master(主控)
主要负责集群的状态维护,也给集群提供一个资源配额控制和对外访问的入口。
作为集群的大脑,整个系统的数据总线和数据中心,几乎所有的集群控制命令都是在Master上执行。
Master会根据实际情况将负载分配给各个Node,使整个K8s集群中的Node节点协同工作。
每一个集群至少拥有一个Kubernetes Master,
- API server(即 kube-apiserver):K8s 控制的前端,提供可以用来和集群交互的REST端点,也就是暴露 K8s API
- Scheduler(即 kube-scheduler):根据特定的调度算法为新 Pod 选择 Node
- Replication Controller:使用Pod模板创建同一个容器的多份拷贝,确保任意时间都有指定数量的Pod“副本”在运行
ETCD
- 用于集群状态数据的分布式键值存储,保存集群所有的网络配置和对象的状态信息。
Cluster(集群)
在K8s中,Cluster(集群)是计算、存储和网络资源的集合,是整个K8s容器集群的基础环境。
volume(卷)
K8s的生命周期与Pod绑定。
重启容器,卷的数据依然还在,只有Pod被删除时,卷才会清理,数据是否丢失取决于具体的卷类型。
持久化存储卷是独立于计算资源的一种物理存储资源,不属于任何一个Node节点。
因此,在Pod被删除时,不会丢失数据,除非人工将其删除。
Namespace(命名空间)
Namespace(命名空间)通过将系统内部的对象分配到不同的命名空间中,形成逻辑上的不同项目、小组或用户组。
从而使得在共享使用整个集群资源的同时,还能分别管理它们。
在K8s中,Namespace可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster, 每个Cluster就是一个Namespace。
不同Namespace里的资源是完全隔离的。
如果有多个用户或项目组使用同一个Kubernetes Cluster, 通过指定Namespace就可以将他们创建的Controller、 Pod等资源分开。
K8s集群启动后,会创建一个名为default的默认命名空间,如果不特别指定命名空间,那么用户创建的Pod、RC、服务都会被系统创建到默认的命名空间中。
2.2 Kubernetes总体架构
3 - kubectl
kubectl是Kubernetes命令行工具,可以部署和管理应用, 查看各种资源, 创建、 删除和更新各种组件。
- Overview of kubectl:https://kubernetes.io/docs/reference/kubectl/overview/
- Install and Set Up kubectl:https://kubernetes.io/docs/tasks/tools/install-kubectl/
4 - Tutorials
Kubernetes.io交互式教程
- 通过Web浏览器就能使用预先部署好的一个Kubernetes集群, 快速体验Kubernetes的功能和应用场景。
- https://kubernetes.io/docs/tutorials/kubernetes-basics/
Katacoda
- 在网站上启动一个minikube的环境(学习)
- https://www.katacoda.com/courses/kubernetes
Kubernetes 指南
从Docker到Kubernetes进阶
5 - 参考信息
如何基于 Kubernetes 构建完整的 DevOps 流水线
6 - Q&A
- https://www.kubernetes.org.cn/5578.html
- http://weekly.dockone.io/article/8698
- http://weekly.dockone.io/article/8742