【Kubernetes】

【k8s学习】Kubernetes学习——核心组件和架构

2022-06-15  本文已影响0人  伊丽莎白2015

【本文内容】文章主要分三章:

第一章简单的介绍了Kubernetes的特点。
第二章介绍了Kubernetes的核心组件,包括:

第三章介绍了Kubernetes的架构,包括:


1. Kubernetes的特点:

2. Kubernetes Components(重要的组件介绍)

比如我们想在部署以下服务:

2.1 Pod

官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/

2.2 Service and Ingress

Service:
官网:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/

针对上述Pod的地址不是固定的问题,Service组件可以帮助解决这个问题:

我们想要把my-app服务暴露给外部以便可以通过浏览器被访问到,例如:http://my-app-service-ip:port,这种Service叫External Service,表示可以被外部访问到。
另一种像db的Service,我们并不希望暴露给外部,只要my-app服务能找到即可,这种Service叫Internal Service

Service解决了Pod的网络问题,但它本身还是有缺陷的,比如我们的my-app项目,最终的地址是:http://123.1.1.1:8080,这样的访问方式可能适合测试,但对于最终的网站,我们希望用的是https://my-app.com,这时候就需要用另外一个组件了,叫Ingress

Ingress
官网:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

外部的请求会先发送给Ingress,然后通过Ingress再转发给相应的Service。

2.3 ConfigMap and Secret

官网:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/

Pod间相互交流依赖于Service(原因上述讲过了,在Kubernetes中,Pod被设计成相对临时的实体,一个Pod down后,因为高可用的前提下,Kubernetes会保证再新起一个Pod,那么IP就会变了,Serivce中的IP是固定的)。

正因为此,我们上述的例子Java项目my-app如果想要用mongo-db,那么它会在自己的配置文件中配置db connection url:mongo-db-service。
这个配置可能会在my-app项目中的application.properies中,或是某种外部环境变量之类的。但通常情况下,Database URL的改动,可能会引起项目的镜像重新生成,再上传到repository,在Kubernetes中再pull到Pod中。一个DB的URL的小小改动,需要重新做CI/CD,好像有点太过复杂,基于此,Kubernetes引入了新的组件,叫ConfigMap

Secret
官网:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/

怎么使用ConfigMap和Secret,可以在项目中当作环境变量来使用,或者在properties文件中引用。

2.4 Volumes

官网:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/

Kubernetes是如何存储数据(data storage)的呢?

基于上述的例子,我们有一个mongo-db的Pod,假设我们的项目my-app,有一个add的功能,只要submit了,就会往mongo-db里存放数据。如果这时候db Pod重启了,那么之前存放的表单数据就没了(Container 中的文件在磁盘上是临时存放的)。这显然是不能接受的。我们希望存放在mongo-db中的数据是可靠的,并不会随意丢失的。Kubernetes通过组件Volumes来解决数据存储的问题。

卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 目录可以是:

以上这些Storage,并不是Kubernetes自己管理的存储,因为k8s doesn't manage data persistance!,可以把上述这些Storage想象成:Kubernetes集群中的外部硬件设备插件。(External hard drive plugin into the Kubernetes cluster)。这意味着用户需要自己保证数据的备份以及管理,以及存放在正确的地方。

到目前为止,上述的Kubernetes组件,可以很好让我的项目my-app运行起来,也能够读取并安全的存储数据到mondo db,并且用户可以在外部通过https://my-app.com来访问项目。

my-app在Kubernetes上的架构
2.5 Deployment And StatefulSet

上述的架构有个问题,如果my-app项目down了呢?一般来说可以人为重启Pod即可,但这样会造成一个问题,那就是在down掉的这段时间里,my-app网页会显示404,对客户来说很不友好。

如何解决呢?Kubernetes中的设计是Replicate everything,即一切都是可复制的,所以我们会再部署一个Node(之前的是Node1的话,那么这个Node2),然后在Node2上布署和Node1一模一样的Pod,Node2上的Pod和Node2连接的是同一个Service1。

node1+node2.png

Service的主要特点就是:IP固定,并且有Load Balance的功能。所以当Node1中的my-app Pod挂了后,外部请求就会通过Service1转发到Node2上的my-app Pod,即实现了网站的高可用。

**这里引入了另一个概念,即我们经常定义并启动Pod,应该要为Pod提供一个设计蓝图(define blueprint of Pods),即定义Pod并声明有几份ReplicaSet,由此引出Kubernetes里另一个重要的组件,叫Deployment

Deployment
官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

至此,我们解决了my-app Pod挂了后,网站处于404的问题(即创建Deployment,定义Pod和ReplicaSet,Pod down后,Kubernetes会跟据副本数立马启动新的Pod)。

但是,既然my-app Pod可能会down,毫无疑问,mongo-db Pod也可能会down。但是我们不能像my-app一样,用Deployment来定义Pod,原因是因为它有数据,比如使用同一份Storage,那么同时读写可能会造成数据的不一致。针对Stateful(有状态的)Pod,我们需要使用另一个组件来定义,叫StatefulSet

Stateful Set
官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/

3. Kubernetes架构

3.1 Worker Node

Node,即节点,可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行Pod所需的服务。

节点的组件:

介绍完单个节点的组件,那么接下来的问题就是作为管理员如何和这个节点进行交互呢?比如:schedule pod? monitor? re-schedule/re-start pod? join a new Node?
答案是:以上这些都为由Master Node进行管理。

3.2 Master Node

4 processes run on every master node!:不同于Worker Node需要安装3个组件,Master Node需要安装4个组件。

在实际的Kubernetes集群中,可能会不止一台Master节点,比如会有Master1,Master2,当然组件Api Server会是Load Balance,etcd存储会是分布式的。

3.3 例子

假设我们设计的集群中,有:

因为Master Node上没有Pod运行在上面,所以一般来说,它所需要的资源,可以比Worker Node少——less resources。这里的资源包括CPU、内存以及存储空间。

想要加入更多的Master Node或是Worker Node,也比较容易,比如想要创建新的Master Node

Worker Node同理,需要安装的是上述的3个组件:container runtime,kubelet,kube-proxy。


参考:https://kubernetes.io/zh-cn/docs/home/
参考:https://www.youtube.com/watch?v=X48VuDVv0do

上一篇 下一篇

猜你喜欢

热点阅读