Kubernetes(k8s)理论

222 阅读9分钟

Kubernetes(k8s)

什么是k8s

K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。

k8s全称kubernetes,这个名字大家应该都不陌生,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。

k8s的作用

用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。

可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。

为什么要用 K8S

如果你是前端工程师,错综复杂的JavaScript运行环境和框架版本让你大伤脑筋,发布上线前如临大敌,令你颤抖。

如果你是后端工程师,开发和生产环境的不一致,频频出现匪夷所思的bug。

如果你是运维工程师,频繁的上线与开发一起熬通宵解决bug令你闻风丧胆捶胸顿足。

根据目前互联网主流技术来看,对于上述问题,最好的解决方案便是容器化,比较流行的就是Docker。Docker 通过 Dockerfile 来对运行环境进行描述,编译好的镜像可以发布到仓库,应用的发布安装可以统一通过镜像运行容器,这样就保证了开发和生产环境的统一。

现在面试的时候,你也会经常被问到有没有用过docker。甚至有些面试官还会更深入的去问些,容器大规模使用编排部署、扩缩容的相关问题,这很难避开谈及Kubernetes等主流容器编排技术。

另外无论你是一位开发、运维、DBA、大数据、甚至AI工程师,在当下的互联网时代,都会考虑快速试错、最小成本。能够大幅缩短研发上线周期,灵活控制运维成本是让公司利于不败之地的不二法宝。那么K8S主要解决的就是快速迭代和自动扩缩容。

目前市场主流的容器编排厂商比较著名的主要有三个:Kubernetes, Mesos, Swarm 。随着 Kubernetes 多年来得到大家的广泛实践,它的认可度已经超过 Mesos, Docker Swarm 等,无疑它是生产环境中容器应用管理的不二之选。

k8s提供的解决方案具体包括什么

- 服务发现与调度
- 负载均衡
- 服务自愈
- 服务弹性扩容
- 横向扩容
- 存储卷挂载

k8s的主要功能

- 使用 Docker 等容器技术对应用程序包装(package)、实例化(instantiate)、运行(run)。
- 以集群的方式运行、管理跨机器的容器。
- 解决 Docker 跨机器容器之间的通讯问题。
- K8S 的自我修复机制使得容器集群总是运行在用户期望的状态。

k8s的特征

弹性伸缩

-使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。

自我修复

-在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。

服务发现和负载均衡

-K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

自动发布(默认滚动发布模式)和回滚

-K8S采用滚动更新策略更新应用,一次更新一个或者部分Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。

集中化配置管理和密钥管理

-管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

存储编排,支持外挂存储并对外挂存储资源进行编排

-挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、Glusterfs、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。

任务批处理运行

-提供一次性任务,定时任务;满足批量数据处理和分析的场景。

k8s核心组件

  1. master组件
  2. node组件
  3. 配置存储中心etcd

master组件

Kube-apiserver

用于暴露 Kubernetes API,任何资源请求或调用操作都是通过 kube-apiserver 提供的接口进行。以 HTTP Restful API 提供接口服务,所有对象资源的增删改查和监听操作都交给 API Server 处理后再提交给 Etcd 存储。

可以理解成 API Server 是 K8S 的请求入口服务。API Server 负责接收 K8S 所有请求(来自 UI 界面或者 CLI 命令行工具), 然后根据用户的具体请求,去通知其他组件干活。可以说 API Server 是 K8S 集群架构的大脑。

Kube-controller-manager

运行管理控制器,是 K8S 集群中处理常规任务的后台线程,是 K8S 集群里所有资源对象的自动化控制中心。 在 K8S 集群中,一个资源对应一个控制器,而 Controller manager 就是负责管理这些控制器的。

由一系列控制器组成,通过 API Server 监控整个集群的状态,并确保集群处于预期的工作状态,比如当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。

控制器主要包括

控制器含义解释
Node Controller(节点控制器)负责在节点出现故障时发现和响应。
Replication Controller(副本控制器)负责保证集群中一个 RC(资源对象 Replication Controller)所关联的 Pod 副本数始终保持预设值。可以理解成确保集群中有且仅有 N 个 Pod 实例,N 是 RC 中定义的 Pod 副本数量。
Endpoints Controller(端点控制器)填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。 可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的 endpoint。
Service Account & Token Controllers(服务帐户和令牌控制器)为新的命名空间创建默认帐户和 API 访问令牌。
ResourceQuota Controller(资源配额控制器)确保指定的资源对象在任何时候都不会超量占用系统物理资源。
Namespace Controller(命名空间控制器)管理 namespace 的生命周期。
Service Controller(服务控制器)属于 K8S 集群与外部的云平台之间的一个接口控制器。

Kube-scheduler

是负责资源调度的进程,根据调度算法为新创建的 Pod 选择一个合适的 Node 节点。

可以理解成 K8S 所有 Node 节点的调度器。当用户要部署服务时,Scheduler 会根据调度算法选择最合适的 Node 节点来部署 Pod。

Kube-scheduler策略

- 预选策略(predicate)
- 优选策略(priorities)

配置存储中心etcd

K8S 的存储服务。etcd 是分布式键值存储系统,存储了 K8S 的关键配置和用户配置,K8S 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据。

Node组件

Kubelet

Node 节点的监视器,以及与 Master 节点的通讯器。Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,它会定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施。

从 Master 节点获取自己节点上 Pod 的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等), 直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上 Pod 的状态与期望状态不一致,则调用对应的容器平台接口(即 docker 的接口)达到这个状态。

管理镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源。

Kube-Proxy

在每个 Node 节点上实现 Pod 网络代理,是 Kubernetes Service 资源的载体,负责维护网络规则和四层负载均衡工作。 负责写入规则至iptables、ipvs实现服务映射访问的。

Kube-Proxy 本身不是直接给 Pod 提供网络,Pod 的网络是由 Kubelet 提供的,Kube-Proxy 实际上维护的是虚拟的 Pod 集群网络。 Kube-apiserver 通过监控 Kube-Proxy 进行对 Kubernetes Service 的更新和端点的维护。

在 K8S 集群中微服务的负载均衡是由 Kube-proxy 实现的。Kube-proxy 是 K8S 集群内部的负载均衡器。它是一个分布式代理服务器,在 K8S 的每个节点上都会运行一个 Kube-proxy 组件。

docker 或 rocket

容器引擎,运行容器,负责本机的容器创建和管理工作。

Kubernetes 核心概念

Kubernetes 包含多种类型的资源对象:Pod、Label、Service、Replication Controller 等。

所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具进行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。

Kubernets其实是一个高度自动化的资源控制系统,通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异,来实现自动控制和自动纠错等高级功能。