SideCar中文译为边车,是附着在摩托车旁的小型车辆,用于载客。在编程世界中,其主要功能是将主应用与外围辅助服务进行解耦,提供更灵活的应用部署方式。其理念符合设计模式中的单一职责原则,让主应用和辅助服务分离,更专注自身功能。
基于K8S Pod特性,同一个POD可以共享根容器中挂载的Volume。基于该特性,我们可以想到以下SideCar应用方式:
1.日志收集上传
我们可以应用日志挂载到共享的Volume上,业务容器写日志,SideCar容器读日志,并上传日志分析平台,以生产者消费者方式进行解耦。
2.应用Jar包挂载
因为Java应用需要依赖拥有Java运行环境,因此大多使用open-jdk等镜像作为基础镜像。而这类镜像大多上百M。通过共享存储,我们可以利用busybox这类体积只有几M的镜像作为基础镜像,然后将jar包拷贝到共享Volume下。并将这个承载jar的镜像作为InitContainer,主业务容器使用该共享Volume下的jar包启动业务。后续应用版本更新,只需要更新jar包镜像。这个jar包镜像便是一个SideCar。
K8S中同一个POD同时也共享一个IP。基于该特性,我们可以这样使用SideCar模式:
1.容器代理
通过SideCar容器代理应用容器。
2.容器适配
当该容器需要提供给多个已有业务访问,但不同业务数据交互格式不一致时,可以借鉴适配器模式,把SideCar容器作为一个适配器,在不修改原有业务代码的同时对外提供服务。
将InitContainer作为我们的SideCar容器,通过共享存储方式将jar包挂载到主业务容器,主页容器提供java运行环境。
apiVersion: apps/v1 kind: Deployment metadata: name: demo-depl labels: app: demo spec: selector: matchLabels: app: demo replicas: 1 template: metadata: labels: app: demo spec: containers: - name: business-container image: java:8-jdk imagePullPolicy: IfNotPresent command: - java - -Djava.security.egd=file:/dev/./urandom - -Dspring.profiles.active=k8s - -jar - /temp/demo-1.0.0-SNAPSHOT.jar ports: - containerPort: 8062 volumeMounts: - mountPath: /temp name: jar-volume - name: TZ value: Asia/Shanghai initContainers: - image: registry.demo.com/demo:1.0.0 imagePullPolicy: IfNotPresent name: demo-jar command: - cp - /demo-1.0.0-SNAPSHOT.jar - /app/demo-1.0.0-SNAPSHOT.jar volumeMounts: - mountPath: /app name: jar-volume volumes: - emptyDir: {} name: jar-volume 复制代码