K8S部署springboot项目
K8S部署springboot项目
·
1.创建springboot项目运行的ns=project
kubectl create ns project
2.配置拉取镜像的秘钥(若镜像存储在私有库,我选择的阿里云的镜像仓库,也可以自行搭建其他,如harbor)
kubectl create secret docker-registry dockerhub --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=XXX --docker-password=XXX --namespace=project
3.Dockerfile编写
- skywalking
如果你的项目需要集成skywalking,需要进行挂载操作,无则不需要此操作
FROM busybox:latest
COPY skywalking-agent/ /skywalking/agent/
WORKDIR /
- business-xxx
FROM openjdk:8-jdk-alpine
COPY ROOT.war /ROOT.war
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","-XX:+UseG1GC","-XX:MaxGCPauseMillis=200","-Xms256m","-Xmx512m","-Dfile.encoding=utf-8","-javaagent:/opt/agent/skywalking-agent.jar","-Dskywalking.agent.service_name=business-xxx","-Dskywalking.collector.backend_service=192.168.255.128:11800","/ROOT.war","--spring.cloud.nacos.discovery.server-addr=192.168.4.43:8848","--spring.cloud.nacos.discovery.group=DEFAULT_GROUP","--spring.profiles.active=dev"]
4.镜像上传阿里云镜像仓库
- 构建镜像:docker build -t business-xxx .
- tag:docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/XXX/dev:[镜像版本号]
- docker login --username=xxx --password=xxxxxx registry.cn-hangzhou.aliyuncs.com
- docker push registry.cn-hangzhou.aliyuncs.com/XXX/dev:[镜像版本号]
推送成功后可以在控制台看到镜像
5.创建发布脚本:business-xxx.yml文件
apiVersion: v1
kind: Service
metadata:
name: business-xxx
namespace: project
labels:
app: business-xxx
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30020 #service对外开放端口
selector:
app: business-xxx
---
apiVersion: apps/v1
kind: Deployment #对象类型
metadata:
name: business-xxx#名称
labels:
app: business-xxx#标注
spec:
replicas: 1
strategy:
rollingUpdate:
maxSurge: 1 # 在期望副本数基础上,最多允许超出的pod实例数量,允许设置绝对值和百分比
maxUnavailable: 50% # 相对于期望副本数,允许有多少pod实例处于不可用状态,允许设置绝对值和百分比
type: RollingUpdate
selector:
matchLabels:
app: business-xxx
template:
metadata:
labels:
app: business-xxx
spec:
imagePullSecrets:
- name: dockerhub
initContainers:
- name: skywalking-agent
image: registry.cn-hangzhou.aliyuncs.com/xxx/dev:skywalking-agent
command: ['cp','-rf','/skywalking/agent','/tmp']
volumeMounts:
- mountPath: /tmp
name: sw-agent-volume
containers: #docker容器的配置
- name: business-xxx
image: ${appImage}
imagePullPolicy: Always
env:
- name: TZ
value: Asia/Shanghai
volumeMounts:
- mountPath: /opt
name: sw-agent-volume
- mountPath: /data/logs/business-xxx
name: app-log
ports:
- containerPort: 8080 #容器对外开放端口
readinessProbe:
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 20
httpGet:
scheme: HTTP
port: 8080
path: /system/resources/heart.txt
resources:
requests:
memory: 512Mi
limits:
memory: 1024Mi
volumes:
- name: sw-agent-volume
emptyDir: {}
- name: app-log
hostPath:
path: /data/logs/business-xxx
6.一键发布shell脚本
#!/bin/bash
# git pull
# mvn package
# cp jar 当前目录
if [[ "$(docker images -q business-xxx:latest 2> /dev/null)" != "" ]]; then
echo '--------------------开始清理历史镜像--------------------'
imageIds=$(docker images|grep business-xxx|awk '{print $3}')
array=($imageIds)
imageId=${array[0]}
docker rmi -f $imageId
echo '--------------------完成清理历史镜像--------------------'
fi
time=$(date "+%Y%m%d%H%M%S")
echo '--------------------构建新镜像开始--------------------'
docker build -t business-xxx .
imageId=$(docker images|grep business-xxx|awk '{print $3}')
echo '--------------------构建新镜像完成--------------------'
echo ${imageId}
docker tag ${imageId} registry.cn-hangzhou.aliyuncs.com/xxx/dev:business-xxx-${time}
docker login --username=hui253753547 --password=xxxxxx registry.cn-hangzhou.aliyuncs.com
if [ $? -eq 0 ]; then
echo "--------------------docker login success--------------------"
else
echo "--------------------docker login failed--------------------"
exit 1
fi
docker push registry.cn-hangzhou.aliyuncs.com/xxx/dev:business-xxx-${time}
if [ $? -eq 0 ]; then
echo "--------------------docker push image success--------------------"
else
echo "--------------------docker push image failed--------------------"
exit 1
fi
cp business-xxx.yml business-xxx.yml.tmp
sed -i s/'${appImage}'/'registry.cn-hangzhou.aliyuncs.com\/xxx\/dev:business-xxx-'${time}/g business-xxx.yml.tmp
kubectl apply -f business-xxx.yml.tmp --record
echo "--------------------发布完成--------------------"
rm -rf business-xxx.yml.tmp
rs=$(kubectl get all | grep replicaset.apps | grep "0 0 0" | cut -d' ' -f 1)
if [ "$rs" != "" ]
then
kubectl delete $rs
fi
7.发布
./deploy.sh
8.其他常用
启动pod kubectl create -f business-xxx.yml
删除pod kubectl delete -f business-xxx.yml
回滚:
kubectl rollout history deployment my-deployment # 可以查看my-deployment的滚动升级历史
kubectl rollout undo deployment my-deployment --to-revision=1 # 回滚到指定版本
更多推荐
已为社区贡献1条内容
所有评论(0)