原来单独部署的程序如果想要上云需要考虑的3个地方,
1.原来放在本地的配置文件如何放入获取
2.程序如何将程序部署到容器中
3.如何将程序部署到k8s中
为了解决如下问题以部署road-tet为例,详细步骤如下:
首先需要创建一个项目

配置文件复制到配置中心
创建配置文件



项目文件夹下添加dockerfile文件
然后打开项目找到road-tet在项目中添加dockerfile文件文件模板为
1 2 3 4 5 6 7
| FROM openjdk:8-jre MAINTAINER road
COPY ./target/road-tet.jar /app.jar RUN echo 'Asia/Shanghai' >/etc/timezone ENTRYPOINT java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $SPRING_CONFIG EXPOSE 6078
|
项目文件夹下添加deployment脚本
在road-tet中添加文件夹deploy.dev 添加yaml文件deploy.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| kind: Deployment apiVersion: apps/v1 metadata: name: road-tet namespace: road-cloud labels: app: road-tet annotations: deployment.kubernetes.io/revision: '1' kubesphere.io/alias-name: 商户对接模块 kubesphere.io/creator: admin spec: replicas: 1 selector: matchLabels: app: road-tet template: metadata: creationTimestamp: null labels: app: road-tet annotations: logging.kubesphere.io/logsidecar-config: '{}' spec: volumes: - name: host-time hostPath: path: /etc/localtime type: '' - name: volume-821lvl configMap: name: road-cloud-dev-config items: - key: road-tet path: application.yml defaultMode: 420 containers: - name: container-45dxej image: '$REGISTRY/$DOCKERHUB_NAMESPACE/road-tet:SNAPSHOT-$BUILD_NUMBER' ports: - name: tcp-6078 containerPort: 6078 protocol: TCP env: - name: JAVA_OPTS valueFrom: configMapKeyRef: name: road-evn key: JAVA_OPTS - name: SPRING_CONFIG valueFrom: configMapKeyRef: name: road-evn key: SPRING_CONFIG resources: {} volumeMounts: - name: host-time readOnly: true mountPath: /etc/localtime - name: volume-821lvl readOnly: true mountPath: /config/application.yml subPath: application.yml terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent restartPolicy: Always terminationGracePeriodSeconds: 30 dnsPolicy: ClusterFirst serviceAccountName: default serviceAccount: default securityContext: {} imagePullSecrets: - name: road-cloud-harbor schedulerName: default-scheduler strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% revisionHistoryLimit: 10 progressDeadlineSeconds: 600
## 创建service --- apiVersion: v1 kind: Service metadata: namespace: road-cloud labels: app: road-tet name: road-tet spec: sessionAffinity: None selector: app: road-tet ports: - name: http-k-tet protocol: TCP targetPort: 6078 port: 6078
|
添加devpos脚本实现自动部署
打开devops项目因为和k平台是同线项目,所以我们将部署在同一个devops项目下



这里需要注意:如果maven的配置文件需要特殊配置 需要在road-cloud下新建文件夹configuration然后新建配置文件settings.xml,
编写Jenkinsfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| pipeline { agent { node { label 'maven' }
} stages { stage('代码拉取') { post { success { echo '代码拉取成功!' }
} steps { container('maven') { checkout([$class: 'GitSCM', branches: [[name: "${BRANCH_TAG}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'koalas-code', url: "http://git.tetpark.com/tingeting/road-cloud.git"]]]) sh "ls" } } }
stage('Maven编译代码') { agent none post { success { echo '编译代码成功!' }
} steps { container('maven') { sh 'mvn -Dmaven.test.skip=true -gs `pwd`/configuration/settings.xml clean package' sh "ls" }
} }
stage('构建镜像,推送') { steps { container('maven') { withCredentials([usernamePassword(passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) { sh 'echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin' } script { sh "ls" services_str = "${SERVICES}" def services = services_str.split("\n") for (int i = 0; i < services.size(); ++i){ service_name = services[i].replaceAll("\"", "") echo "选择的服务:${service_name}" //基础镜像构建 sh "docker build -t $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:SNAPSHOT-$BUILD_NUMBER ${service_name}" // 镜像标签 sh "docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:SNAPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:${BRANCH_TAG}" // 上传镜像 sh "docker push $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:SNAPSHOT-$BUILD_NUMBER" } //删除悬虚镜像 sh "docker image prune -a -f" // 登出私有仓库 sh "docker logout $REGISTRY" }
}
} }
stage('发布到测试环境') { agent none steps { container('maven') { sh 'kubectl version --short --client' withCredentials([kubeconfigFile(credentialsId: "$KUBECONFIG_CREDENTIAL_ID", variable: 'KUBECONFIG')]) { script { sh "ls" services_str = "${SERVICES}" def services = services_str.split("\n") for (int i = 0; i < services.size(); ++i){ service_name = services[i].replaceAll("\"", "") echo "选择的服务:${service_name}" sh "envsubst < ${service_name}/deploy/dev/deploy.yaml | kubectl apply -f -" } } } } } } } environment { DOCKER_CREDENTIAL_ID = 'harbor' GITHUB_CREDENTIAL_ID = 'koalas-code' KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig' REGISTRY = '192.168.1.121:8098' DOCKERHUB_NAMESPACE = 'road-cloud' } }
|
测试项目是否正常运行
发布完成后打开road-cloud项目打开应用负载——工作负载

项目启动成功