作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
我们前面讲Pod介绍的时候就介绍过一个Pod里面可以有多个容器,不同的容器承担不同的任务。在前面介绍InitContainer的时候也介绍过初始化容器是做什么的,实际上这个SiderCar也是在Pod里面跑多个容器,但是他们有啥区别呢?
严格来说SiderCar并不是属于Kubernnetes里面的资源,而是针对Pod里面多容器的一种设计模式,或者通俗来说就是一种Pod里面的多容器的一种用法,前面我们的多容器实际上还是和业务强相关的,但是我们通过SiderCar这里注入的Pod实际上它和业务并不相关,而是为了达到某一种目的向里面注入的非业务容器。
在 Kubernetes(简称 K8s)中,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:
-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 模式,已经发展出了一些重要的产品和框架,其中最著名的包括:
服务网格(Service Mesh):服务网格是一种用于处理服务间通信的基础设施层。它通过在应用程序旁部署轻量级代理(即 Sidecar)来控制服务间的通信。Istio 和 Linkerd 是服务网格的两个主要实现,它们利用 Sidecar 模式来提供负载均衡、服务发现、流量管理、熔断、遥测等功能。
Rainbond:Rainbond 是一个基于 Kubernetes 的云原生应用管理平台,它集成了 Sidecar 模式,用于实现服务网格等功能。它通过 Sidecar 容器来扩展和增强应用程序的能力
云原生技术:在云原生技术领域,Sidecar 模式被广泛应用于构建高度可扩展、弹性和安全性的微服务架构。这种模式有助于降低微服务架构的复杂性,并提供了许多关键功能,如日志记录、监控、配置管理、服务发现等。
Service Mesh 是一种架构模式,用于处理服务间通信。随着微服务架构的流行,应用程序被拆分为更小、独立部署的服务单元,这些服务需要相互之间进行安全且可靠的通信。Service Mesh 提供了一个基础设施层来管理这些服务间的复杂通讯。
动态服务发现:服务网格能够自动发现服务实例,并更新服务列表,以便正确路由请求。
负载均衡:服务网格可以基于不同的算法(如轮询、最小连接数等)分配流量到服务实例。
故障恢复:当服务实例不可用时,服务网格可以自动尝试其他实例,或者执行重试策略。
熔断:为了防止系统雪崩,服务网格可以在服务实例无法处理更多请求时自动断开连接。
安全通信:服务网格可以加密服务间的通信,并提供服务身份验证和授权。
监控和跟踪:服务网格收集有关服务间通信的遥测数据,包括延迟、错误率和其他关键指标。
流量控制:服务网格允许管理员定义细粒度的流量控制策略,如金丝雀部署、蓝绿部署等。
服务网格的优势
解耦网络功能:服务网格将网络功能从应用程序代码中解耦出来,使得开发者可以专注于业务逻辑。
透明性:服务网格对应用程序透明,不需要修改应用程序代码即可实现网络功能。
跨语言和平台:服务网格适用于多种编程语言和平台,为微服务提供一致的网络管理。
易于管理和维护:服务网格提供集中式的管理和控制,简化了运维工作。
简单来说就是原来服务A访问服务B,以前是直接访问,现在由于sidecar和服务是在同一个网络层面,就可以通过控制sidecar注入不同的访问规则从而实现对服务A访问服务B鉴权,熔断等操作。
由于目前我对这个还没有真实使用经验,而且在中小规模集群里面也很难用到这个功能,所以我这里只能做一个很简单介绍。