企业级运维之云原生与Kubernets实战课程 - 第一章第2讲 容器和K8s核心概念(下)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本小节主要内容为K8s核心概念、Kubernetes功能、Kubernetes的架构、Kubernetes核心组件(Master、Worker、Pod)等内容。

企业级运维之云原生与Kubernets实战课程

第一章第2讲 容器和K8s核心概念(下)

 

摘要:本小节主要内容为K8s核心概念、Kubernetes功能、Kubernetes的架构、Kubernetes核心组件(MasterWorkerPod)等内容。

 

视频地址:https://developer.aliyun.com/learning/course/913/detail/14493

 

目录

 

  • 什么是 Kubernetes
  • Kubernetes功能
  • Kubernetes的架构
  • Kubernetes核心概念

 

一、什么是 Kubernetes

 

Kubernetes是一种容器编排工具。如第一讲说述,既然Docker已经提供了相关命令,为什么还需要容器编排工具呢?

 

  • 与传统架构相比,微服务架构下会更依赖通过各微服务之间的协作来实现一个完整的业务流程,这种协作就是服务编排。编排涉及到RPC、分布式事务等,需要有完善的编排框架来支撑;
  • 以“部署容器化应用简单高效”为目的,为容器化应用部署调度、规划、更新、维护等提供机制的工具。

 

Docker命令可以对NginxTomcat进行相关管理,假如有成千上百台容器需要管理,要解决每个容器之间的依存关系,如反亲和,那么使用Docker进行管理就比较麻烦,这就需要一个工具对容器进行编排,减少不必要的劳动,使其更加友好的使用,容器编排工具K8s就这样产生了。

 

二、Kubernetes功能

 image.png

 

1. 服务发现与负载均衡

 

  • 假如在服务器上运行5Nginx容器,提供相同的服务功能,且每个容器只有1000QPS流量能力,每个容器只分配了2CPU。当流量被打满,通过扩容CPU是可以解决的,但是如果流量一直被打满,就需要上千个CPU,在流量低谷时又不需要这么多的CPU,该如何权衡花费?
  • 这时候最好的方式就是:在流量很大的时候将流量分散到不同的容器里,这样每个容器只需要很小的CPU,应用可以在一台宿主机上运行,也可以在很多宿主机上运行,而k8s满足了这样的需求,可以理解为通过前端的vip进行负载均衡将流量分发到不同的Nginx上。

 

2. 容器自动装箱

 

容器与容器之间如何结合?假如有两个容器,容器A和容器B,容器A为生产的容器,产生的日志需要被采集用于生产环境业务的分析;容器B需要分析容器A产生的日志,那么容器A和容器B需要在相同节点上,怎么将容器A和容器B绑定在一起呢?这就用到了容器自动装箱功能。

 

3. 存储编排

 

可以通过K8s实现将本地盘或者云盘等存储挂载到容器上。

 

4. 自动容器恢复

 

如上所述,有5个容器,假如一个容器挂掉,可以通过K8s进行恢复。

 

5. 自动发布与回滚

 

如在新发布的服务后,发现配置缺失,可以通过K8s回滚到之前版本。

 

6. 配置与密文管理

 

配置与密文管理是指comfigmap配置与secret管理,如在仓库里拉取镜像时需要进行身份验证,如果已定义完成密钥文件和配置,在进行交互时就会被引用,而不需要再输入账号密码。

 

7. 批量执行

 

容器通过JobCrontab Job方式执行。

 

8. 水平伸缩

 

如上述5Nginx容器,假如遇到双11节假日访问量剧增,5个容器无法满足需求,如何通过流量的大小自动创建容器或者缩小容器副本数呢?可以通过K8s水平伸缩功能实现,阿里云也已经实现垂直伸缩,即内存和CPU大小可以进行伸缩。

 

9. Kubernetes--调度

 

  • 下图中在紫色框外的为等待调度的容器,紫色框中为正在调度的容器,下面蓝色框中为已调度的容器,白色框框为节点。
  • 假如白色框所有节点能满足等待调度容器的要求,则容器在调度时会首先筛选出满足要求的节点,然后对满足要求的节点进行打分,分数由高到低的排序,打分最高的节点会被调度,这就是kubernetes的调度机制,调度分pendingrunning状态。
  • 假如白色框框节点已被占用,节点已无资源可被调度Pod,而等待调度的Pod能否正常被调度,取决于该Pod的优先级设定,这里有Priority Class的概念,即对不同的Pod设置不同优先级,假如等待调度的Pod优先级高于已被调度的Pod,则被已被调度的Pod会被驱逐,进而优先级高的Pod会被调度。

 image.png

 

10. Kubernetes--自动恢复

 

假如在K8s运行过程中,有个节点无响应失联导致k8s集群无法感知该节点上Pod的运行状态,超过一定阈值后,K8s会判定该节点是不可调度不存在的,为维持副本数会在其他节点将该服务拉起,而失联节点上的Pod可能还是在运行的状态,因为节点的失联可能是节点上kubelet组件出现问题,无法感知到K8s集群是否已驱逐该Pod

image.png

假如业务流量很大,可以利用HPA弹性伸缩功能,将会自动生成一个Pod在其他节点上被拉起,来共同承担流量的压力。

image.png

 

三、Kubernetes的架构

 

K8sCSClient-Server)架构,对集群的所有操作包括命令、页面等,都是访问的Master节点,由Master节点对输入的命令进行处理后发生到相关节点上进行具体操作。

 image.png

 

1. Master

 image.png

 

Master节点主要有如下组件:

 

  • API Server:大脑,处理输入命令
  • Controller:控制器
  • Deployment:有状态服务
  • Statefulset:有状态服务
  • Daemonset:可以在每个节点启动一个
  • Job:只允许一次或者达到失败阈值
  • Cronjob:定期执行Job
  • Scheduler:调度器
  • Etcd:键值数据库,持久存储,保证业务的一致性,所有Pod的相关信息,包括副本信息,svc等信息,都是以键值的方式存储在Etcd中,这样如果Pod被删除,通过Etcdwatch会读取Pod的原始信息进行拉起,来维持副本数一致。

 

在阿里云上,ACK环境中Master这些组件是被阿里云托管和维护的,客户侧是不用维护的,客户侧可以看到是Node节点上的组件。

 

2. Node

 image.png

 

K8sNode上有KubeletKube-proxy,当Scheduler需要调度Pod到某个节点上,相关命令通过Master节点发送给Node节点上的KubeletKubelet根据相关的调度信息调用RuntimeRuntime可能是Containerd也可能是docker)拉取该Pod


假如该Pod需要挂载使用的是Storage Plugin(存储插件)而非使用组件Kubelet,为Pod提供IP可以调用Network Plugin(网络插件),Kube-proxy使用的是IptablesIpvs。对于大规模的集群推荐使用Ipvs,因为是幂等性的,可以快速找到负载均衡的定位,找到目的IPKube-proxy可以将流量转发到不同的Pod上。

 

3. Kubernetes整体架构

 image.png

 

如图,用户与API Server进行交互,将命令或者控制台上的相关操作发生给API ServerAPI Server根据要求再转发给Controller ManagerScheduler,再发送到整个Node节点上的KubeletKubeproxy

 

四、Kubernetes核心概念

 

1. Pod

 

一个Pod上至少有一个容器,PodK8s最小的调度单元,Pod会对每个容器设置CPUMemory大小,为每个容器挂载不同的Volume及设置不同的环境变量。

 image.png

 

Pod状态:

 

  • running:业务不一定是正常的,容器可能有多个,但至少有一个容器运行。
  • succeed:正常退出:
  • Terminating:容器正在被停止,可能因为宿主机空间满在被删除或i属性文件(不可删不可读的文件)。i属性文件一般是程序在运行时调用了rancherfinalizer产生的,假如是rancher,只需要改文件属性即可;finalizer是在程序运行时可能产生了附属结构或关联的文件,需要其他程序将产生的附属结构或关联的文件删除,才能将Pod删除,否则无法直接将Pod删除。
  • containercreating:容器在创建中,假如一直处于创建中,可能是挂载卷volume问题、资源限制时单位写错memeory20OMi而非200m0.2bytes会导致cgroup OOM)、内存碎片化等原因。
  • pending:等待调度,假如没有分配节点可能是集群资源不够,Pod设置的时候有没有nodeselecter、污点、亲和性等等,假如已经分配节点了,节点上的磁盘满了或者节点上的podip池不够,也会导致Pending状态。
  • Imagepullbackoff:拉取镜像失败,有可能是网络、验证出了问题,或是用http方式拉取镜像而非https方式。
  • crashloopbackoff:表明pod曾经正常运行,某种原因终止了,返回代码code 0-1270代表正常终止,1-127需要看Pod日志,一般和应用相关。

 

2. Volume

 image.png

 

Volume就是卷的概念,它是用来管理Kubernetes存储的,声明在Pod中的容器可以访问的文件目录,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。


Volume本身是一个抽象的概念,一个 Volume 可以去支持多种的后端的存储。比如说 KubernetesVolume就支持了很多存储插件,它可以支持本地的存储,可以支持分布式的存储,比如说像cephGlusterFS;它也可以支持云存储,比如说阿里云上的云盘、AWS上的云盘、Google上的云盘等等。

 

3. Deployment

 image.png

 

Deployment定义一组Pod的副本数目、版本等,通过控制器(Controller)维持Pod副本数目,假如对Deployment设置了5个副本数,删除了一个副本数也会自动恢复,Deployment可以对Pod进行滚动升级、回滚等操作。


Deployment通过replicaset创建Pod,假如已有在运行的Pod服务,更新了PodDeployment,将会重新创建一个相同名字加一串字符的replicaset,然后会自动按照Deployment设置的规则进行滚动更新,并将正在运行的Pod调度到新创建的replicaset下,旧的replicaset还会保存下来以便于回滚。

 

4. Service

 image.png

 

SVCSevrice)可以在集群中提供一个VipVipPod进行绑定,访问VipPod会根据算法规则进行相关调度,这样就减少了Pod的访问压力。SVC支持多种访问方式实现:

 

  • ClusterIP:集群内分给集群内部使用的SVCIP
  • NodePort:会在每个节点上开放一个指定的端口;
  • Loadblalancer:可以理解为nodeport+SLB,流量流向是由client->slb->node->pod
  • Headless:通过SVC的名字访问;
  • Extername:需要调用a1iyuncheck.com实现该功能。

 

5. Namespaces

image.png

 

  • Namespace是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等; Kubernetes的每个资源,比如PodDeploymentService都属于一个Namespace
  • 同一个Namespace中的资源需要命名的唯一性;
  • 不同的Namespace中的资源可以重名。

 

Namespace用例:阿里巴巴内部会有很多个business units,在每一个business units之间,希望有一个视图上的隔离,并且在鉴权上也不一样,在cuda上面也不一样,就会使用Namespace来去给每一个BU提供隔离的机制。

 

本讲小结

 

下面以一个例子帮助理解Kubernetes架构中的这些组件,是如何互相进行交互的。


用户通过UI或者CLI提交一个PodKubernetes进行部署,这个Pod请求首先会通过CLI或者UI提交给Kubernetes API Server,下一步API Server会把这个信息写入到它的存储系统etcd,之后Scheduler会通过API Server watch或者叫做notification 机制得到这个信息:有一个Pod需要被调度。


这个时候Scheduler会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向API Server report 说:“OK! 这个 Pod 需要被调度到某一个节点上。

 image.png

 

本讲主要内容:

 

1.K8s和容器之间的区别,K8s不等于容器,是容器的编排工具,实现了容器无法实现的功能,同时减少了对容器的维护压力。


2.K8s的基本结构,MasterWorker节点,Mater节点上有 apiservercontrollerscheduleretcdWorker节点有kubeletkube-proxy(iptables/ipvs)实现了将PodIP加到SVC中。


3.DeploymentPod几种状态,SVC流量类型及区别。

 

思考:为什么K8s最小的原子维度是Podkubelet命令的使用,怎么创建deploymentSVC,怎么挂载卷,网络架构区别,这些问题将在下节课进行讲解。

 

 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
28天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
325 11
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
11天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
42 5
|
23天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
23天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
23天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
1月前
|
存储 运维 Kubernetes
云端迁移:备份中心助力企业跨云迁移K8s容器服务平台
本文将简要介绍阿里云容器服务ACK的备份中心,并以某科技公司在其实际的迁移过程中遇到具体挑战为例,阐述如何有效地利用备份中心来助力企业的容器服务平台迁移项目。
|
2月前
|
Cloud Native 持续交付 云计算
云端新纪元:探索云原生技术的奥秘在当今数字化时代,云计算已成为推动企业创新和增长的关键动力。随着云平台的不断成熟,云原生技术应运而生,以其独特的优势引领着一场新的技术革命。本文将深入探讨云原生的核心概念、主要特点以及它如何改变现代软件开发和部署的方式,为您揭开云原生这一神秘面纱。
云原生是一种构建和运行应用程序的方法,充分利用了云平台的弹性、分布式本质以及声明式基础设施。本文将解析云原生的十二要素,微服务架构的优势,以及容器化、持续集成与持续部署(CI/CD)等核心技术的实践应用。通过深入浅出的方式,让读者理解云原生不仅是一种技术,更是一种文化和方法论,它正在重塑软件开发流程,提高资源利用率和应用系统的可扩展性与容错性。
|
2月前
|
Kubernetes Docker 容器
容器运行时Containerd k8s
容器运行时Containerd k8s
45 3
|
2月前
|
运维 监控 Cloud Native
深入理解云原生技术:从概念到实践
在数字化转型的浪潮中,云原生技术如同星辰指引航船,引领企业驶向灵活、高效的未来。本文将深入浅出地探讨云原生的核心理念、关键技术及应用实例,旨在为读者揭开云原生的神秘面纱,展示其如何重塑软件开发与运维模式。通过理论与实践的结合,我们将一窥云原生技术的强大动力和无限可能。
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
75 0

相关产品

  • 容器服务Kubernetes版