Kubernetes是个啥

53 阅读11分钟

伸手摘星,即使一无所获,亦不致满手污泥

请关注公众号:星河之码

提到Kubernetes,第一个想到的就是容器编排,那么容器编排究竟是做什么的呢,它又是怎么做的呢,Kubernetes又是怎么做到容器编排呢?带着这些问题来认识一下Kubernetes

一、容器编排

容器技术的核心概念是容器、镜像、仓库,使用这三大基本要素就可以轻松地完成应用的打包、分发工作,实现【一次开发,到处运行】的作用

随着服务集群里规模越来越大的时候,服务发现、负载均衡、状态监控、健康检查、扩容缩容、应用迁移、高可用等不在是几个进程的管理,而是成百上千的进程之间互相通信、互相协作的问题。

这些容器的管理,调度也就是我们常说的容器编排:用于管理容器化的工作负载和服务,可促进声明式配置和自动化

能够定义容器组织和管理规范的工具,典型的是 Docker公司的 Compose+Swarm 组合,以及 Google 与 RedHat 公司共同主导的 Kubernetes 项目。

二、什么是 Kubernetes

Kubernetes简称 K8s,是Google开源的工业级的容器编排平台,也是目前主流的容器编排项目。

Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化

  • kubernetes官网地址

    #国外网站,访问速度较慢。
    https://kubernetes.io/
    
  • kubernets中文社区地址

    https://www.kubernetes.org.cn/
    

Kubernetes是一个用于在集群环境中管理容器化应用程序的开源系统。以正确的方式使用Kubernetes 可以帮助DevOps作为一个服务团队自动扩展应用程序,并在零停机的情况下进行更新

三 Kubernetes 的架构

在Docker中有一个用于集群管理的Docker-swarm,Docker-swarm中有两种节点,管理节点(manager)和工作节点(worker),Kubernetes 与Docker-swarm类似,同样也有两种节点:管理节点(master)和工作节点(worker)。

一个 Kubernetes 集群包含 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的 容器化应用。集群具有至少一个工作节点和至少一个主节点

  • 主节点管理集群中的工作节点和 Pod ,多个主节点用于为集 群提供故障转移和高可用性

  • 工作节点托管作为应用程序组件的 Pod

通过上图,可以看出在k8s种的master节点主要有四个组件:

  • Controller Manager: 负责容器编排
  • API Server: 负责 API 服 务
  • Scheduler: 负责调度
  • Etcd: 整个集群的持久化数据

用户通过kubectl调用API Server,从而调用worker中的容器执行任务,下面通过一张图来看看这些组件

通过上述这张图可以看到,Kubernetes 分为两个部分:Control Plane Components,Kubernetes Nodes

3.1 控制平面组件(Control Plane Components)

控制平面组件也就是我们说的master节点,它由四部分组成,负责集群的全局决策(调度、编排)工作,以及检测和响应集群事件

  • 全局决策:集群的调度、编排等工作

  • 检测和响应集群事件:当不满足部署的 replicas 字段时,启动新的 pod等工作

控制平面组件可以在集群中的任何节点上运行

通常会在同一个计算机 上启动所有控制平面组件,并且不会在此计算机上运行用户容器。 这个跟docker-Swarm的manager节点一样

3.1.1 kube-Controller-Manager

kube-Controller-Manager其实是 Controller Manager的组成之一

  • Controller Manager

    Controller Manager由kube-controller-manager和cloud-controller-manager组成,是 Kubernetes的大脑,它通过api-server监控整个集群的状态,并确保集群处于预期的工作状态

  • kube-controller-manager

由一系列的控制器组成,像Replication Controller控制副 本,Node Controller节点控制,Deployment Controller管理deployment等等

  • cloud-controller-manager

    运行与基础云提供商交互的控制器,在 Kubernetes 1.6 版本中引入的 alpha 功能

    cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展

    在Kubernetes启用Cloud Provider的时候才需要,用来配合云服务提供 商的控制,现在用的很少

    一般在 kube-controller-manager 中会禁用,在启动 kube-controller-manager 时将 --cloud-provider 参数设置为 external 来禁用此控制器

3.1.2 kube-API-Server

Kubernetes最重要的核心组件之一,在主节点上负责提供 Kubernetes API 服务的组件,它是 Kubernetes 控制面的前端,通过它主节点可以调度工作节点

  • 提供集群管理的REST API接口,包括认证授权,数据校验以及集群状态变更等

  • 提供其他模块之间的数据交互和通信的枢纽

    其他模块通过API Server查询或修改数据,只 有API Server才直接操作etcd

  • 生产环境可以为apiserver做负责均衡,通过部署多个实例可以实现扩缩。

3.1.3 kube-scheduler

kube-scheduler负责分配调度Pod到集群内的节点上,监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点

3.1.4 Etcd

Etcd是兼具一致性和高可用性的键值数据库,用来保存 Kubernetes 所有集群数据的后台数据库

  • kubernetes的节点信息,组件信息,通过kubernetes运行 的pod,deployment,service等都需要持久化,etcd就是存储这些数据的数据中心

  • etcd可以部署在kubernetes每一个节点。组成etcd集群。

    生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点,开发环境可以指部署master节点

  • kubernetes也可以直接使用外部etcd服务

3.1.5 kubectl

kubectl是Kubernetes的命令行工具,是Kubernetes用户和管理员必备的管理工具。 kubectl提供了大量的子命令,方便管理Kubernetes集群中的各种功能

部署在master节点上的,是主节点上的组件。

3.2 Node 组件(Kubernetes Nodes)

3.2.1 kubelet

一个在集群中每个节点上运行的代理。一个在集群中每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源

3.2.2 kube-proxy

一个在集群中每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service 和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,它保证服务在集群外可以被访问到

四、Kubernetes能做什么

我们通过容器可以实现程序的打包和运行,但是当一个容器故障之后,如何快速启动另一个容器,当流量增大或者减小时,如何快速的实现容器的扩容与缩容等等问题都是Kubernetes为我们做的事情。

Kubernetes 提供了一个可弹性运行分布式系统的框架。 能够满足应用的扩展、故障转移、部署模式(Canary 部署)等。k8s提供了以下多种功能

以下参考至官方社区文档:www.kubernetes.org.cn/

  • 服务发现和负载均衡

    Kubernetes 可以使用 DNS 名称或自己的 IP 地址来曝露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚

    可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。

    例如:可以自动化 Kubernetes 来创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算

    Kubernetes 允许指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来为容器分配资源。

  • 自我修复

    Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

    Kubernetes 允许存储和管理敏感信息,

    例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

    Kubernetes不是我们理解的云原生的 PaaS(平台即服务)系统,Kubernetes 是在容器级别运行,而非在硬件级别。

    它只是提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡、日志记录和监视。

五、kubernetes与docker-swarm对比

5.1 Docker Swarm的优点

  • 以更快的速度运行

    Docker Swarm 通过管理节点,可以让应用程序在虚拟和软件定义的环境中快速运行

  • 文档全面

    Docker正在快速发展,Docker团队在文档方面非常突出,只要Docker Swarm有了更新,相应文档将确保更新了所有信息。

    某些项目如果平台的一个版本在短时间间隔内发布,有些平台可能不维护文档。

  • 提供简单快速的配置

    Docker Swarm可以让用户自己配置,将其放入代码中并轻松部署,由于Docker Swarm可以在各种环境中使用,因此不受应用程序环境的约束。

  • 确保应用程序隔离

    Docker Swarm将每个容器与其他容器隔离,并拥有自己的资源,可以在不同的堆栈中运行单独的应用程序。

  • 版本控制和组件重用

    Docker Swarm可以跟踪容器的连续版本、检查差异或回滚到前面 的版本。容器重用来自前一层的组件,这使得它们非常轻量级。

5.2 Docker Swarm的缺点

  • Docker依赖于平台,跨平台支持效果差

    Docker Swarm是一个为Linux设计的平台

    虽然Docker支持Windows和Mac OS X,但它要使用虚拟机在非linux平台上运行。设计为在Windows上的Docker容器中运行的应用程序不能在Linux上运行,反之亦然。

  • 没有提供存储选项

    Docker Swarm不提供将容器连接到存储的简便方法,它的数据存储需要对主机进行大量的改进和手动配置。

  • 监控信息不足

    Docker Swarm用Stats命令提供关于容器的基本信息,除此之外Docker Swarm无法对Docker集群提供更加全面的监控

5.3 kubernetes的优点

基于以上Docker Swarm的缺点,kubernetes弥补了她的不足,kubernetes是一个自动化容器部署、扩展和管理平台,其优点如下

  • 速度快

    Kubernetes能够完美的在不停机的情况下持续部署新功能,K8S的目标是以【恒定的正常运行时间】更新应用程序。

  • 遵循不可变基础架构的原则

    在不可变的基础架构中,如果想要更新任何应用程序,需要使用新标记构建容器映像并部署它

    简单点说就是打一个tag,然后部署,这样万一出问题,可以及时回滚。

  • 提供声明式配置

    用户可以通过声明式配置知道系统应该处于什么状态以避免错误。

    源代码控制、单元测试等传统 工具不能与命令式配置一起使用,但可以与声明式配置一起使用。

  • 大规模部署和更新软件

    Kubernetes具有不可变的声明性,扩展很容易,提供了一些用于扩展目的的功能

    • 水平基础架构扩展

      在单个服务器级别执行操作以应用水平扩展。可以很轻松的添加或分离服务器。

    • 自动扩展

      根据CPU资源或其他应用程序指标的使用情况,可以更改正在运行的容器数。

    • 手动扩展

      可以通过命令或界面手动扩展正在运行的容器的数量

    • 复制控制器

      复制控制器确保集群在运行状态下具有指定数量的等效pod。

      如果存在太多pod,则复制控制器可以删除额外的pod,反之亦然。

  • 处理应用程序的可用性

    Kubernetes会自动检查节点和容器的运行状况,当发生错误导致的容器崩溃时提供自我修复和自动替换。并且K8S可以在多个pod之间分配负载,平衡资源。

  • 存储卷

    在K8S中,数据是在容器之间共享的,但是如果pod被杀死,则自动删除卷。

    K8S数据是远程存储的,因此如果将pod移动到另一个节点,数据将一直保留,直到用户删除它