基於kubernetes平臺微服務的部署
首先下載外掛:
kubernetes Continuous Deploy
然後去找 .kube/ 裡的config 複製裡面的內容
去新增憑據:
然後就是指令碼更新:
def git_address = "http://20.0.0.20:82/root/tensquare_back.git" def git_auth = "904eff5d-41c8-44ad-ba24-7f539a0edb96" //構建版本的名稱 def tag = "latest" //Harbor私服地址 def harbor_url = "20.0.0.50:85" //Harbor的專案名稱 def harbor_project_name = "tensquare" //Harbor的憑證 def harbor_auth = "427399a8-db35-48e8-b5cf-a1ea63f10cc5" //k8s的憑證 def k8s_auth="4f3c9e60-da07-49b3-89ae-d708516e8071" //定義k8s-barbor的憑證 def secret_name="registry-auth-secret" podTemplate(label: 'jenkins-slave', cloud: 'kubernetes', containers: [ containerTemplate( name: 'jnlp', image: "20.0.0.50:85/library/jenkins-slave-maven:latest" ), containerTemplate( name: 'docker', image: "docker:stable", ttyEnabled: true, command: 'cat' ), ], volumes: [ hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'), nfsVolume(mountPath: '/usr/local/apache-maven/repo', serverAddress: '20.0.0.10' , serverPath: '/opt/nfs/maven'), ], ) { node("jenkins-slave"){ // 第一步 stage('pull code'){ checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]]) } // 第二步 stage('make public sub project'){ //編譯並安裝公共工程 sh "mvn -f tensquare_common clean install" } // 第三步 stage('make image'){ //把選擇的專案資訊轉為陣列 def selectedProjects = "${project_name}".split(',') for(int i=0;i<selectedProjects.size();i++){ //取出每個專案的名稱和埠 def currentProject = selectedProjects[i]; //專案名稱 def currentProjectName = currentProject.split('@')[0] //專案啟動埠 def currentProjectPort = currentProject.split('@')[1] //定義映象名稱 def imageName = "${currentProjectName}:${tag}" //編譯,構建本地映象 sh "mvn -f ${currentProjectName} clean package dockerfile:build" container('docker') { //給映象打標籤 sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}" //登入Harbor,並上傳映象 withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) { //登入 sh "docker login -u ${username} -p ${password} ${harbor_url}" //上傳映象 sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}" } //刪除本地映象 sh "docker rmi -f ${imageName}" sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}" } def deploy_image_name = "${harbor_url}/${harbor_project_name}/${imageName}" //部署到K8S sh """ sed -i 's#\$IMAGE_NAME#${deploy_image_name}#' ${currentProjectName}/deploy.yml sed -i 's#\$SECRET_NAME#${secret_name}#' ${currentProjectName}/deploy.yml """ kubernetesDeploy configs: "${currentProjectName}/deploy.yml", kubeconfigId: "${k8s_auth}" } } } }
要更改的就是:
新增k8s的憑證:
然後在eureka 目錄下建立deploy檔案:
metadata: name: eureka spec: serviceName: "eureka" replicas: 2 selector: matchLabels: app: eureka template: metadata: labels: app: eureka spec: imagePullSecrets: - name: $SECRET_NAME containers: - name: eureka image: $IMAGE_NAME ports: - containerPort: 10086 env: - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: EUREKA_SERVER value: "http://eureka-0.eureka:10086/eureka/,http://eureka- 1.eureka:10086/eureka/" - name: EUREKA_INSTANCE_HOSTNAME value: ${MY_POD_NAME}.eureka podManagementPolicy: "Parallel"
裡面的application.yml配置檔案更改如下:
server: port: ${PORT:10086} spring: application: name: eureka eureka: server: # 續期時間,即掃描失效服務的間隔時間(預設為60*1000ms) eviction-interval-timer-in-ms: 5000 enable-self-preservation: false use-read-only-response-cache: false client: # eureka client間隔多久去拉取服務註冊資訊 預設30s registry-fetch-interval-seconds: 5 serviceUrl: defaultZone: ${EUREKA_SERVER:http://127.0.0.1:${server.port}/eureka/} instance: # 心跳間隔時間,即傳送一次心跳之後,多久在發起下一次(預設為30s) lease-renewal-interval-in-seconds: 5 # 在收到一次心跳之後,等待下一次心跳的空檔時間,大於心跳間隔即可,即服務續約到期時間(預設為90s) lease-expiration-duration-in-seconds: 10 instance-id: ${EUREKA_INSTANCE_HOSTNAME:${spring.application.name}}:${server.port}@${random.l ong(1000000,9999999)} hostname: ${EUREKA_INSTANCE_HOSTNAME:${spring.application.name}}
然後在提交前在k8s所有主機上操作
docker login -u lvbu -p Lvbu1234 20.0.0.50:85
kubectl create secret docker-registry registry-auth-secret --docker-server=20.0.0.50:85 --docker-username=lvbu --docker-password=Lvbu1234 -- docker-email=lbu@qq.com
然後去提交之前的修改的配置
提交完之後就可以構建了!
然後去檢視:
kubectl get secrets
kubectl get pods
kubectl get servicef 檢視能看到埠 訪問node節點的埠 就會發現註冊中心有了
然後部署服務閘道器:
同理更改配置檔案中的eureka叢集地址:
http://eureka-0.eureka:10086/eureka/,http://eureka- 1.eureka:10086/eureka/
所有的都要更改!
然後一樣的操作在閘道器低下建立deploy.yml檔案:
內容如下:
--- apiVersion: v1 kind: Service metadata: name: zuul labels: app: zuul spec: type: NodePort ports: - port: 10020 name: zuul targetPort: 10020 selector: app: zuul --- apiVersion: apps/v1 kind: StatefulSet metadata: name: zuul spec: serviceName: "zuul" replicas: 2 selector: matchLabels: app: zuul template: metadata: labels: app: zuul spec: imagePullSecrets: - name: $SECRET_NAME containers: - name: zuul image: $IMAGE_NAME ports: - containerPort: 10020 podManagementPolicy: "Parallel"
在提交前先去手動上傳父工程依賴到NFS的maven共享倉庫目錄中:
然後在構建!
然後就是部署admin_service:
也是建立deploy.yml:
--- apiVersion: v1 kind: Service metadata: name: admin labels: app: admin spec: type: NodePort ports: - port: 9001 name: admin targetPort: 9001 selector: app: admin --- apiVersion: apps/v1 kind: StatefulSet metadata: name: admin spec: serviceName: "admin" replicas: 2 selector: matchLabels: app: admin template: metadata: labels: app: admin spec: imagePullSecrets: - name: $SECRET_NAME containers: - name: admin image: $IMAGE_NAME ports: - containerPort: 9001 podManagementPolicy: "Parallel"
然後 叢集地址也要更改!
接下來的部署gatjering 也是如此:
deploy.yml檔案如下:
--- apiVersion: v1 kind: Service metadata: name: gathering labels: app: gathering spec: type: NodePort ports: - port: 9002 name: gathering targetPort: 9002 selector: app: gathering --- apiVersion: apps/v1 kind: StatefulSet metadata: name: gathering spec: serviceName: "gathering" replicas: 2 selector: matchLabels: app: gathering template: metadata: labels: app: gathering spec: imagePullSecrets: - name: $SECRET_NAME containers: - name: gathering image: $IMAGE_NAME ports: - containerPort: 9002 podManagementPolicy: "Parallel"
也要修改叢集地址eureka!
然後就可以一次性提交程式碼然後一次性構建!
結果如下: