侧边栏壁纸
博主头像
MDZZW博主等级

曾经也是帅哥,如今只是肉多

  • 累计撰写 28 篇文章
  • 累计创建 26 个标签
  • 累计收到 7 条评论

青云自动化部署

MDZZW
2023-01-04 / 0 评论 / 2 点赞 / 954 阅读 / 1,152 字
温馨提示:
本文最后更新于 2023-01-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

DevOps 项目创建

image-1672818906453
image-1672814516929
image-1672814652029

这里的代码仓库不选
image-1672814796138

默认选项勾选
image-1672814838334
image-1672815040119

image-1672815406911

参考JenkinsFile如下:
pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('拉取代码') {
      agent none
      steps {
        container('maven') {
          git(url: '代码仓库克隆地址', credentialsId: '自己创建代码仓库凭证名称', branch: '分支', changelog: true, poll: false)
        }

      }
    }

    stage('编译打包') {
      agent none
      steps {
        container('maven') {
          sh 'mvn clean compile install -Dmaven.test.skip=true'
        }

      }
    }

    stage('构建和推送镜像') {
      agent none
      steps {
        container('maven') {
          sh '''ls -al 
pwd

docker build -f ./deploy/uat/Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$BUILD_NUMBER .'''
          withCredentials([usernamePassword(credentialsId : '自己创建harbor凭证名称' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
            sh '''echo "$REGISTRY"

echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin'''
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$BUILD_NUMBER'
          }

        }

      }
    }

    stage('部署应用') {
      agent none
      steps {
        container('maven') {
          withCredentials([kubeconfigContent(credentialsId : '自己创建kubeconfig凭证名称' ,variable : 'KUBECONFIG_CONTENT' ,)]) {
            sh '''ls -al
pwd
mkdir ~/.kube
echo "$KUBECONFIG_CONTENT" > ~/.kube/config
envsubst < deploy/uat/app-namespace.yaml | kubectl apply -f -
envsubst < deploy/uat/app-svc.yaml | kubectl apply -f -
envsubst < deploy/uat/app-deployment.yaml | kubectl apply -f -'''
          }

        }

      }
    }

  }
}

凭证需要编辑流水线单独创建
label ‘maven’ 运维创建的maven容器名字要对应

app-namespace.yaml app-svc.yaml app-deployment.yaml Dockerfile 这四个文件要在项目src 源码目录同级 创建deploy/uat/目录 并且上传到代码仓库

Dockerfile 参考
FROM 镜像名
MAINTAINER  zhiwen.zeng@zhixunchelian.cn

# 这里替换的两个文件一个是解决tomcat8-9版本 递归加载jar导致的服务启动报错bug 另一个是 加入了JVM启动参数和 JVM环境变量

#定义替换的文件路径
ENV WORK_PATH /usr/local/tomcat/bin
ENV WORK_CONF_PATH /usr/local/tomcat/conf
#定义替换的文件名
ENV CATALINA_NAME catalina.sh
ENV CATALINA_PROPERTIES_NAME catalina.properties

#设置日志文件可读
ENV UMASK 022

# 修改时区:Asia/Shanghai
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone

RUN rm $WORK_PATH/$CATALINA_NAME
RUN rm $WORK_CONF_PATH/$CATALINA_PROPERTIES_NAME

COPY  ./deploy/uat/$CATALINA_NAME $WORK_PATH/
COPY  ./deploy/uat/$CATALINA_PROPERTIES_NAME $WORK_CONF_PATH/

RUN chmod 777 $WORK_PATH/$CATALINA_NAME
RUN chmod 777 $WORK_CONF_PATH/$CATALINA_PROPERTIES_NAME

#将编译的war包放入tomcat中
COPY ./target/demo.war /usr/local/tomcat/webapps/
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

app-svc.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: 项目名-环境名
  name: 项目名-app-service
spec:
  selector:
    app: 项目名-app
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 8080
  type: NodePort
  sessionAffinity: ClientIP
app-namespace.yaml 参考
apiVersion: v1
kind: Namespace
metadata:
  name: 项目名-环境名
app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: 项目名-项目描述app
  namespace: 项目名-环境名
  labels:
    app: 项目名-项目描述app
    tier: frontend
    env: 环境名
spec:
  replicas: 1
  minReadySeconds: 30
  selector:
    matchLabels:
      app: 项目名-项目描述app
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
      - {key: env, operator: In, values: [环境名]}
  strategy:
    type: Recreate
  template:
    metadata:
      name: 项目名-项目描述app
      labels:
        app: 项目名-项目描述app
        tier: frontend
        env: 环境名
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - 项目名-项目描述app
              topologyKey: "kubernetes.io/hostname"
      containers:
        - name: 项目名-项目描述app
		 
		  #这里的镜像用流水线创建的环境变量名   BUILD_NUMBER是平台构建的一个入参  自动传入
          image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$BUILD_NUMBER
          imagePullPolicy: IfNotPresent
            # securityContext:
          # readOnlyRootFilesystem: true
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: 项目名-项目描述app-logs
              mountPath: /app/logs           # 项目配置的日志目录
          resources:
            requests:
              cpu: "500m"
              memory: "4096Mi"
            limits:
              cpu: "3000m"
              memory: "4096Mi"
      imagePullSecrets:
        - name: myregistrykey
      volumes:
        - name: 项目名-项目描述app-logs
          hostPath:
            path: /app/项目名/uat/app/logs   # 日志挂载路径
      restartPolicy: Always
创建凭证

image-1672817345410

创建完成运行流水线

image-1672817464186

目前遇上的构建错误解决

  • 镜像拉取失败
    错误原因: harbor仓库的项目 创建的时候勾选了私有化 k8s里面没有配置认证 把公开勾选取消就可以解决了
  • “STDIN” : namespaces "XXX"is forbidten: User “zzw"cannat get resource “hanespaces” in API group “” in the namespace"demo-uat”
    错误原因: 当前账户zzw存在权限问题 部署应用凭证那里需要运维加权限或者由运维去创建
  • pom依赖无法下载
    需要把无法下载的pom jar 传入Nexus 再由运维配置maven仓库地址

项目创建

名称要和namespace.yaml 里面的名称一致 用于项目各种指标和配置查看
image-1672818356100
如果流水线运行成功 这里创建一个项目能自动匹配里面的容器和服务
image-1672818263984

日志查看

右下角有个锤子按钮点击查看
image-1672818488155
image-1672819190868

2

评论区