前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十分钟了解Kubernetes

十分钟了解Kubernetes

作者头像
随机来个数
发布2019-07-03 11:50:30
7010
发布2019-07-03 11:50:30
举报
文章被收录于专栏:写代码的海盗写代码的海盗

何为Kubernetes?

最简单的一句话来概括Kubernetes。 它就是一套成熟的商用服务编排解决方案。Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题。

Kubernetes组件介绍

了解Kubernetes都是从Pod开始的。 Pod是Kubernetes最小的调度单元,所以组件介绍就从Pod开始。Pod是一组容器的集合,这些容器共享IPC,Network和UTS,也就是这些容器相互之间可以共享进程信息,网络信息和主机信息。这一组容器相互之间可以通过Localhost互访。

Kubernetes其它组件都是围绕着Pod来工作的。

Pod有时也称为实例(或者服务实例)。 当我们说一个服务存在2个实例时,也就是说这个服务有两个Pod。

在Kubernetes中可以单独创建Pod,单独管理Pod。 但这却无法体现出服务编排的优势,例如需要资源利用率动态伸缩,或者对外部提供网络访问。 这时Kubernetes就又提供了一些管理Pod的组件。 这些组件适用于不同的场景,但本质都是在管理Pod。

以下先介绍DaemonSet、ReplicaSet、StatefulSet和Job这四个组件。

DaemonSet用来保证在集群中每个计算节点中都运行指定的Pod。 这个组件通常用来运行监控类和数据采集类的Pod,像定时采集节点资源信息,采集节点容器日志等等。

ReplicaSet,有时简称RS。和它相对应的有RC(新版本中已经剔除了)。此组件用来维护Pod状态,时刻让集群中Pod的状态满足用户所期望的状态。 例如用户期望运行4组Pod,当集群中Pod数量大于4或者小于4时,都会动态缩容或扩容来满足4组Pod这样的状态。

StatefulSet,专为解决有状态应用而推出的组件。 DaemonSet和ReplicaSet都是无状态的,也就是Pod的启停和网络信息都是无序的。 而StatefulSet则会保证Pod的启停顺序和网络信息与之前是保持一致的。

Job,顾名思义,是运行作业的组件。 使用Job组件会保证Pod至少执行成功一次。 添加这四个组件之后,上面的图就变成了下面的样子:

在上面四个组件里面,ReplicaSet是使用最多的组件,90%的Pod的创建、销毁都是通过RS来完成的。 但RS在使用上还是有点不方便,例如Pod p1现在要修改Container A的镜像版本。 那么就需要在创建一份新RS,然后通过新RS来创建新的Pod p2。 等p2创建完成之后,在返回来销毁p1。 这个时候就会同时存在RS1和RS2,当变更很频繁时,RS的管理就会变成瓶颈。 所以Kubernetes增加了Deployment来管理ReplicaSet, 请注意Deployment是直接管理ReplicaSet的,而ReplicaSet则直接管理Pod。 所以Deployment是间接管理Pod。

通过Deployment,用户可以声明最新的Pod状态,例如新镜像版本,新的环境变量,新的数量等等这些状态信息。 Deployment会通过动态创建和销毁ReplicaSet来满足用户所期望的状态,用户不需要关心中间过程如何实现(声明式API就是好)。

因此上面的图就变成了下面的样子:

和Deployment类似,Kubernetes也提供了CronJob来动态管理Job,其实就是定时作业。 因此就不多说了。在上图中再添加一个CronJob。

说到现在,管理Pod基本就聊完了。 此时创建的Pod会有以下特点:

  • 每个Pod都是内网IP。
  • Pod销毁/创建会产生新IP。

那么如何访问这些Pod呢? 访问分两类,集群内访问和集群外访问。 但无论是集群内访问还是集群外访问,Pod的变更都不应该对调用方产生干扰。 因此对于调用方来说Pod的IP必须要固定下来。 而Service就应运而生,用来解决这个问题。

Kubernetes可以为一组Pod创建一个单独的Service,这个Service拥有固定的IP,并会将网络请求转发到相对应的这组Pod上。通俗来说,Service就是4层LB。 好吧,上面的图在添加点东西:

Service产生的基本都是内网IP(也可以产生其它网段IP,但不在极简史讨论范畴),并且是4层LB。如果要对集群外开放网络请求,就需要使用Kubernetes提供的Ingress组件。

Ingress是7层LB,而使用最多的是Nginx Ingress。 这个时候再添加点东西:

从大面上说,几个大组件都齐了。 下面再说Pod持久化和参数配置的问题。

Pod持久化就需要挂载Volume,通过将数据写入指定Volume的方式来完成持久化。Kubernetes为Volume提供了多种实现方式,大体分为两类:临时挂载和永久挂载。第三次请注意: 临时挂载指的是卷随着Pod的生命周期而存在,当Pod被删除时挂载的Volume也会随之消失。而永久挂载则是真的永久保存。

临时挂载有EmptyDir和HostPath两种方式。 永久挂载称之为PresistentVolume(PV)。PV是与Pod完全无关的一种资源,当Pod有持久化需求时,就需要向PV申请所需要的资源,这种资源称之为PersistentVolumeClaim(PVC)。

简单理解,PV就是存储池,PVC就是向存储池中申请存储资源。 在Pod中添加所申请的PVC,Pod产生的数据就可以写入到存储池中了。 上面的图再增加点东西:

极简史就剩下最后一部分了:配置文件。 配置文件指的是Kubernetes支持Pod创建时,将指定的配置文件以文件或者环境变量的形式添加到Pod中。在Kubernetes中这类配置文件称之为configmap。 既然是配置文件,就免不了会涉及到口令,放入配置文件就很不安全。 Kubernetes为这类需求单独提供了secret,其实就是特殊的configmap。 为啥是特殊,其实就是将口令做了Base64编码,连加密都不是。。 所以最后这张图就变成了这样:

到这里,极简史就算聊完了。 Kubernetes里面的概念很多也很晦涩,作为入门没法完全说清,有些地方就浅入浅出了。

实践出真知,大力出奇迹。 要想掌握好K8s,除了多学,多练,多填坑。好像真没有其它好途径。

所以这篇文章就当抛砖引玉,权当业余交流了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 何为Kubernetes?
  • Kubernetes组件介绍
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档