在kubeSphere中部署码云(Gitee)项目
项目地址:
https://gitee.com/nichunjun/spring-parent.git
本项目是一个父项目下面有两个module,假设两个module分别有两个不同功能(代码中实际上没有不同)
实现目标:
将这两个module部署在本地k8s中,并正常运行
流程说明
-
在k8s中安装nacos和mysql, 然后将nacos自带的数据库sql部署到mysql的nacos数据库;
-
在mysql中创建user-service数据库,并创建表user_info,字段为id,name,idcard;
-
在nacos配置两个配置项,如下图是api-service的,再增加一个user-service的,applicationname改为user-service,端口改为8081即可;
-
将代码拷贝到自己的码云中并上传,然后自行修改需要的内容;
-
在子项目中分别增加Dockerfile和部署文件;
-
kubesphere中安装harbor;
-
配置流水线,编写jenkinsfile;
-
查看效果;
-
手动部署镜像.
上面的前三步骤应该在上篇文章中说明完了,现在从第四步开始说明
以下内容都是都要在两个moduleapi-service和user-service中共同进行的
拷贝代码
将上面提到过的git路径,克隆到自己的码云中
然后克隆到本地进行修改
需要根据自己的需要修改两个module中的配置文件中nacos地址
编写部署文件
Dockerfile文件
首先在目录下编写Dockerfile文件,这个文件用途是将打包完的jar生成镜像时使用
意思是使用指定的jdk镜像,然后运行复制到指定位置的jar
devops文件
这个文件的用途是在部署到k8s集群中的一些配置,包括端口,探针等
devops-sample.yaml
文件
apiVersion: apps/v1
kind: Deployment # -> 这个类别意味着部署
metadata:
labels:
app: kubesphere
component: $API_APP_NAME # 这个是在kubesphere中配置的变量 -> api-service
tier: backend
annotations:
deployment.kubernetes.io/revision: '1'
kubesphere.io/creator: admin
#工作负载的名称
name: $API_APP_NAME
#kubesphere中项目的名字,需要在kubesphere中你的企业空间中新建这个项目,且在
#jenkin中最好也新建这个项目, jenkins地址: 你的虚拟机IP:30180
namespace: $KS_SPACE # 这个是在kubesphere中配置的变量 -> dev
spec:
progressDeadlineSeconds: 600
replicas: 1
selector:
matchLabels:
app: kubesphere
component: $API_APP_NAME
tier: backend
template:
metadata:
labels:
app: kubesphere
component: $API_APP_NAME
tier: backend
spec:
containers:
- env:
- name: CACHE_IGNORE
value: js|html
- name: CACHE_PUBLIC_EXPIRATION
value: 3d
image: $REGISTRY/$KS_SPACE/$API_APP_NAME:SNAPSHOT-$BUILD_NUMBER
readinessProbe: #就绪探针
httpGet:
path: /user/queryUser # 记住,探针访问的地址必须有效,不能404
port: 8080
initialDelaySeconds: 100 # 容器启动后多久开始探测
timeoutSeconds: 10 # 表示容器必须在2s内做出相应反馈给probe,否则视为探测失败
periodSeconds: 60 # 探测周期,每30s探测一次
successThreshold: 1 # 连续探测1次成功表示成功
failureThreshold: 5 # 连续探测3次失败表示失败
livenessProbe: #存活探针
httpGet:
scheme: HTTP
path: /user/queryUser
port: 8080
initialDelaySeconds: 200 # 容器启动后多久开始探测
timeoutSeconds: 10 # 表示容器必须在2s内做出相应反馈给probe,否则视为探测失败
periodSeconds: 120 # 探测周期,每30s探测一次
successThreshold: 1 # 连续探测1次成功表示成功
failureThreshold: 5 # 连续探测3次失败表示失败
imagePullPolicy: Always
name: $API_APP_NAME
ports:
#jar包的端口,另一个user-service是8081
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 300m
memory: 600Mi
requests:
cpu: 100m
memory: 100Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
devops-sample-svc.yaml
文件
apiVersion: v1
kind: Service # -> 这个类别意味着运行
metadata:
labels:
app: kubesphere
component: $API_APP_NAME
name: $API_APP_NAME
namespace: $KS_SPACE
spec:
ports:
- name: http-8080
protocol: TCP
port: 8080 #端口,另一个是8081
targetPort: 8080
nodePort: 30080 #这个是部署完之后外部访问的30080
selector:
app: kubesphere
component: $API_APP_NAME
tier: backend
sessionAffinity: None
type: NodePort #访问方式
安装Harbor
为什么要安装harbor?
harbor是一个镜像仓库,用于存储和分发镜像用的dockerhub,使用它可以随时的存储和下拉镜像,我们创建镜像存储到这里,然后再下拉到我们的工作负载中运行.
安装方式很简单,在应用商店中可以直接进行安装.官方文档
安装之后的账号密码在官方文档里有说明,自己看下就可以
查看harbor效果,这个是我已经推送过的镜像了,
配置流水线
先附图一下我本地kubesphere的内容
local空间中
点击Devops项目
创建一个部署项目
创建kubeconfig
凭证和自己的码云凭证
,harbor凭证
,如下图(需要注意kubeconfig类型)
创建流水线
只填写流水线名称,描述即可,如service,其他的都先不要选择,不然没有图形化编辑页面
复制下面的代码
pipeline {
agent {
node {
label 'maven'
}
}
stages {
stage('拉取代码') {
agent none
steps {
git(url: 'https://gitee.com/nichunjun/spring-parent.git', credentialsId: 'gitee', branch: 'master', changelog: true, poll: false)
sh 'ls -l'
}
}
stage('项目编译') {
agent none
steps {
container('maven') {
sh 'mvn clean package -Dmaven.test.skip=true'
}
sh 'ls -al'
}
}
stage('default-2') {
parallel {
stage('构建user镜像') {
agent none
steps {
container('maven') {
sh 'ls -l user-service'
sh 'ls -l user-service/target'
sh '''docker build -t $REGISTRY/$KS_SPACE/$USER_APP_NAME:SNAPSHOT-$BUILD_NUMBER -f $USER_APP_NAME/Dockerfile-online .
'''
withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
sh '''echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin
'''
sh 'docker push $REGISTRY/$KS_SPACE/$USER_APP_NAME:SNAPSHOT-$BUILD_NUMBER'
}
}
}
}
stage('构建api镜像') {
agent none
steps {
container('maven') {
sh 'ls -l api-service'
sh 'ls -l api-service/target'
sh 'docker build -t $REGISTRY/$KS_SPACE/$API_APP_NAME:SNAPSHOT-$BUILD_NUMBER -f $API_APP_NAME/Dockerfile-online .'
withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
sh '''echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin
'''
sh 'docker push $REGISTRY/$KS_SPACE/$API_APP_NAME:SNAPSHOT-$BUILD_NUMBER'
}
}
}
}
}
}
stage('default-3') {
parallel {
stage('保存user制品') {
agent none
steps {
archiveArtifacts 'user-service/target/*.jar'
}
}
stage('保存api制品') {
agent none
steps {
archiveArtifacts 'api-service/target/*.jar'
}
}
}
}
stage('default-4') {
parallel {
stage('部署dev') {
agent none
steps {
container('maven') {
withCredentials([kubeconfigContent(credentialsId : 'kubeconfig' ,variable : 'KUBECONFIG_CONFIG' ,)]) {
sh 'mkdir -p ~/.kube/'
sh 'echo "$KUBECONFIG_CONFIG" > ~/.kube/config'
sh 'envsubst < $USER_APP_NAME/devops-sample.yaml | kubectl apply -f -'
sh 'envsubst < $USER_APP_NAME/devops-sample-svc.yaml | kubectl apply -f -'
}
}
}
}
stage('部署dev2') {
agent none
steps {
container('maven') {
withCredentials([kubeconfigContent(credentialsId : 'kubeconfig' ,variable : 'KUBECONFIG_CONFIG' ,)]) {
sh 'mkdir -p ~/.kube/'
sh 'echo "$KUBECONFIG_CONFIG" > ~/.kube/config'
sh 'envsubst < $API_APP_NAME/devops-sample.yaml | kubectl apply -f -'
sh 'envsubst < $API_APP_NAME/devops-sample-svc.yaml | kubectl apply -f -'
}
}
}
}
}
}
}
environment {
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
GITHUB_CREDENTIAL_ID = 'github-id'
GITEE_CREDENTIAL_ID = 'gitee'
KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
REGISTRY = '192.168.57.99:30002'
DOCKERHUB_NAMESPACE = 'localproject'
GITHUB_ACCOUNT = 'ncj'
USER_APP_NAME = 'user-service'
API_APP_NAME = 'api-service'
KS_SPACE = 'dev'
}
}
需要有如下的一些修改
分别是自己的码云地址和自己的码云凭据
自己的harbor凭据,下面还有一个
保存后查看图形化界面,这里同时并行构建和部署两个子module
然后运行,可以查看运行记录,哪一步有错看那步
成功了就可以看到有新建的两个工作负载正在启动
手动部署镜像
获取镜像
根据jenkins的镜像地址获取镜像
在我这里就是
192.168.57.99:30002/dev/user-service:SNAPSHOT-5
最后面这个5是你的运行次数,运行了几次,最新的就是几
创建工作负载
名字随便,下一步添加镜像地址
配置端口和探针
然后同步主机时区
然后一直下一步,保存
可以看到
配置外网端口映射
服务->创建->指定工作负载(和创建nacos映射方法相同,在上一篇文章中有提到)
查看nacos效果