基於kubernetes平臺微服務的部署

隱姓埋名4869發表於2022-03-11

基於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!

 

然後就可以一次性提交程式碼然後一次性構建!

結果如下:

 

 

相關文章