一、首先需要搭建好k8s集群以及在k8s集群中部署好Jenkins,這里就不做詳細介紹如何搭建k8s集群和在k8s集群中部署Jenkins,(具體過程可以參考之前文章進行部署)
1、這里我使用公有GitHub作為代碼倉庫,首先需要將GitHub代碼倉庫以及harbor鏡像倉庫賬戶和密碼在Jenkins添加上;(我這里是之前已經添加上了,如果沒有點擊憑據進行添加即可)
、
2、我們需要將代碼上傳到代碼倉庫,這里我使用rocketMQ-console為例,
1.我們先將源碼克隆本地:
git clone https://github.com/apache/rocketmq-externals.git
2.進入源碼目錄
[root@k8s-master]# cd /usr/local/src/rocketmq-externals
[root@k8s-master rocketmq-externals]# ll -a
里面有一個.git隱藏文件:
3.進入.git文件編輯config配置文件:vim config
4.將源碼上傳到你自己GitHub倉庫中;
git remote add origin https://github.com/houyi199208/rocketmq-console.git
git push -u origin master 這里master是分支
git push origin --tag 或者打tag號
執行完成后登陸自己代碼倉庫查看是否上有相關源碼
3、上面工作做好后我們接下在Jenkins上面創建第一個Java項目流水線
注意:
如果沒有參數化構建選項,需要安裝插件:
安裝pipeline參數化構建插件
Jenkins中-->系統管理--->管理插件--->可選插件--->搜索extended choice parameter---->點擊直接安裝
4、編輯pipeline腳本
node("slave") { env.registry="192.168.111.161" //harbor地址 env.image="${registry}/${MODULE}/${APP_NAME}:${TAG}" //生成的鏡像名稱 if ( Operation == 'Deploy' ) { stage('Get code'){ checkout([$class: 'GitSCM', branches: [[name: "${TAG}"]], doGenerateSubAPP_NAMEConfigurations: false, userRemoteConfigs: [[credentialsId: 'github', url: ' https://github.com/houyi199208/rocketmq-console.git']]]) //根據TAG號拉取代碼 } stage('Build code') { sh "pwd" sh "mvn clean package -Dmaven.test.skip=true -f rocketmq-console/pom.xml" //編譯代碼 sh ''' cat >Dockerfile<<EOF FROM openjdk:8u232 RUN echo "ZONE=Asia/Shanghai" >/etc/timezone COPY rocketmq-console/target/${APP_NAME}-ng-1.0.0.jar /opt/app/${MODULE}/${APP_NAME}/ WORKDIR /opt/app/${MODULE}/${APP_NAME}/ ENTRYPOINT ["java","-jar","${APP_NAME}-ng-1.0.0.jar"] ''' //制作Dockerfile } stage('mk image & push image'){ withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'harborpasswd', usernameVariable: 'harboruser')]) { sh "docker login ${env.registry} -u ${harboruser} -p ${harborpasswd}" sh "docker build -t ${registry}/${MODULE}/${APP_NAME}:${TAG} -f ./Dockerfile . && docker push ${registry}/${MODULE}/${APP_NAME}:${TAG}" } } stage('Deploy'){ sh "sed -e 's/APP_NAME/${APP_NAME}/g' -e 's/MODULE/${MODULE}/g' -e 's%IMAGE%${env.image}%g' -e 's/PORT/${PORT}/g' ../k8s/deploy-template.yml >../k8s/${MODULE}/${APP_NAME}-deploy.yml " //根據選項參數的值對部署文件進行替換 get_ns = sh returnStatus: true, script: "kubectl get ns ${MODULE}" echo "${get_ns}" if ( get_ns != 0 ){ sh "kubectl create ns ${MODULE}" } sh "kubectl apply -f ../k8s/${MODULE}/${APP_NAME}-deploy.yml --record=true" } }else if ( Operation == 'Rollback' ) { stage('Rollback Previous Version'){ sh "kubectl describe deployment ${APP_NAME} -n mq-console |grep -w 'Image:'" sh "kubectl rollout undo deployment ${APP_NAME} -n ${MODULE} " sh "kubectl describe deployment ${APP_NAME} -n mq-console |grep -w 'Image:'" } } }
5、后續准備工作
找到jenkins-slave的workspace目錄,目錄和文件是和pipeline配套的
[root@master workspace]# pwd
/data/jenkins-slave/workspace
[root@master workspace]# mkdir k8s && cd k8s
[root@master k8s]# mkdir mq-console #創建項目部署文件保存目錄
[root@master k8s]# ls #deploy-template.yml是通用模板,修改后部署對應的項目
deploy-template.yml mq-console
[root@master k8s]# chmod o+w -R ./ #jenkins-slave默認用戶是Jenkins,沒有權限操作,后續創建的其他項目也需要關注權限問題,這個版本先用o+w解決
查看節點標簽
[root@master k8s]# kubectl get node --show-labels
給調度的節點打標簽
[root@master k8s]# kubectl label nodes node01 app=mq-console
6、模板文件(這里面所有的變量都是使用Jenkins上面定義的參數)
[root@master k8s]# cat deploy-template.yml
apiVersion: apps/v1 kind: Deployment metadata: name: APP_NAME namespace: MODULE spec: selector: matchLabels: app: APP_NAME replicas: 1 template: metadata: labels: aliyun.logs.APP_NAME: stdout app: APP_NAME spec: imagePullSecrets: - name: regsecret #拉取鏡像的secret,不同名稱空間需要單獨創建 hostNetwork: true nodeSelector: app: test-MODULE terminationGracePeriodSeconds: 60 restartPolicy: Always containers: - name: APP_NAME image: IMAGE imagePullPolicy: IfNotPresent resources: requests: memory: "1Gi" cpu: "0.5" limits: memory: "2Gi" cpu: "8" env: - name: aliyun_logs_APP_NAME value: "stdout" livenessProbe: tcpSocket: port: PORT initialDelaySeconds: 120 periodSeconds: 20 successThreshold: 1 failureThreshold: 2 volumeMounts: - name: logs mountPath: /opt/logs/ - name: time mountPath: /etc/localtime volumes: - name: logs hostPath: path: /opt/logs/ #應用日志輸出位置,根據應用進行調整,項目中規定的是/opt/logs,此次部署用不到,可以做參考 type: DirectoryOrCreate - name: time hostPath: path: /etc/localtime #掛載時區文件 --- apiVersion: v1 kind: Service metadata: name: APP_NAME labels: app: APP_NAME namespace: MODULE spec: selector: app: APP_NAME clusterIP: None # type: NodePort ports: - name: APP_NAME port: PORT targetPort: PORT # nodePort: PORT
7、以上部署沒有問題就可以部署ingress了
[root@master mq]# cat mq-ingress.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx name: mq-ingess namespace: mq-console spec: rules: - host: mymq-ingress.com http: paths: - backend: serviceName: rocketmq-console servicePort: 8080 path: /
8、編輯完成ingress的yaml文件后執行:
[root@k8s-master k8s]# kubectl apply -f mq-ingress.yaml
[root@k8s-master k8s]# kubectl get ingress -nmq-console
NAME HOSTS ADDRESS PORTS AGE
mq-ingress mymq-ingress.com 192.168.111.163 80 142m
最后通過瀏覽器訪問即可: