作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
我们前面讲Pod介绍的时候就介绍过一个Pod里面可以有多个容器,不同的容器承担不同的任务。在前面介绍InitContainer的时候也介绍过初始化容器是做什么的,实际上这个SiderCar也是在Pod里面跑多个容器,但是他们有啥区别呢?
严格来说SiderCar并不是属于Kubernnetes里面的资源,而是针对Pod里面多容器的一种设计模式,或者通俗来说就是一种Pod里面的多容器的一种用法,前面我们的多容器实际上还是和业务强相关的,但是我们通过SiderCar这里注入的Pod实际上它和业务并不相关,而是为了达到某一种目的向里面注入的非业务容器。
在 Kubernetes(简称 K8s)中,sidecar 是一种设计模式,它涉及在同一个 Pod 中运行一个或多个辅助容器来支持主容器(主应用程序)。Sidecar 容器与主容器同时运行,可以执行多种辅助任务,如日志记录、监控、配置、更新、代理等。
以下是 sidecar 模式的一些常见用途:
-
日志收集:Sidecar 可以用来收集主应用程序容器的日志,并将其转发到中央日志管理系统。
-
服务网格代理:在服务网格架构中,如 Istio,sidecar 代理(通常是 Envoy)被用于处理服务间的通信,包括流量管理、安全性、策略实施等。
-
配置管理:Sidecar 可以用来从配置中心获取配置,并将其传递给主应用程序容器。
-
健康检查和自愈:Sidecar 可以监控主应用程序的健康状况,并在检测到问题时重启主应用程序或 Pod。
-
资源清理:在主应用程序容器停止后,sidecar 可以负责清理资源,如临时文件或锁。
-
适配和桥接:当主应用程序需要与外部系统交互,但又不方便直接修改主应用程序时,可以使用 sidecar 进行适配或桥接。
下面是一个简单的 Kubernetes Pod 配置示例,其中包含一个主应用程序容器和一个 sidecar 容器:
apiVersion: v1
kind:Pod
metadata:
name:myapp-pod
labels:
app:myapp
spec:
containers:
-name:myapp-container
image:myapp-image
ports:
-containerPort:80
-name:sidecar-container
image:sidecar-image
volumeMounts:
-name:shared-logs
mountPath:/var/log
volumes:
-name:shared-logs
emptyDir: {}
在这个例子中,myapp-container
是主应用程序容器,而 sidecar-container
是辅助容器,它可能负责日志收集等任务。两个容器共享 shared-logs
卷,这样 sidecar 容器可以访问主应用程序的日志文件。
使用 sidecar 模式可以带来以下好处:
- 解耦:通过将辅助任务从主应用程序中分离出来,可以简化主应用程序的设计和部署。
- 灵活性:可以独立于主应用程序更新和扩展 sidecar 容器。
- 可重用性:相同的 sidecar 容器可以在多个不同的应用程序中使用。
基于 Sidecar 模式,已经发展出了一些重要的产品和框架,其中最著名的包括:
服务网格(Service Mesh):服务网格是一种用于处理服务间通信的基础设施层。它通过在应用程序旁部署轻量级代理(即 Sidecar)来控制服务间的通信。Istio 和 Linkerd 是服务网格的两个主要实现,它们利用 Sidecar 模式来提供负载均衡、服务发现、流量管理、熔断、遥测等功能。
Rainbond:Rainbond 是一个基于 Kubernetes 的云原生应用管理平台,它集成了 Sidecar 模式,用于实现服务网格等功能。它通过 Sidecar 容器来扩展和增强应用程序的能力
云原生技术:在云原生技术领域,Sidecar 模式被广泛应用于构建高度可扩展、弹性和安全性的微服务架构。这种模式有助于降低微服务架构的复杂性,并提供了许多关键功能,如日志记录、监控、配置管理、服务发现等。
Service Mesh 是一种架构模式,用于处理服务间通信。随着微服务架构的流行,应用程序被拆分为更小、独立部署的服务单元,这些服务需要相互之间进行安全且可靠的通信。Service Mesh 提供了一个基础设施层来管理这些服务间的复杂通讯。
服务网格的组件
-
数据平面:数据平面由一组智能代理(通常称为 sidecar)组成,这些代理与服务实例一起部署在同一个主机上。每个代理负责处理入站和出站的网络通信,例如请求路由、负载均衡、熔断、重试等。
-
控制平面:控制平面是服务网格的大脑,它负责管理和配置数据平面代理。控制平面通常包括以下功能:
-
服务发现
-
路由规则配置
-
安全策略实施
-
监控和遥测数据的聚合
-
服务网格的关键功能
动态服务发现:服务网格能够自动发现服务实例,并更新服务列表,以便正确路由请求。
负载均衡:服务网格可以基于不同的算法(如轮询、最小连接数等)分配流量到服务实例。
故障恢复:当服务实例不可用时,服务网格可以自动尝试其他实例,或者执行重试策略。
熔断:为了防止系统雪崩,服务网格可以在服务实例无法处理更多请求时自动断开连接。
安全通信:服务网格可以加密服务间的通信,并提供服务身份验证和授权。
监控和跟踪:服务网格收集有关服务间通信的遥测数据,包括延迟、错误率和其他关键指标。
流量控制:服务网格允许管理员定义细粒度的流量控制策略,如金丝雀部署、蓝绿部署等。
服务网格的优势
解耦网络功能:服务网格将网络功能从应用程序代码中解耦出来,使得开发者可以专注于业务逻辑。
透明性:服务网格对应用程序透明,不需要修改应用程序代码即可实现网络功能。
跨语言和平台:服务网格适用于多种编程语言和平台,为微服务提供一致的网络管理。
易于管理和维护:服务网格提供集中式的管理和控制,简化了运维工作。
简单来说就是原来服务A访问服务B,以前是直接访问,现在由于sidecar和服务是在同一个网络层面,就可以通过控制sidecar注入不同的访问规则从而实现对服务A访问服务B鉴权,熔断等操作。
由于目前我对这个还没有真实使用经验,而且在中小规模集群里面也很难用到这个功能,所以我这里只能做一个很简单介绍。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。