二、istio Sidecar 注入示例

部署httpbin Web示例:

cd istio-1.4.2/samples/httpbin
kubectl apply -f httpbin-nodeport.yaml

访问,根据svc生成的端口,

[root@master httpbin]# kubectl get svc|grep httpbin
httpbin       NodePort    10.0.0.172   <none>        8000:31118/TCP   23d

我们访问界面:http://192.168.25.137:31118/

将该应用接入到istio中,在应用上面装上一个Sidecar

手动注入

kubectl apply -f <(istioctl kube-inject -f httpbin-nodeport.yaml) 

或者

 istioctl kube-inject -f httpbin-nodeport.yaml |kubectl apply -f

我们通过 istioctl kube-inject -f httpbin-nodeport.yaml |more
可以得知,我们加了一个叫做proxy的容器。

image: docker.io/istio/proxyv2:1.4.2
        imagePullPolicy: IfNotPresent
        name: istio-init
        resources:

此时可以看到该pod下面多了一个容器,

[root@master ~]# kubectl get pod|grep httpbin
httpbin-5c8ff7878b-c5mcc          2/2     Running   2          21h

自动注入

针对命名空间进行自动注入

kubectl label namespace default istio-injection=enabled

部署完毕后,因为sidecar会接管流量所以可以用istio的网关服务来访问。
部署网关:

kubectl apply -f httpbin-gateway.yaml

我们要在外部访问依赖的是 istio-ingressgateway,查看ingressgateway的svc对外端口。
因为LoadBalancer对应的是公有云服务,我们没有创建lb所以会是pending状态,但是还是会对外的nodeport端口

[root@master httpbin]# kubectl get svc -n istio-system|grep istio-ingressgateway
istio-ingressgateway     LoadBalancer   10.0.0.102   <pending>     15020:35582/TCP,80:31513/TCP,443:48478/TCP,15029:44880/TCP,15030:45669/TCP,15031:48045/TCP,15032:30890/TCP,15443:32749/TCP   35d

此时我们访问:http://192.168.25.137:31513/
同时观察istio-ingressgateway pod的流量也可以证明流量是经过了istio-ingressgateway

kubectl logs -f istio-ingressgateway-6d759478d8-r9f24 -n istio-system

[2021-04-11T15:02:56.117Z] “GET /static/favicon.ico HTTP/1.1” 200 - “-” “-” 0 22382 7 6 “192.168.25.137” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36” “c757b3d1-a0ab-9512-9312-f6c99e57d505” “192.168.25.137:31513” “172.17.154.80:80” outbound|8000||httpbin.default.svc.cluster.local - 172.17.134.110:80 192.168.25.137:64639 - -
整体流程如下:
在这里插入图片描述

<think>好的,我现在需要详细解释一下 Kubernetes 中的 Sidecar 模式。首先,我需要回忆一下 Sidecar 的基本概念,确保自己理解正确。Sidecar 是容器设计模式的一种,通常用于将辅助功能(如日志收集、监控、网络代理等)从主应用容器中分离出来,以保持主容器的单一职责。 接下来,用户可能希望了解 Sidecar 的具体用途和优势。我需要列举一些常见的应用场景,比如日志收集器、服务网格中的代理(如 Istio 的 Envoy)、配置管理工具等。同时,要强调 Sidecar 如何通过共享资源(如卷、网络命名空间)与主容器协作。 然后,应该解释如何在 Kubernetes 中实现 Sidecar。这里需要给出具体的 YAML 示例,展示如何在一个 Pod 中定义多个容器,并说明它们之间的协作方式。例如,主容器运行应用,Sidecar 容器处理日志文件的收集,共享同一个卷来访问日志文件。 还需要考虑 Sidecar 的生命周期管理。由于 Pod 中的所有容器共享相同的生命周期,Sidecar 的启动和终止需要与主容器协调,避免资源竞争或依赖问题。可能需要提到 init 容器的作用,用于在主容器启动前执行准备任务。 另外,要讨论 Sidecar 的资源分配问题。虽然 Sidecar 容器与主容器共享 Pod 资源,但需要合理设置资源请求和限制,以避免资源不足影响主应用的性能。 用户可能还会关心 Sidecar 与主容器之间的通信方式。例如,通过 localhost 进行网络通信,或者通过共享的卷进行文件交换。需要明确说明这些通信机制的具体实现和注意事项。 此外,应该提到一些最佳实践,比如保持 Sidecar 的轻量化、避免过度使用 Sidecar 导致 Pod 复杂度增加、监控 Sidecar 的资源使用情况等。 最后,需要确保回答结构清晰,按照逻辑顺序逐步展开,结合具体示例和实际应用场景,帮助用户全面理解 Sidecar 模式在 Kubernetes 中的运用。同时,检查是否有遗漏的重要点,比如 Sidecar 的更新策略、调试方法等,确保回答的全面性和准确性。</think>--- ### 一、Sidecar 模式核心概念 **Sidecar** 是 Kubernetes 中一种常见的容器设计模式,核心思想是在一个 Pod 中运行一个**辅助容器**(Sidecar Container),为主容器(Main Container)提供额外功能(如日志收集、监控、网络代理等),同时保持主容器的单一职责。 --- ### 、典型应用场景 1. **日志收集** Sidecar 容器读取主容器生成的日志文件,转发到日志系统(如 Elasticsearch、Fluentd)。 2. **服务网格代理** 例如 Istio 的 Envoy 代理,Sidecar 负责流量管理、服务发现和安全性。 3. **配置热更新** Sidecar 监听配置中心变化,动态更新主容器的配置文件。 4. **数据预处理** 主容器生成原始数据,Sidecar 负责压缩、加密或格式转换。 5. **健康检查增强** Sidecar 提供更复杂的健康检查逻辑,补充 Kubernetes 原生探针功能。 --- ### 三、Sidecar 工作原理 #### 1. 共享 Pod 资源 - **共享存储卷(Volume)** Sidecar 与主容器通过挂载同一 Volume 交换数据(如日志文件)。 - **共享网络命名空间** Sidecar 可通过 `localhost` 直接与主容器通信。 - **共享进程命名空间** 允许 Sidecar 查看主容器的进程(需在 Pod 级别设置 `shareProcessNamespace: true`)。 #### 2. 生命周期同步 - **启动顺序** Kubernetes 默认并行启动 Pod 内的所有容器,但可通过 **Init 容器**确保依赖顺序。 - **终止协调** Pod 终止时,所有容器同时收到终止信号,需确保 Sidecar 优雅退出。 --- ### 四、Sidecar 实现示例 #### 案例:日志收集 Sidecar ```yaml apiVersion: v1 kind: Pod metadata: name: log-sidecar-demo spec: volumes: - name: log-volume # 共享存储卷 emptyDir: {} containers: # 主容器:生成日志 - name: main-app image: nginx volumeMounts: - name: log-volume mountPath: /var/log/nginx # 将日志写入共享卷 # Sidecar 容器:处理日志 - name: log-processor image: fluentd volumeMounts: - name: log-volume mountPath: /var/logs # 从共享卷读取日志 command: ["fluentd", "-c", "/etc/fluentd.conf"] ``` --- ### 五、关键注意事项 1. **资源分配** - 合理设置 Sidecar 的 CPU/内存请求(`requests`)和限制(`limits`),避免与主容器资源竞争。 - 示例: ```yaml resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m" ``` 2. **启动顺序控制** - 使用 **Init 容器**确保前置条件就绪(如配置文件下载): ```yaml initContainers: - name: init-config image: busybox command: ['sh', '-c', 'wget -O /config/app.conf http://config-server/app.conf'] volumeMounts: - name: config-volume mountPath: /config ``` 3. **调试与监控** - 通过 `kubectl logs <pod-name> -c <sidecar-container-name>` 查看 Sidecar 日志。 - 监控 Sidecar 的资源使用情况,避免其异常影响主容器。 4. **避免过度复杂化** - 单个 Pod 中不建议部署过多 Sidecar(通常不超过 3 个),否则会增加运维复杂度。 --- ### 六、与 Init 容器的区别 | 特性 | Sidecar 容器 | Init 容器 | |-----------------|-------------------------------|-------------------------------| | **运行阶段** | 与主容器**并行运行** | 在**主容器启动前运行** | | **用途** | 长期提供辅助功能 | 执行一次性初始化任务 | | **生命周期** | 随 Pod 终止而停止 | 执行完成后立即退出 | | **典型场景** | 日志收集、网络代理 | 下载配置文件、数据库迁移 | --- ### 七、最佳实践 1. **职责分离** Sidecar 应仅负责与主业务逻辑无关的辅助功能。 2. **轻量化设计** Sidecar 容器需保持精简,避免引入过多依赖。 3. **版本同步** Sidecar 与主容器应独立更新,但需注意版本兼容性。 4. **服务网格集成** 结合 Istio、Linkerd 等服务网格工具,自动化 Sidecar 注入与管理。 --- 通过 Sidecar 模式,Kubernetes 实现了业务逻辑与基础设施功能的解耦,是云原生架构中**关注点分离**原则的典型实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值