模式部署java应用."/>
k8s 以sidecar的模式部署java应用.
k8s部署java应用
- 一般模式
- sidecar 模式
- 总结
一般模式
- 将base 镜像和业务jar直接打包到一个新的镜像中. 类似于
- dockerfile
FROM openjdk:17.0.3-jre-bullseyeENV LANG en_US.UTF-8RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeWORKDIR /appCOPY ./xxx/build/apps/*.jar /app/
- k8s
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: demoname: demonamespace: dev
spec:replicas: 1selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:containers:- image: app:latestname: democommand:- "java"args:- "-XX:MaxRAMPercentage=90.0"- "--add-opens"- "java.base/java.lang=ALL-UNNAMED"- "--add-opens"- "java.base/java.io=ALL-UNNAMED"- "--add-opens"- "java.base/java.lang.invoke=ALL-UNNAMED"- "--add-opens"- "java.base/java.lang.reflect=ALL-UNNAMED"- "--add-opens"- "java.base/java.text=ALL-UNNAMED"- "--add-opens"- "java.desktop/java.awt.font=ALL-UNNAMED"- "--add-opens"- "java.base/java.math=ALL-UNNAMED"- "--add-opens"- "java.base/java=ALL-UNNAMED"- "--add-opens"- "java.base/java.nio=ALL-UNNAMED"- "--add-opens"- "java.base/java.security=ALL-UNNAMED"- "--add-opens"- "java.base/java.text=ALL-UNNAMED"- "--add-opens"- "java.base/java.time=ALL-UNNAMED"- "--add-opens"- "java.base/java.util=ALL-UNNAMED"- "--add-opens"- "java.base/jdk.internal.access=ALL-UNNAMED"- "--add-opens"- "java.base/jdk.internal.misc=ALL-UNNAMED"- "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"- "-jar"- "-Dspring.profiles.active=test"- "-Dserver.port=8080"- "-Duser.timezone=GMT+08"- "-Dfile.encoding=UTF-8"- "demo.jar"livenessProbe:httpGet:path: /actuator/health/livenessport: 8080httpHeaders:- name: Authorizationvalue: 'Basic xxx'initialDelaySeconds: 60timeoutSeconds: 2periodSeconds: 60successThreshold: 1failureThreshold: 10readinessProbe:httpGet:path: /actuator/health/readinessport: 8080httpHeaders:- name: Authorizationvalue: 'Basic xxx'env:- name: LANGvalue: "zh_CN.UTF-8"- name: user.languagevalue: "zh"- name: user.regionvalue: "CN"resources:limits:cpu: 2000mmemory: 2Girequests:cpu: 200mmemory: 256m
sidecar 模式
- 将业务jar和openjdk镜像分开. 使用 initContainers + volumes 方式放到一个volumes中.
- dockfile
FROM busybox:latest
COPY ./xxx/build/apps/demo.jar /tmp
- k8s
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: demoname: demonamespace: test
spec:replicas: 1selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:initContainers:- name: biz-demoimage: app:latestimagePullPolicy: IfNotPresentcommand:- cp- /tmp/demo.jar- /app/demo.jarresources:limits:cpu: '1'memory: 1Girequests:cpu: 200mmemory: 256mvolumeMounts:- mountPath: /appname: jar-volumecontainers:- image: openjdk:17.0.2name: openjdk-demoresources:limits:cpu: 1000mmemory: 1024Mirequests:cpu: 200mmemory: 256mcommand:- "java"args:- "-XX:+UseContainerSupport"- "-XX:InitialRAMPercentage=95.0"- "-XX:MaxRAMPercentage=95.0"- "-XX:+HeapDumpOnOutOfMemoryError"- "-XX:HeapDumpPath=./dump-%t.hprof"- "-XX:+UnlockDiagnosticVMOptions"- "-XX:+UnlockExperimentalVMOptions"- "-XX:-OmitStackTraceInFastThrow"- "-Xlog:gc*=debug:file=./gc-%t.log:utctime,level,tags:filecount=10,filesize=100M"- "-Xlog:jit+compilation=info:file=./jit_compile-%t.log:utctime,level,tags:filecount=10,filesize=10M"- "-Xlog:safepoint=debug:file=./safepoint-%t.log:utctime,level,tags:filecount=10,filesize=10M"- "-XX:+DisableExplicitGC"- "-XX:GuaranteedSafepointInterval=0"- "-XX:+UseCountedLoopSafepoints"- "-XX:StartFlightRecording=disk=true,maxsize=4096m,maxage=3d"- "-XX:FlightRecorderOptions=maxchunksize=128m"- "--add-opens"- "java.base/java.lang=ALL-UNNAMED"- "--add-opens"- "java.base/java.io=ALL-UNNAMED"- "--add-opens"- "java.base/java.lang.invoke=ALL-UNNAMED"- "--add-opens"- "java.base/java.lang.reflect=ALL-UNNAMED"- "--add-opens"- "java.base/java.text=ALL-UNNAMED"- "--add-opens"- "java.desktop/java.awt.font=ALL-UNNAMED"- "--add-opens"- "java.base/java.math=ALL-UNNAMED"- "--add-opens"- "java.base/java=ALL-UNNAMED"- "--add-opens"- "java.base/java.nio=ALL-UNNAMED"- "--add-opens"- "java.base/java.security=ALL-UNNAMED"- "--add-opens"- "java.base/java.text=ALL-UNNAMED"- "--add-opens"- "java.base/java.time=ALL-UNNAMED"- "--add-opens"- "java.base/java.util=ALL-UNNAMED"- "--add-opens"- "java.base/jdk.internal.access=ALL-UNNAMED"- "--add-opens"- "java.base/jdk.internal.misc=ALL-UNNAMED"- "-Dspring.profiles.active=test"- "-Dserver.port=8080"- "-Duser.timezone=GMT+08"- "-Dfile.encoding=UTF-8"- "-Djava.security.egd=file:/dev/./urandom"- "-Dnetworkaddress.cache.ttl=10"- "-jar"- "/app/demo.jar"livenessProbe:httpGet:path: /actuator/health/livenessport: 8080httpHeaders:- name: Authorizationvalue: 'Basic xxx'initialDelaySeconds: 60timeoutSeconds: 2periodSeconds: 60successThreshold: 1failureThreshold: 10readinessProbe:httpGet:path: /actuator/health/readinessport: 8080httpHeaders:- name: Authorizationvalue: 'Basic xxx'env:- name: LANGvalue: "zh_CN.UTF-8"- name: user.languagevalue: "zh"- name: user.regionvalue: "CN"volumeMounts:- mountPath: /appname: jar-volumevolumes:- name: jar-volumeemptyDir: { }
总结
- 一般模式的镜像打包出来比较大. 且无法重用. 打包速度慢
- sidecar 模式. 基础镜像一般是不变的. 所有pod都可以用同一个镜像. 只有业务jar是变化的. 可以减少镜像的大小. 利于发布, 打包速度快
更多推荐
k8s 以sidecar的模式部署java应用.
发布评论