K8S平臺基於SideCar模式的Java應用部署方式
阿新 • • 發佈:2019-12-31
SideCar模式介紹
SideCar中文譯為邊車,是附著在摩托車旁的小型車輛,用於載客。在程式設計世界中,其主要功能是將主應用與外圍輔助服務進行解耦,提供更靈活的應用部署方式。其理念符合設計模式中的單一職責原則,讓主應用和輔助服務分離,更專注自身功能。
K8S環境中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容器作為一個介面卡,在不修改原有業務程式碼的同時對外提供服務。
基於SideCar模式的Java應用部署示例
將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
複製程式碼
參考資料
1.CNCF X 阿里巴巴雲原生技術公開課 gitbook.cn/gitchat/col…