k8s Sidecar代理

news/2024/11/1 23:20:15/

Sidecar 代理是一种常见的设计模式,在 Kubernetes 和微服务架构中经常被用来增强服务的功能和隔离服务的职责。Sidecar 代理作为一个附属的进程或容器,通常与主应用容器一起部署在同一个 Pod 中,负责处理一些非业务的通用任务,比如网络流量管理、监控、日志记录、安全性增强等。

在微服务架构中,最常见的 Sidecar 代理实现是 Service Mesh 中的代理,例如 Istio 使用的 Envoy 代理。Sidecar 代理为主容器提供许多便利的功能,而不需要改动应用代码。

Sidecar 代理的主要功能

  1. 流量管理

    • 代理拦截和管理所有进出的网络流量,实现流量控制、负载均衡、重试机制等。
    • 可以用于实现智能路由,将流量分配给不同的服务实例,实现蓝绿部署、金丝雀发布等。
  2. 服务发现

    • 自动发现和注册服务实例,使得应用容器可以更轻松地定位和连接其他服务,而不必显式管理服务的地址和端点。
  3. 安全增强

    • Sidecar 代理可以在服务之间实现安全连接,进行加密、身份验证、授权控制等安全措施。
    • 例如,在 Istio 中使用 mTLS(双向传输层安全性)来确保服务间通信的安全性。
  4. 可观测性和日志记录

    • Sidecar 代理可以帮助监控应用的流量数据、请求响应时间等信息。
    • 提供追踪(tracing)、日志收集和指标采集等功能,为监控和分析提供更细致的数据支持。
  5. 故障注入与容错

    • 支持故障注入,帮助开发人员模拟网络故障、延迟和错误响应,以便测试应用的鲁棒性。
    • 提供熔断机制,检测并隔离故障服务,以确保集群的整体可用性。

Sidecar 代理的工作流程

以 Service Mesh 为例,当一个应用 Pod 启动时,Sidecar 代理会以容器的形式附加在该 Pod 中,代理所有入站和出站流量。应用容器的流量通过 Sidecar 代理处理,实现流量控制、负载均衡、监控等操作。应用代码可以保持简单,而将复杂的网络操作交给 Sidecar 代理处理。

Sidecar 代理的优缺点

  • 优点

    • 降低应用的复杂性:无需在应用代码中实现网络、监控或安全逻辑。
    • 可扩展性:只需部署新 Sidecar,不需要更改应用代码即可新增功能。
    • 统一管理:流量管理、安全性和监控可以集中配置、统一管理。
  • 缺点

    • 性能开销:Sidecar 代理引入的额外资源消耗,特别是在高流量场景下可能对性能有一定影响。
    • 复杂性增加:引入 Sidecar 代理后,集群和 Pod 结构更加复杂,可能增加运维和管理的难度。

在 Kubernetes 中,使用 Python 编写一个简单的 Sidecar 代理示例可以帮助理解其工作原理。在这个例子中,假设主容器是一个基本的 HTTP 服务,Sidecar 代理容器将用来记录所有进入和离开的流量。我们可以使用 Flask 来模拟主服务和 Sidecar 代理。

示例:Python 实现 Sidecar 代理

以下是使用 Flask 来模拟主服务和 Sidecar 代理的一个简单示例。Sidecar 代理将拦截流量,记录请求信息,并将请求转发给主应用。

1. 主服务代码 (app.py)

主服务将提供一个简单的 HTTP API,返回一个字符串作为响应。

# app.py
from flask import Flask, requestapp = Flask(__name__)@app.route('/process', methods=['GET', 'POST'])
def process_request():return "Main service processed your request!\n"if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
2. Sidecar 代理代码 (sidecar.py)

Sidecar 代理接收请求,记录信息,然后将请求转发给主服务。

# sidecar.py
from flask import Flask, request
import requestsapp = Flask(__name__)MAIN_SERVICE_URL = "http://localhost:5000/process"  # 主服务的地址@app.route('/proxy', methods=['GET', 'POST'])
def proxy_request():# 记录请求信息print(f"Request received at Sidecar: {request.method} {request.url}")print(f"Headers: {request.headers}")print(f"Data: {request.data.decode('utf-8')}")# 将请求转发到主服务if request.method == 'POST':response = requests.post(MAIN_SERVICE_URL, data=request.data, headers=request.headers)else:response = requests.get(MAIN_SERVICE_URL, headers=request.headers)# 记录响应信息print(f"Response from main service: {response.status_code}")return response.content, response.status_codeif __name__ == '__main__':app.run(host='0.0.0.0', port=8080)

3. Kubernetes 配置文件 (pod.yaml)

在 Kubernetes 中部署这两个容器到同一个 Pod,使 sidecar.py 作为 Sidecar 代理,所有请求首先流经 Sidecar 代理再到达主服务。

apiVersion: v1
kind: Pod
metadata:name: sidecar-example-pod
spec:containers:- name: main-appimage: python:3.8-slimcommand: ["python", "app.py"]ports:- containerPort: 5000volumeMounts:- name: app-codemountPath: /appworkingDir: /app- name: sidecar-proxyimage: python:3.8-slimcommand: ["python", "sidecar.py"]ports:- containerPort: 8080volumeMounts:- name: app-codemountPath: /appworkingDir: /appvolumes:- name: app-codeconfigMap:name: app-code-configmap

4. 创建 ConfigMap 以存储代码

可以使用 Kubernetes ConfigMapapp.pysidecar.py 代码文件挂载到 Pod 中,以便两个容器可以访问同一份代码文件。

kubectl create configmap app-code-configmap --from-file=app.py --from-file=sidecar.py

5. 访问 Sidecar 服务

创建 Pod 后,可以通过 Sidecar 容器8080 端口访问服务。Sidecar 会记录请求日志并将请求转发给主服务:

curl http://<pod-ip>:8080/proxy

请求流量将被 sidecar.py 代理并转发到 app.py 主服务,同时记录请求和响应日志。

总结

在这个示例中:
Sidecar 代理是一种灵活而强大的设计模式,广泛用于微服务和 Kubernetes 集群中,用来提升网络管理、监控、日志记录和安全性的能力。虽然它增加了一定的复杂性和资源消耗,但为应用隔离职责、提升可观测性和提高可靠性提供了有力的支持。

  • sidecar.py 扮演了 Sidecar 代理的角色,负责拦截并记录流量。
  • app.py 是主服务,处理实际的业务逻辑。
  • kubectlConfigMap 用于管理和部署 Pod,使主服务和代理服务共存于一个 Pod 中。

http://www.ppmy.cn/news/1543716.html

相关文章

网络:IP分片和组装

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言16位标识&#xff0c;3位标志&#xff0c;13位片偏移分片组装总结 前言 对于IP分片和组装的总结 当一个IP数据报的大小超过网络的MTU(最…

面试题整理 3

总结了某公司面试遇到的值得整理记录的面试题&#xff0c;比较侧重于Redis方面。 目录 Redis持久化配置 RDB AOF Redis rdb日志文件路径编辑 命令行参数设置 Redis事务 Redis事务介绍 Redis事务阶段 watch监听 Mysql隔离级别 1.READ UNCOMMITTED 2.READ COMMITTED …

FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频

FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频 文章目录 FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频1、前言1.1 目标1.2 一些说明 2、效果3、代码3.1 思路3.2 工程目录3.3 核心代码 4、全部代码获取 1、前言 本文通过FFMPEG(7.0.2)与Qt(5.13.…

智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快

在当今科技飞速发展的时代&#xff0c;智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动&#xff0c;每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中&#xff0c;10G 雷达感应开关模块以其独特的优势&#xff0c;正逐渐成…

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目 1. 项目概述 项目目标是构建一个大数据分析系统&#xff0c;包含以下核心模块&#xff1a; 1、数据爬取&#xff1a;通过request请求获取猎聘网的就业数据。 2、数据存储和分析&#xff1a;使用 Hive …

Git 基础详解

1. 基本概念 Git是一个免费、开源的 分布式版本控制系统&#xff0c;可以高效处理小到大型的各种项目。 1.1 版本控制 版本控制&#xff1a;它是一种用于追踪和记录文件、目录、项目或软件的变化&#xff0c;以便将来查阅、比较、修订不同版本文件的系统 版本控制系统&…

Nginx 增加 request_id 以便于 APM调用链跟踪

利用 Nginx 增加 request_id 以便于 APM 跟踪&#xff1a;常用实践指南 应用性能管理&#xff08;APM&#xff09;工具是保障系统健康与性能的关键&#xff0c;而唯一请求标识 request_id 则在其中扮演了至关重要的角色。在本文中&#xff0c;我们将探讨如何在 Nginx 中生成并…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…