Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >走马观花云原生技术(10):容器编排Kubernetes (下)

走马观花云原生技术(10):容器编排Kubernetes (下)

作者头像
御剑
发布于 2022-11-18 06:52:38
发布于 2022-11-18 06:52:38
41000
代码可运行
举报
文章被收录于专栏:微言码道微言码道
运行总次数:0
代码可运行

这篇文章继续聊容器编排,聊一下最重要的容器编排技术Kubernetes

大约在几年以前,容器编排还存在一些竞争,比如Kubernetes,Docker Swarm等。但是,从现在的情况来说,Kubernetes几乎占据绝对的主流,成为了容器编排事实上的标准。

而所谓的CNCF(云原生计算基金会)下的这些项目,几乎都是以K8S为核心,在K8S基础之上提供平台层面的能力补充。诸如用fluentd来做日志收集,envoy来做边缘网关,jaeger来做链路追踪等。

K8S的背景

Kubernetes,简称K8S。来源于Google的大规模容器化编排与运营的实践与技术之上。我们都清楚,Docker对于容器化起到非常重要的推动,它极大的简化了容器技术的实现与使用,使之迅速流行起来。但早在Docker及容器化大众化兴起之前,诸如AWS,Google这样的大公司内部已经是发展出了大规模服务编排与运营的技术。

最开始,Google内部使用的是Brog这个技术,主要是用做管理长期运行的服务及批量化部署等编排能力,在使用了很长一段时间并发展出了很多诸如服务服务与查找,负载均衡,自动扩容等能力,随后Google在借鉴Brog的经验之上,发展出了新的容器编排技术- Omega。但无论是Brog还是Omega,都是Google内部使用的技术。

最后,在Docker使得容器变得流行之后,Google重新开发了Kubernetes,并将其开源出来,最终捐献给了CNCF。Kubernetes借鉴了大量的Brog与Omega的经验,由于出众的能力与可靠性,使得其迅速成为最受欢迎的容器编排技术。

申明式部署

K8S是最大特色是声明式部署,虽然它也支持命令式部署,但我们更愿意使用声明式部署,特别是在大规模服务的管理与运维中,声明式部署的优点特别明显。

命令式部署是传统的部署方式,你通过命令,主动告知系统需要做什么。而部署一个项目,可能是一系列命令的集合,比如先下载安装包,再解压,再安装,再做成服务,再运行,这一系列的过程都需要你一步一个命令来实现。

而声明式部署则完全不同,它只需要你提供一个期望的状态的声明文件,背后的支撑机制会帮你去实现从镜像下载,镜像运行,启动你期望的实例数量等,最终达到你声明的期望

K8S之所以能应对大规模服务,根本原因就在于它这种声明式部署的优势,否则大规模的部署与运营难以实现。

如下面这个示例,仅通过定义一个yml文件,来声明我期望部署一个distributed的服务,实例数是3,部署镜像是lingen/java-grpc-sample-distributed:1

我不需要关心K8S是怎么实现的期望的,我要关心只是告知K8S我的期望。这就是声明式部署。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: distributed
  labels:
    app: distributed
spec:
  replicas: 3
  selector:
    matchLabels:
      app: distributed
  template:
    metadata:
      labels:
        app: distributed
    spec:
      containers:
        - name: distributed
          image: lingen/java-grpc-sample-distributed:1
          ports:
            - containerPort: 8080

基础技术点

K8S的相关书与教程也非常多,如果想彻底了解它,阅读官网的教程与其它书是必不可少的;而要掌握它,则需要大量的实践与尝试。

而本篇文章,我仅列了一些K8S中的关键技术点,理解了这些技术点,你也能对K8S有个非常初步的理解了。

  1. 1. 依赖一个容器运行引擎

K8S是容器编排技术,它并不是容器技术,这一点要区分开来。K8S本身是运行在容器技术的上一层,提供容器的编排,管理与大规模运营能力。

这就意味着,K8S需要一个容器运行引擎。K8S本身并不自带一个这样的引擎,需要你去安装一个它支持的引擎技术。

早些年,K8S与特定的容器技术绑定,如Docker。但这种方式肯定不是一个好方法,编程的我们都清楚,依赖接口与协议远优于依赖于特定技术。所以K8S提出了CRI(容器运行引擎)规范。任何支持CRI的容器技术,K8S都可以运行。

当前,Docker是基于Containerd容器引擎的技术,而Containerd是实现了CRI规范的容器技术。所以,如果需要一个K8S环境,你需要首先安装Containerd或Docker容器技术,这两个仍然是最主流的选择。

这并不是你的唯一选择,还有其它一些容器技术,也在K8S的支持之列,比如K8S官网还列出了诸如CRI-OMirantis Container Runtime等可选项。

事实上,使用K8S,你只需要一个这样的容器运行引擎,并不需要去使用或关注它。因此,选择你最熟悉的一种就可以了,当前主流可能仍然是Docker Engine

  1. 2. 管理节点与工作节点

K8S是容器编排技术,本质是是对大规模服务的管理,理所当然的需要大量节点来支持大量服务的运行。

这样的服务节点在一些大型系统中可能是成千上万,甚至更多。因此K8S是如何来管理这些节点的?这就依赖于K8S的的核心管理模式,管理节点与工作节点。

K8S是由少数的管理节点(通常是3,5或7个)以及不限数量的大量的工作节点共同协作完成的。

工作节点的任务就是运行各个不同的服务,至于运行哪个服务,运行多少数量的服务,工作节点并不关心,统一由管理节点来分配与安排。

管理节点的任务与之相对应,就是用来协调,分配,监控工作节点的。管理节点接受到任务,根据一定的规则来分配任务到不同的工作节点,同时根据设定来监控服务的健康并在适当的时候做出任务的变更(比如服务当机时重启一个新的服务)

而做为运维的程序员,只需要同管理节点打交道就可以了。我们通常在管理节点上通过kubectl来管理与部署服务。

  1. 3. 最小部署单位:Pod

熟悉容器技术的都知道,容器的最小单位是镜像。但在K8S中,一个最小的单位并不是镜像,而是Pod,而所谓的Pod,内部包含有一个或多少镜像。

其实严格说来,一个Pod并不只有一个镜像,就算你只指定一个镜像。每个Pod默认就带有一个名为Pause的镜像,而这个Pause镜像是给这个Pod内部提供统一的网络及存储等通用服务的。

这样的好处在于,K8S在工具层面,基于这种Pod允许多个镜像的机制,提供了很多能力,比如enovy这样的服务网格,还有很多边车服务能力,都是依赖于这种设计。

在Pod中部署一个服务镜像,再添加一个或多少支持能力镜像,比如网络代理,日志收集,负载均衡,授权认证等,这样就把架构上的这些需求从架构层上交到了K8S容器编排这一层,可以简化了架构层的负担,你在架构中更多的只需要考虑业务服务的实现就OK了。怎么用代理能力(重试,超时,断路等)来优化分布式可靠性,怎么做日志收集,这些K8S可以结合一些连车服务来帮你实现。

  1. 4. 最常用部署单位:Deployment,Service,Daemonset,CronJob

虽然最小部署单位是Pod,但在实际使用中,很少会直接以Pod来做为基本部署单位。而最常用的部署单位,则是DeploymentServiceDaemonsetCronJob等几种。

它们各有特点,适合不同的场景。

Deployment

Deployment是基于ReplicaSet之上提供的一种部署模式。而ReplicaSet则是基于Pod之上的支持自愈,扩展的一种部署能力。而Deployment则在ReplicaSet之上,又提供了扩容,更新与回滚等更进一步的能力。所以,基本上,我们对于服务的最主要的部署模式就是Deployment。

Service

Service是对一系列Pod集的调用封装,在K8S中,服务的运行节点与IP等参数都是不可预测的,所以直接访问服务是很难做到的,而且每个服务都有N多个实例,这就需要一种机制来对这些实例的访问进行抽象与负载。这就是Service的能力。

通过Service,你只需要知道Service的地址(DNS或名称,或Global IP等),就可以访问到Service背后的这些Pod实例,还能进行负载等。

Daemonset

Daemonset是一种特别的部署单位。它是在每个工作节点上额定会运行一个这样的服务。特别适合诸如日志收集,节点监控等场景。

只要你部署一个Daemonset,每加入一个新的工作节点时,会自动启动一个类似的Daemonset服务。而工作节点从K8S中删除之后,这个Daemonset服务也会自动停掉。

CronJob

Job是执行一次性任务的部署单位,这个服务只运行一次,运行完就停止。而在Job之上,还有CronJob,顾名思议,它是定期运行一些任务的概念。

如果你有一些需要定期执行的任务,使用CronJob非常适合的。

  1. 5. StatefulSet

在云服务中,我们尽量让服务属无状态,这是最佳的实现方式,无状态的服务可以随意的扩容,而不用担心有状态需要处理。

在实现中,我们可以尽量把有状态的服务变更为无服务状态,比如一个服务有用户会话Session的状态,那我们可以把Session迁移到Redis缓存中,这样这个服务就变成无状态的了。

但一个系统中,不可能所有功能点都能做到无状态,有时候一些状态是必不可少的,比如典型的数据库。任务一个数据库服务都是有状态的,它的数据是需要存储与加载的。

所以,K8S也提供了支持有状态服务的部署单元,它就是StatefulSet了,StatefulSet适合部署一些有状态的服务。K8S保证一个有状态的服务停止掉,下次重启时,状态仍然会得以保留。

但是仍然要非常小心,尽量避免有状态的服务。有状态的服务很容易成为系统的阻碍。

  1. 6. 存储PV与PVC

任何一个系统,不可能不需要存储。同样,在大规模容器运行的环境中,如何处理存储是必不可少的一环了。

对于存储,K8S提供了PV与PVC的机制来支持存储的实现。

PV是PersistentVolume,是最小存储单元。K8S的管理员,需要事先申明与定义一些PV存储,PV支持本机,也支持很多云存储

而PVC则是PersistentVolumeClaim,是一个部署申明需要存储的声明。比如你部署的某个服务,需要10G的存储,你可以定义一个PVC,这样K8S在启动服务时,会满足你的申明,分配10G的存储给你。

K8S同样提出了CSI(容器存储接口)标准,任何实现了CSI标准的存储技术,都可以被K8S使用。

早期PV都是静态存储申明,现在又增加了支持动态申明,就是不限定存储容量,按需分配。

  1. 7. ConfigMap与Secret

在系统中,我们经常需要一些配置文件,甚至一些用户名与密码等。比如数据库的用户名与密码。而在分布式环境中,如何处理统一的配置也非常重要。

K8S同样也提供了ConfigMap与Secret的概念,用于配置的支持。你可以将你的配置定义在ConfigMap中,如果是机密的信息,那就定义在Secret中。

这样在定义部署单元时,你可以引用这些配置,无论你最终的服务是运行在哪个工作节点上,都能顺利的读取到对应的配置。

强大&复杂

上面这些只是K8S中最基础,也是最常用的一些能力。当然K8S做为一个复杂的云原生系统,是非常强大与复杂的,仍然有更多的能力没有列出来。但上面这些是你开始学习与使用K8S时,最先需要理解的概念。

事实上,也是因为K8S中这些概念太多,导致K8S被认为非常复杂,难以学习与掌握。学习与掌握K8S的确需要一定的时间,特别是不断的动手与试错是非常重要的。

但理解它的一些核心理念,是根本的前提。

希望我的这篇文章能让你对K8S有一个初步的理解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微言码道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
走马观花云原生技术(1):容器引擎containerd
决定开启一个有意思的系列,就是把CNCF(云原生计算基金会)的graduated(毕业)项目都介绍一下。
御剑
2022/11/18
5100
走马观花云原生技术(1):容器引擎containerd
十分钟了解Kubernetes
最简单的一句话来概括Kubernetes。 它就是一套成熟的商用服务编排解决方案。Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题。
随机来个数
2019/07/03
7900
十分钟了解Kubernetes
Docker与k8s的恩怨情仇(六)—— “容器编排”上演“终结者”大片
在上节中,我们为大家介绍了Pod的基础内容,Kubernetes如何站在上帝视角上处理容器和容器之间的关系。但仅仅有Pod却还不够,对于大部分用户而言如何调度和管理自己的应用才是真正核心的问题,而对这一内容的解决方案才是Kubernetes最终极大杀器。
葡萄城控件
2021/08/06
5500
Kubernetes核心技术剖析及在DevOps落地实践
本文主要介绍Kubernetes 的核心组件、架构、服务编排,以及在集群规模、网络&隔离、SideCar、高可用上的一些使用建议,尤其是在CICD中落地,什么是 GitOps. 通过此文可彻底了解 k8s 的整体核心技术以及如何应用在 DevOps 实践中。
laofo
2022/10/25
7790
Kubernetes核心技术剖析及在DevOps落地实践
k8s实践(1)--k8s集群入门介绍和基础原理
1、简单了解集群的工作原理和基础概念,名词解释。 2、安装etcd集群:etcd分布式键值存储系统,用于保持集群状态,比如Pod、Service等对象信息。 3、安装k8s集群,简单了解集群的如何工作。 4、搭建集群网络:基础网络搞好,后面才能顺利部署各种资源。 5、学习k8s的安全、Secrets,ssl认证。如果安全认证没有搞好,创建pod和service都会报各种错误。 6、然后我们深入学习pod和service。 7、深入学习集群工作原理分析,从基础到深度,才能学的扎实。 8、有了pod和service,就需要知道如果发现,学习coreDNS 9、开始部署一些有状态的服务 10、案例实践
黄规速
2022/04/14
1.9K0
k8s实践(1)--k8s集群入门介绍和基础原理
走马观花云原生技术(5):日志收集器fluentd
在微服务架构中,日志是一个不得不面临与需要解决的点。因为微服务架构中,服务是分散在不同的节点或虚拟机上运行,这意味着服务产生的日志也是分散的,所以收集分散的日志就成为了微服务中的一个痛点。否则有需要时查询起日志来就非常麻烦与不方便。
御剑
2022/11/18
8600
走马观花云原生技术(5):日志收集器fluentd
Kubernetes K8S 基本概述、设计架构和设计理念
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署、规划、更新、维护的一种机制。
踏歌行
2020/10/15
3.5K0
Kubernetes K8S 基本概述、设计架构和设计理念
走马观花云原生技术(9):容器编排Kubernetes(上)
其实,严格说来,容器编排Kubernetes,简称K8S,是CNCF(云原生计算基金会)的最核心的项目。几乎其它所有技术都是建立在K8S基础之上,丰富与扩展K8S的能力。
御剑
2022/11/18
4020
走马观花云原生技术(9):容器编排Kubernetes(上)
kubernetes脑图下载与学习笔记总结
[TOC] Kubernetes 学习路径 0x00 简要介绍 简要介绍 发展历史 公有云类型说明 基础设施及服务 (IaaS) 平台及服务(PaaS) 软件即服务(SaaS) 部署时代变迁 传统部署时代 (早期传统IT企业、单机部署、资源利用率较低) 虚拟化部署时代 (近现代IT企业使用较多) 容器化部署时代 (现代企业从传统企业向数据信息化建设转型) 资源管理器对比 Apache MESO
全栈工程师修炼指南
2020/12/17
8810
Kubernetes 核心概念
在本文中,我们将介绍基本的Kubernetes概念。Kubernetes的术语很多,可能会令人生畏。
dys
2020/02/12
8220
Kubernetes 核心概念
K8s-RoadMap
Docker 是新时代虚拟化,云原生的基础, 尽管有多种容器化的方案,但是 Docker 目前是事实标准
Kevinello
2022/08/19
4960
K8s-RoadMap
Kubernetes系列学习文章 - 五种控制器(七)
| 导语 K8S的控制器是非常重要的存在,每种控制器都处理不同的任务,它主要用来控制Pod的状态和行为。
宝哥@上云专家
2019/08/25
5.9K1
容器集群管理 -- Docker Swarm vs Kubernetes
我们看到 Docker 的本质其实就是被 linux 系统机制隔离的进程,有了这样的隔离性,我们能够借以实现我们的微服务架构。
用户3147702
2022/06/27
7890
容器集群管理 -- Docker Swarm vs Kubernetes
云原生基础设施之Kubernetes
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
山河已无恙
2023/03/02
1.4K0
云原生基础设施之Kubernetes
浅谈Kubernetes
注: CNCF即为云原生计算基金会,是一个开源的软件基金会,致力于云原生技术的普及及可持续发展。许多有名的项目都托管在这个社区当中,包括Docker、Kubernetes。
月梦@剑心
2023/08/31
2410
浅谈Kubernetes
K8S学习笔记之Kubernetes核心概念
Kubernetes(K8S)是Google开源的容器集群管理系统,其设计源于Google在容器编排方面积累的丰富经验,并结合社区创新的最佳实践。 K8S在Docker容器技术的基础之上,大大地提高了容器化部署应用简单高效。经过几年的快速发展,K8S已经成为建设容器云平台的首选方案。
Jetpropelledsnake21
2019/03/20
1.1K0
K8S学习笔记之Kubernetes核心概念
Kubernetes架构原来这么简单
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
用户1107783
2023/09/14
1.5K0
Kubernetes架构原来这么简单
【重识云原生】第六章容器6.2.1节——Kubernetes概述
        为了降低虚拟机造成的物理主机资源浪费,提高物理主机的资源利用率,并能够提供像虚拟机一样良好的应用程序隔离运行环境,便诞生了容器技术。容器管理类似于虚拟机管理,主要用于容器的创建、启动、关闭、删除等容器生命周期的管理。常见的容器管理工具有:
江中散人_Jun
2022/09/28
7970
【重识云原生】第六章容器6.2.1节——Kubernetes概述
k8s的概念与架构介绍
K8S,全称 Kubernetes,是一个用于管理容器的开源平台。它可以让用户更加方便地部署、扩展和管理容器化应用程序,并通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。
张哥编程
2024/12/13
2710
1-Kubernetes入门体系架构学习
描述:近些年由于Cloud云计算(公有云)以及大数据的发展促进了企业从传统转型到数字信息化再到上云, 其中运维部署应用技术也从物理机转向虚拟化再转向了容器化,而又随着分布架构应用的火热,以及对业务快速迭代的的需要,便推动了如今的Kubernetes分布式架构运维平台,它实现了对容器资源的编排与控制, 这也是本次学习的重中之重;
全栈工程师修炼指南
2022/09/29
9170
1-Kubernetes入门体系架构学习
推荐阅读
相关推荐
走马观花云原生技术(1):容器引擎containerd
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验