Kubernetes概述

目录

一 容器编排介绍

1.Docker-Swarm

二  K8S是什么?

1.概述

2.作用

3.功能

三 为什么要用K8S?

1.什么时候用到K8S

2.K8S的目标

四 K8S的功能和特性

1.K8S的功能

2.K8S的特性

五 K8S集群架构与组件

2.K8S核心组件

3.K8S工作流程

六 K8S核心概念

1.Pod

2.Pod控制器

3.Label

4.Label 选择器(Label selector)

5.Service

6.Ingress

7.Name

8.Namespace


一 容器编排介绍

容器编排是指管理和协调容器化应用程序的部署、扩展和运行的过程。在这里,我将讨论两种常见的容器编排方式:Docker Swarm 和 Kubernetes。

1.Docker-Swarm

Docker Swarm 是由 Docker 官方提供的容器编排工具,它允许在一个集群中管理多个 Docker 主机,并将它们作为一个单一的虚拟主机来管理。可以使用 Docker CLI 或 Docker Compose 来定义和管理 Swarm 服务。

以下是一些 Docker Swarm 的特点:

  • 简单易用:与 Docker 强大的生态系统紧密集成,使用 Docker CLI 进行操作。
  • 内置功能:自动负载均衡、服务发现和容错处理。
  • 扩展性:支持水平扩展,可以根据需要添加或移除节点。
  • 安全性:使用 TLS 加密通信,并通过令牌进行身份验证。

二  K8S是什么?

1.概述

Kubernetes(常简称为 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由 Google 设计,并捐赠给了 Cloud Native Computing Foundation 来维护。

2.作用

用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。
可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。

3.功能

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


三 为什么要用K8S?

1.什么时候用到K8S

传统的后端部署方法:把程序包(包括可执行二进制文件、配置文件等)放到服务器上,接着运行启动脚本把程序跑起来,同时启动守护脚本定期检查程序运行状态、必要的话重新拉起程序。

场景:服务的请求量增大,已部署的服务响应不过来。

传统做法:若请求量、内存、CPU超过阈值做了告警,运维人员马上再加几台服务器,部署好服务之后,接入负载均衡来分担已有服务的压力。

问题:从监控告警到部署服务,中间需要人力介入,成本高,效率低下!

而这个时候,K8S的出现就很合理——自动化运维管理容器化(Docker)程序。

2.K8S的目标

K8S 的目标是让部署容器化应用简单高效。
K8S 解决了裸跑Docker 的若干痛点:

●单机使用,无法有效集群
●随着容器数量的上升,管理成本攀升
●没有有效的容灾、自愈机制
●没有预设编排模板,无法实现快速、大规模容器调度
●没有统一的配置管理中心工具
●没有容器生命周期的管理工具
●没有图形化运维管理工具


四 K8S的功能和特性

1.K8S的功能

Kubernetes(简称K8S)是由Google开源的容器编排和管理平台。它建立在Docker等容器技术的基础上,提供了一系列完整的功能,使得部署、运行、扩展和管理容器化应用程序变得更加便捷。

  • 容器化应用程序管理:Kubernetes使用容器技术(如Docker)对应用程序进行包装、实例化和运行。这样可以将应用程序与其所需的环境隔离开来,并且能够在不同的环境中轻松部署和运行。

  • 跨机器容器集群管理:Kubernetes可以管理跨多台机器的容器集群。它能够自动在集群中的不同节点上调度和分配容器,以实现负载均衡和高可用性。

  • 解决容器间通信问题:Kubernetes提供了服务发现和负载均衡的功能,使容器之间的通信变得简单和可靠。它为每个容器分配唯一的网络地址,并通过DNS服务进行命名解析,使容器能够相互访问。

  • 自我修复机制:Kubernetes具有自我修复的特性,即使在节点故障或容器崩溃的情况下,它也能保证容器集群一直处于用户期望的状态。它可以自动重新启动失败的容器,并根据用户定义的策略进行水平扩展或收缩。

2.K8S的特性

  • 弹性伸缩:通过命令、UI或基于CPU使用情况的自动扩容和缩容,保证应用程序在高峰并发时的高可用性,同时在业务低峰时回收资源以最小化成本。

  • 自我修复:在节点故障时重新启动失败的容器,替换和重新部署,以确保预期的副本数量;终止健康检查失败的容器,并在准备就绪之前不处理客户端请求,确保线上服务不中断。

  • 服务发现和负载均衡:为多个容器提供统一访问入口(内部IP地址和DNS名称),并负载均衡关联的所有容器,使用户无需担心容器IP问题。

  • 自动发布和回滚:采用滚动更新策略更新应用程序,逐个或部分Pod进行更新而不是同时删除全部Pod;在更新过程中出现问题时,回滚更改以确保升级不影响业务。

  • 集中化配置管理和密钥管理:管理敏感数据和应用程序配置,提高敏感数据安全性,将常用配置存储在Kubernetes中以方便应用程序使用。

  • 存储编排:支持外挂存储并对外挂存储资源进行编排,能够挂载外部存储系统作为集群资源的一部分,提高存储使用灵活性,支持本地存储、公有云和网络存储等。

  • 任务批处理运行:提供一次性任务和定时任务,满足批量数据处理和分析的需求。

Kubernetes通过这些特性提供了强大的容器编排和管理功能,使得容器化应用程序的部署、运行和管理更加高效和可靠。


五 K8S集群架构与组件

1.K8S集群架构

K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。
在 K8S 中,主节点一般被称为 Master 节点,而从节点则被称为 Worker Node 节点,每个 Node 都会被 Master 分配一些工作负载。

  • Master节点:Master节点负责集群的调度、管理和运维工作。通常,Master节点被称为Master节点,它包含了多个关键组件,如API Server、Scheduler、Controller Manager和etcd等。Master节点是集群的控制中心,负责协调集群中的各项操作,并保证集群的正常运行。

  • Worker Node节点:Worker Node节点也被称为Node节点,是集群中的计算节点,负责运行应用程序和处理工作负载。每个Worker Node节点都会被Master节点分配一些工作负载,以便在集群中进行分布式计算和资源利用。

注意:建议将Master节点部署在独立的服务器上,因为Master节点是整个集群的核心,如果Master节点出现故障或不可用,将导致集群的控制命令失效。另外,Worker Node节点在集群中起着重要作用,当某个Node节点宕机时,Master节点会自动将其上的工作负载转移到其他节点上,以保证集群的稳定性和高可用性。

2.K8S核心组件

①Master组件包括:

  • Kube-apiserver:暴露Kubernetes API,提供接口服务,处理所有对象资源的增删改查和监听操作。
  • Kube-controller-manager:管理控制器,处理集群中的常规任务,确保集群处于预期的工作状态。
  • Kube-scheduler:负责资源调度,为新创建的Pod选择一个合适的Node节点。

配置存储中心etcd:用于存储关键配置和用户配置。

Node组件包括:

  • Kubelet:监视器和与Master节点的通讯器,定时向API Server汇报自己节点上运行的服务的状态,并接受来自Master节点的指示采取调整措施。
  • Kube-proxy:实现Pod网络代理,维护网络规则和四层负载均衡工作。

容器引擎:负责本机的容器创建和管理工作,支持Docker或Rocket等引擎。

3.K8S工作流程

  • 运维人员向API Server发出创建Pod的请求,告诉它我想干什么,我的期望是什么。

    API Server响应请求,并通过一系列认证和授权过程,将请求存储到etcd(分布式键值存储系统),并通知Controller Manager。

    Controller Manager通过API Server读取etcd中的请求,并按照预设的模板去创建Pod。创建完成后,将Pod的数据写入etcd。

    Controller Manager通过API Server去找Scheduler,为新创建的Pod选择最适合的Node节点。Scheduler会根据预算策略在所有Node节点中挑选最优的节点。

    Scheduler选择合适的Node节点后,将选择结果返回给Controller Manager。

    Controller Manager将选择结果通过API Server写入etcd,更新Pod的状态。

    Kubelet(运行在每个节点上的代理程序)通过API Server获取到更新后的Pod状态,并根据状态执行相应的操作,如创建、销毁和监控容器。

    Container Runtime(容器运行时)在选定的Node节点上运行容器,如Docker、containerd等。容器运行时负责容器的生命周期管理、资源隔离和安全性等功能。

    kube-proxy负责在集群中实现服务发现和负载均衡。它维护网络规则,将服务请求转发到正确的目标容器。


六 K8S核心概念

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

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

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

1.Pod

Pod 是 Kubernetes 中最小的调度单元,它可以包含一个或多个容器,并共享同一台主机上的网络和存储资源。在同一个 Pod 内的容器可以通过 localhost 进行通信,并且可以挂载 Pod 内的所有数据卷。

但是需要注意的是,不同的 Pod 之间的容器不能使用 localhost 进行通信,也不能挂载其他 Pod 的数据卷。这是因为每个 Pod 都有自己独立的网络命名空间,它们之间的通信需要通过网络进行。

边车模式(SideCar)是一种常见的 Pod 设计模式,在一个 Pod 中运行多个关联互补的容器,例如日志收集、监控等。这样可以将相关的功能模块放在同一个 Pod 中,简化部署和管理。

2.Pod控制器

Pod 控制器是 Kubernetes 中用来确保 Pod 按照用户预期运行的模板,包括管理副本数量、生命周期和健康状态检查等功能。常见的 Pod 控制器包括:

  • Deployment:用于无状态应用部署,管理和控制 Pod 和 ReplicaSet,确保它们按照用户期望的状态运行。Deployment类似于总包工头,负责监督Pod的运行情况,如果发现某个Pod不可用,会自动拉取新的Pod替换。

  • ReplicaSet:用于确保预期的 Pod 副本数量,管理和控制 Pod 的运行状态。ReplicaSet受Deployment控制,类似于总包工头手下的小包工头。

  • DaemonSet:用于确保所有节点运行同一类 Pod,保证每个节点上都有一个此类 Pod 运行,通常用于实现系统级后台任务。

  • StatefulSet:用于有状态应用部署,为每个Pod提供唯一标识符和稳定的网络标识。

  • Job:用于一次性任务,根据用户设置,管理的Pod在任务完成后自动退出。

  • CronJob:用于周期性计划任务,类似于Linux中的cron任务。

这些 Pod 控制器在 Kubernetes 中扮演着重要的角色,帮助用户管理和控制 Pod 的运行状态,实现自动化的容器编排和管理。用户可以直接操作Deployment来部署服务,而Kubernetes会自动生成所需的ReplicaSet和Pod,简化了用户的操作流程。 Replication Controller 是 ReplicaSet 的前身,官方推荐用 Deployment 取代 Replication Controller 来部署服务。

3.Label

  • 标签是 Kubernetes 中的一个特色管理方式,用于对资源对象进行分类管理。
  • 可以附加到各种资源对象上,如 Node、Pod、Service、Replication Controller 等,用于关联对象、查询和筛选。
  • 一个标签是一个 key-value 的键值对,key 和 value 由用户自定义。
  • 资源对象可以定义任意数量的标签,同一个标签也可以被添加到多个资源对象中,也可以在对象创建后动态添加或删除。
  • 通过给资源对象绑定不同的标签,可以实现多维度的资源分组管理功能。

4.Label 选择器(Label selector)

Label 选择器(Label selector)是用于查询和筛选拥有特定标签的资源对象的机制。它可以根据标签的等值关系或集合关系进行选择。

  • 基于等值关系:

    • 等于(=):选择具有指定标签键和值的资源对象。
    • 不等于(!=):选择不具有指定标签键和值的资源对象。
  • 基于集合关系:

    • 属于(in):选择具有指定标签键并且其值属于给定列表的资源对象。
    • 不属于(notin):选择具有指定标签键但其值不属于给定列表的资源对象。
    • 存在(exists):选择具有指定标签键的资源对象,不考虑其值。

5.Service

在 Kubernetes 集群中,Service 是一个核心概念,用于解决 Pod 生命周期变化带来的 IP 地址不稳定性问题。Service 可以看作一组提供相同服务的 Pod 的对外访问接口和流量均衡器。它为一组 Pod 提供了一个统一的入口,客户端可以通过 Service 访问这组 Pod,而无需关心具体哪个 Pod 处理请求。

Service 的主要作用包括:

  • 提供稳定的对外访问方式:每个 Service 都有一个固定的虚拟 IP(Cluster IP),客户端可以直接访问该 IP,Service 负责将请求转发给后端的 Pod。
  • 实现负载均衡:Service 可以将请求流量分发到后端所有的 Pod 上,实现负载均衡的功能,同时支持水平扩展。
  • 屏蔽服务细节:Service 统一对外暴露服务接口,使得外部用户不需要关注后端 Pod 的具体变化,从而实现了微服务架构的优势。

kube-proxy 是实现 Service 功能的关键组件,它在每个节点上运行,监听 API Server 中服务对象的变化,并通过不同的流量调度模式(如 userspace、iptables、ipvs)来实现网络转发功能。

通过使用 Service,Kubernetes 提供了一种灵活且稳定的方式来管理和访问部署在集群中的应用程序,同时确保了服务的可靠性、可伸缩性和透明性,为构建现代容器化应用提供了便利和高效性。

6.Ingress

当需要从集群外部访问集群内部的服务时,Ingress 起到了关键作用。Ingress 是整个 Kubernetes 集群的接入层,负责管理集群内外的通讯。工作在 OSI 网络参考模型的第7层应用层,典型的访问方式为 HTTP/HTTPS。与之不同的是,Service 只能进行第四层的流量调度,表现形式是 IP 地址和端口。相比之下,Ingress 可以根据不同的业务域和 URL 访问路径来调度业务流量。

比如,当客户端发起请求 http://www.baidu.com:port 时,请求会经过 Ingress 控制器,然后被转发到相应的 Service 上,最终到达对应的 Pod。

通过 Ingress,可以实现更加灵活的流量管理和路由,同时支持诸如负载均衡、SSL/TLS 密钥和证书管理、URL 重写、会话亲和性等高级功能。为了使 Ingress 生效,需要在集群中部署一个 Ingress 控制器,例如 Nginx Ingress Controller 或 Traefik Ingress Controller,它负责监听 Ingress 资源的变化,并按照配置将流量转发到相应的 Service 和 Pod。

通过这样的方式,Ingress 提供了一种方便的方式来向外部用户暴露集群内部的服务,实现灵活的流量路由和访问控制,从而满足更高级的网络需求。

7.Name

在 Kubernetes 中,每种资源都应该具有自己的名称。这个名称通常定义在资源的元数据(metadata)信息中,并且在同一个命名空间(namespace)中必须是唯一的。

Kubernetes 中的资源定义包括 api 版本(apiVersion)、类别(kind)、元数据(metadata)、定义清单(spec)和状态(status)等配置信息。其中,元数据(metadata)字段用来存储资源的一些元信息,例如名称、标签等。在元数据中,name字段用于指定资源的名称,它是资源在所属命名空间中的唯一标识。

通过为每种资源指定唯一的名称,Kubernetes 可以准确地识别和管理各个资源实例,确保其在集群内的唯一性和可识别性。同时,名称的唯一性也有助于避免冲突和混淆,使资源的管理更加清晰和有序。

8.Namespace

在 Kubernetes 中,Namespace 是一种用来逻辑上隔离不同资源的方法。它将一个 Kubernetes 集群划分为多个虚拟集群组,使得在不同 Namespace 内的资源不共享,并且可以允许相同 Namespace 内的同类型资源具有相同的名称,但在相同 Namespace 内不允许存在同名的资源。

通过合理使用 Kubernetes 的 Namespace,集群管理员可以更好地对交付到 Kubernetes 中的服务进行分类管理和浏览,提高管理效率。Kubernetes 默认提供了一些 Namespace,如 defaultkube-systemkube-public 等,用于存放不同类型的资源。

要查询 Kubernetes 中特定 Namespace 的资源,需要在查询命令中指定相应的 Namespace,以确保能够定位到正确的资源实例。这样可以避免混淆和冲突,确保资源的独立性和可识别性。通过合理使用 Namespace,可以有效管理和组织 Kubernetes 中的资源,提升整体运维效率和可管理性。

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值