一、迁移思路:
1、构建镜像;
1.准备基础镜像;
2.代码执行maven编译; jar包; (jenkins来完成;)
3.docker编译动作;(启停脚本;设定参数;)
4、构建;
5、通过kubernetes调度起来;
Deployment+service+ingress; configmap.secret、pvc、pv;
二、本地交付springboot步骤:
安装java1.8 、 maven3.8(略)
wget https://linux.oldxu.net/springboot-helloworld-jar.tar.gz
tar xf springboot-helloworld-jar.tar.gz
#编译 & 运行
cd springboot-helloworld/
mvn clean package
java -jar -Xms100m -Xmx200m target/demo-service-1.0.jar
#访问站点
192.168.79.34:8080
三、springboot迁移至k8s
3.1 编写Dockerfile & entrypoint.sh & 构建/上传/docker运行
全路径:/root/k8sFile/project/springbootDemo/springboot-helloworld
#Dockerfile
FROM openjdk:8-jre-alpine
COPY target/*.jar /demo-service.jar
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 8080
ENTRYPOINT ["/bin/sh","-c","/entrypoint.sh"]
#entrypoint.sh
JAVA_OPTS="-Xms${XMS_OPTS:-200m} -Xmx${XMX_OPTS:-200m}"
SKY_OPTS="" #链路追踪参数
MONITOR_OPTS="" #prometheus参数
SENTINEL_OPTS="" #限流参数
java -jar ${JAVA_OPTS} /demo-service.jar
#构建镜像 & 上传
docker login harbor.oldxu.net
docker build -t harbor.oldxu.net/base/spring:v1.0 .
docker push harbor.oldxu.net/base/spring:v1.0
docker pull harbor.oldxu.net/base/spring:v1.0
#docker运行测试
docker run -itd -P --name spring1 harbor.oldxu.net/base/spring:v1.0
#传参:
#错误写法:XMX_OPTS="-Xms100m -Xmx100m"
#docker run -itd -P -e XMX_OPTS="-Xms100m -Xmx100m" --name spring2 harbor.oldxu.net/base/spring:v1.0
docker run -itd -P -e JAVA_OPTS="-Xms100m -Xmx100m" --name spring2 harbor.oldxu.net/base/spring:v1.0
3.2 编写yaml(dp 、svc 、 ingress)
docker login harbor.oldxu.net
kubectl create secret docker-registry harbor-login --docker-server=xx.xx.net \
--docker-username=xx--docker-password=xx
dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot
spec:
replicas: 3
selector:
matchLabels:
app: spring
template:
metadata:
labels:
app: spring
spec:
imagePullSecrets:
- name: harbor-login
containers:
- name: springboot
image: harbor.oldxu.net/base/spring:v1.0
ports:
- name: http
containerPort: 8080
env: #传递初始堆内存和最大堆内存占用
- name: XMS_OPTS
valueFrom:
resourceFieldRef:
resource: requests.memory
- name: XMX_OPTS
valueFrom:
resourceFieldRef:
resource: limits.memory
resources:
requests:
memory: 150Mi
limits:
memory: 300Mi
readinessProbe: #就绪探针;如果端口不存活,则从负载均衡中移除
tcpSocket:
port: http #http是一个名字;它会获取这个名字对应的端口;
initialDelaySeconds: 10
failureThreshold: 3
livenessProbe: # 存活探针;获取url,状态码不对那么则触发重启操作
httpGet:
path: /
port: http
initialDelaySeconds: 10
failureThreshold: 3
svc.yaml
apiVersion: v1
kind: Service
metadata:
name: spring-svc
spec:
selector:
app: spring
ports:
- port: 8080
targetPort: 8080
ingress.yaml
由于用的是k8s v1.18.0,ingress旧版本写法。 井号注释的是新版ingress写法。
#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: springboot-ingress
spec:
ingressClassName: "nginx"
rules:
- host: "springboot.oldxu.net"
http:
paths:
- path: /
#pathType: prefix
backend:
serviceName: spring-svc
servicePort: 8080
#service:
#name: spring-svc
#port:
# number: 8080
访问
其他
#test.sh
JAVA_OPTS="-Xms${XMS_OPTS:-200m} -Xmx${XMX_OPTS:-200m}"
#java -jar $JAVA_OPTS /demo-service.jar
echo -e "值: $JAVA_OPTS"
传参改变值:
XMS_OPTS=512m XMX_OPTS=1024m ./test.sh
#查看实际跑的java项目的-Xms -Xmx是什么值
[root@node4 ~]# docker exec -it 43bf045df8ab ps
PID USER TIME COMMAND
1 root 0:00 {busybox} ash /entrypoint.sh
7 root 0:15 java -jar -Xms200m -Xmx200m /demo-service.jar
40 root 0:00 sh
47 root 0:00 ps