k8s基础
简介
kubernetes(简称k8s)是google 2015年开源的一个容器编排方案,是google内部使用的大规模集群管理系统Borg的开源版本。Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时,Kubernetes提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。
特性
- 自动装箱
- 自我修复
- 水平扩展
- 服务发现和负载均衡
- 自动发布和回滚
- 密钥和配置管理
- 存储编排
- 批量处理运行
架构
k8s主要由:Master、Node、CLI
主要组件
Master
Master节点负责整个集群的控制和管理,所有的控制命令都是发给它,上面运行着一组关键进程:
ApiServer: 提供了HTTP REST接口,是k8s所有资源增删改查等操作的唯一入口,也是集群控制的入口。
Controller: kube-controller-manager所有资源的自动化控制中心。当集群状态与期望不同时,kcm会努力让集群恢复期望状态,比如:当一个pod死掉,kcm会努力新建一个pod来恢复对应replicas set期望的状态。
kube-scheduler: 负责Pod的调度。
etcd: 是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。
Node
Node是工作负载节点,运行着Master分配的负载(Pod),但一个Node宕机时,其上的负载会被自动转移到其他Node上。
kubelet: 负责Pod的生命周期管理,同时与Master密切协作,实现集群管理的基本功能。
kube-proxy: 实现Service的通信与负载均衡机制的重要组件,老版本主要通过设置iptables规则实现,新版1.9基于kube-proxy-lvs 实现。
Docker Engine: Docker引擎,负责Docker的生命周期管理。
Admin
- CLI:kubectl/kubeadmin, k8s 管理命令行工具。
- WEBUI:web管理页面。
基本概念
Pod: Pod是k8s进行资源调度的最小单位,每个Pod中运行着一个或多个密切相关的业务容器,这些业务容器共享这个Pause容器的IP和Volume,我们以这个不易死亡的Pause容器作为Pod的根容器,以它的状态表示整个容器组的状态。一个Pod一旦被创建就会放到Etcd中存储,然后由Master调度到一个Node绑定,由这个Node上的Kubelet进行实例化。
Volume: 用来管理 Kubernetes 存储的,是用来声明在 Pod 中的容器可以访问文件目录的,可以被挂载在 Pod 中一个或者多个容器的指定路径下面。
PV(Persistent Volume): 可以理解成 k8s 集群中的某个网络存储中对应的一块存储。它与 Volume 有以下区别:
PV 只能是网络存储,不属于任何 Node,但是可以在每个 Node 上访问
PV 是独立定义于 Pod 之外的
Deployment: Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。
Service: Service 提供了一个或者多个 Pod 实例的稳定访问地址。
Lable: Label 可以理解为给资源打的标签。 一个 Lable 是一个 Key=Value 的键值对。Label 可以附加到所有资源上面,一个资源可以定义任意数量的 Lable,同一个 Lable 也可以被添加到任意资源对象上。我们可以通过 Lable Selector(标签选择器)查询和筛选拥有某些 Label 的资源对象,k8s 通过这种方式实现了类似 SQL 的对象查询机制。
Namespace: Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。Kubernetes 的每个资源,比如刚才讲的 Pod、Deployment、Service 都属于一个 Namespace,同一个 Namespace 中的资源需要命名的唯一性,不同的 Namespace 中的资源可以重名>
DaemonSet: DaemonSet 可以保证集群中所有的或者部分的节点都能够运行同一份 Pod 副本,每当有新的节点被加入到集群时,Pod 就会在目标的节点上启动,如果节点被从集群中剔除,节点上的 Pod 也会被垃圾收集器清除;DaemonSet 的作用就像是计算机中的守护进程,它能够运行集群存储、日志收集和监控等『守护进程』,这些服务一般是集群中必备的基础服务。
StatefulSet: StatefulSet 是K8S中用于有状态的Deploy,其类似于
ReplicaSet
,但可以处理Pod
的启动顺序,为保留每个Pod
的状态设置唯一标识。
相关组件
Helm: Helm是Kubernetes的包管理器,
Operator: 由CoreOS创建,现在归属于红帽,Operator Framework在构建Kubernetes原生应用程序时提供抽象和简单性。operator是在Kubernetes上部署应用程序的方法。
gVisor: 处理容器隔离,这对安全性至关重要。gVisor可用于在沙盒gVisor容器中运行你不完全信任的应用程序。
Istio:Kubernetes容器网络工具。它基于“服务网格”模型。它使用Envoy边车代理——充当代理网格,并在微服务应用程序的各种服务之间实现更好的通信。Istio处理整个网络的负载均衡。它实施控制流量和网络请求加密的策略。
Prometheus:Kubernetes的监控工具。侧重于捕获和提供流式实时指标以供分析。
容器设计模式
Sidecar
在 Pod 里面,定义一些专门的容器,来执行主业务容器所需要的一些辅助工作。