进学阁

业精于勤荒于嬉,行成于思毁于随

0%

原单独部署的应用上云部署(十)

原来单独部署的程序如果想要上云需要考虑的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项目打开应用负载——工作负载

项目启动成功