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 # 回滚到指定版本

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值