在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用Jenkins和單個模板部署多個Kubernetes組件

馬哥Linux運維 ? 來源:51CTO ? 2024-01-02 11:40 ? 次閱讀

前言

在持續集成和部署中,我們通常需要部署多個實例或組件到Kubernetes集群中。通過Jenkins的管道腳本,我們可以自動化這個過程。在本文中,我將演示如何使用Jenkins Pipeline及單個YAML模板文件(.tpl)來部署多個類似的Kubernetes組件,而不需要為每個組件提供單獨的模板文件。

問題背景

Jenkins Pipeline 腳本優化實踐:從繁瑣到簡潔批量生成 Kubernetes 部署模板:從 1 到20順序模板

pipeline {
    agent none // Use none at the top level, each stage will define its own agent.


    environment {
        REGISTRY = "xxxx/master-metaspace"
        KUBE_CONFIG = "--namespace=master-metaspace --context=master"
        KUBE_YAML_PATH = "/home/jenkins/workspace/yaml/master-metaspace"
        // Assume that 'data' is defined elsewhere or injected as a parameter.
        BASE_WORKSPACE = "xxxxxxx" // 定義一個基礎工作空間路徑
    }


    stages {
        stage("GetCode") {
            agent { label "build01" }
            steps {
                script {
                    checkout scm: [
                        $class: 'GitSCM',
                        branches: [[name: env.branchName]],
                        extensions: [[$class: 'CloneOption', depth: 1, noTags: false, shallow: true]],
                        userRemoteConfigs: [[credentialsId: 'xxxx', url: env.gitHttpURL]]
                    ]
                }
            }
        }
        
        stage("Docker Builds") {
            parallel {
                stage('Build dataloader-game-ucenter') {
                    agent { label "build01" }
                    when { environment name: 'dataloader', value: 'true' }
                    steps {
                        buildAndPushDockerImage("dataloader-game-ucenter", env.data, env.BASE_WORKSPACE)
                    }
                }
                stage('Build datawriter-game-ucenter') {
                    agent { label "build01" }
                    when { environment name: 'datawriter', value: 'true' }
                    steps {
                        buildAndPushDockerImage("datawriter-game-ucenter", env.data, env.BASE_WORKSPACE)
                    }
                }
                stage('Build game-ucenter') {
                    agent { label "build01" }
                    when { environment name: 'game-ucenter', value: 'true' }
                    steps {
                        buildAndPushDockerImage("game-ucenter", env.data, env.BASE_WORKSPACE)
                    }
                }
            }
        }
        
        stage('Development Deployment') {
            parallel {
                stage("Deploy datawriter-game-ucenter") {
                    when { environment name: 'datawriter-game-ucenter', value: 'true' }
                    agent { label  "huaweiyun-xx" }
                    steps {
                        deployToKubernetes("datawriter-game-ucenter")
                    }
                }
                stage("Deploy dataloader-game-ucenter") {
                    when { environment name: 'dataloader', value: 'true' }
                    agent { label  "huaweiyun-xx" }
                    steps {
                        deployToKubernetes("dataloader-game-ucenter")
                    }
                }
                stage("Deploy game-ucenter") {
                    when { environment name: 'game-ucenter', value: 'true' }
                    agent { label  "huaweiyun-xx" }
                    steps {
                        deployToKubernetes("game-ucenter-1")
                        deployToKubernetes("game-ucenter-2")
                        deployToKubernetes("game-ucenter-3")
                        deployToKubernetes("game-ucenter-4")
                        ............................
                    }
                }
            }
        }
    }
}


// Define methods outside pipeline to avoid repetition


def buildAndPushDockerImage(String imageName, String tag, String workspacePath) {
    sh "cd ${workspacePath} && echo 'Current directory: $(pwd)'" // 使用基礎工作空間變量
    sh "cd ${workspacePath}/${imageName}&& docker build --build-arg NODE_ENV=$imageName -t $REGISTRY/$imageName:$tag ."
    withCredentials([usernamePassword(credentialsId: 'xxxxx', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
        sh "docker login -u $dockerUser -p $dockerPassword $REGISTRY"
        sh "docker push $REGISTRY/$imageName:$tag"
    }
}


def deployToKubernetes(String kubernetesComponent) {
    String templateFile = "${KUBE_YAML_PATH}/${kubernetesComponent}.tpl"
    String outputFile = "${KUBE_YAML_PATH}/${kubernetesComponent}.yaml"
    sh "sed -e 's/{data}/$data/g' $templateFile > $outputFile"
    sh "sudo kubectl apply -f $outputFile $KUBE_CONFIG"
}

默認jenkins pipeline如上,我們有多個相似的游戲用戶中心服務game-ucenter-*運行在Kubernetes集群中,它們都使用非常相似的Kubernetes YAML配置文件,配置文件之間的差異主要是一些標識符的不同(例如,服務的序號)。在傳統的做法中,維護一系列幾乎一樣的模板文件(如game-ucenter-1.tpl, game-ucenter-2.tpl 等)將非常低效且易出錯。

為了精簡流程和提高效率,我們需要一個方法來通過單一模板生成多個配置文件,并由此部署多個不同的服務實例。

解決方案

使用Jenkins Pipeline中的sed命令和循環結構,我們可以從單一模板生成多個Kubernetes配置文件,并相應地部署每個服務實例。參照generate_templates.sh腳本

#!/bin/bash


# Define the name of the template file.
TEMPLATE_FILE="game-ucenter.tpl"


# Check if the template file exists.
if [ ! -f "$TEMPLATE_FILE" ]; then
    echo "Template file $TEMPLATE_FILE does not exist."
    exit 1
fi


# Loop to create files from game-ucenter-2 to pvp-game-20 based on the template.
for i in $(seq 1 20); do
    # Define the name of the new file.
    NEW_FILE="game-ucenter-${i}.yaml"
    
    # Copy the template to the new file.
    cp $TEMPLATE_FILE $NEW_FILE
    
    # Use 'sed' to replace 'game-ucenter-1' with 'game-ucenter-N' and save inline (-i option).
    sed -i "s/game-ucenter/game-ucenter-${i}/g" $NEW_FILE




    echo "Created file: $NEW_FILE"
done


echo "All files created successfully."



步驟 1: 定義Jenkins Pipeline

在我們的Jenkins腳本中,我們首先定義了基礎環境變量和兩個函數:buildAndPushDockerImage 和 deployToKubernetes。這些函數將用于構建Docker鏡像并部署到Kubernetes

def buildAndPushDockerImage(String imageName, String tag, String workspacePath) {
    sh "cd ${workspacePath} && echo 'Current directory: $(pwd)'" // 使用基礎工作空間變量
    sh "cd ${workspacePath}/${imageName}&& docker build --build-arg NODE_ENV=$imageName -t $REGISTRY/$imageName:$tag ."
    withCredentials([usernamePassword(credentialsId: 'xxx', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
        sh "docker login -u $dockerUser -p $dockerPassword $REGISTRY"
        sh "docker push $REGISTRY/$imageName:$tag"
    }
}


def deployToKubernetes(String kubernetesComponent) {
    String templateFile = "${KUBE_YAML_PATH}/${kubernetesComponent}.tpl"
    String outputFile = "${KUBE_YAML_PATH}/${kubernetesComponent}.yaml"
    sh "sed -e 's/{data}/$data/g' $templateFile > $outputFile"
    sh "sudo kubectl apply -f $outputFile $KUBE_CONFIG"
}

步驟 2: 修改deployToKubernetes函數

接下來,我們需要修改deployToKubernetes函數,以便它能夠接受組件名稱,并使用單一模板文件創建具體的配置文件。

def deployToKubernetes(String kubernetesComponent, int instance=1, int totalInstances=1) {
    // 檢查實例值
    if (instance < 1) {
        error("實例數必須大于0")
    }


    // 根據 instance 的值來定義資源的名稱和文件名
    String nameSuffix = totalInstances > 1 ? "-${instance}" : "" // 總是添加后綴,除非只有一個實例
    String outputFileName = "${kubernetesComponent}${nameSuffix}.yaml"
    String templateFile = "${KUBE_YAML_PATH}/${kubernetesComponent}.tpl"
    String outputFile = "${KUBE_YAML_PATH}/${outputFileName}"
    String nameReplacement = "${kubernetesComponent}${nameSuffix}"


    sh """
        cat "${templateFile}" 
        | sed 's/{data}/${data}/g' 
        | sed 's/name: ${kubernetesComponent}/name: ${nameReplacement}/g' 
        | sed 's/app: ${kubernetesComponent}/app: ${nameReplacement}/g' 
        > "${outputFile}"
    """


    // 使用 KUBE_CONFIG 應用 Kubernetes 配置
    sh "kubectl apply -f ${outputFile} ${KUBE_CONFIG}"
}

對于單實例的業務,例如Deploy dataloader-game-ucenter,我們不需要傳遞實例編號。

stage("Deploy dataloader-game-ucenter") {
    when { environment name: 'dataloader', value: 'true' }
    agent { label  "huaweiyun-xx" }
    steps {
        deployToKubernetes("dataloader-game-ucenter")
    }
}

對于多實例。我這里生成 規則優點強迫癥了。如果多實例我生成的規則要求符合game-ucenter-1,game-ucenter-2,game-ucenter-3......順序,當單個實例的時候則保持原來的不加標簽

                stage("Deploy game-ucenter") {
                    when { environment name: 'game-ucenter', value: 'true' }
                    agent { label  "k8s-node-06" }
                    steps {
                        script {
                          int instances = 2 // 假設我們有2個實例
                          for (int i = 1; i <= instances; i++) {
                            def componentName = "game-ucenter"
                            deployToKubernetes("game-ucenter", i, instances)


                    }
                }
            }
        }

步驟 3: 準備模板文件

我們的模板文件game-ucenter.tpl將包含通用的Kubernetes服務或部署定義,使用占位符game-ucenter-1game-ucenter-2來標識應該被替換的地方。

# game-ucenter-1.tpl (示例部分)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: game-ucenter
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: game-ucenter
  template:
    metadata:
      labels:
        app: game-ucenter
    spec:
      containers:
        - name: game-ucenter
          image: xxxx/xxx/game-ucenter:{data}
          envFrom:
          - configMapRef:
              name: deploy
          ports:
            - containerPort: 80
          resources:
            requests:
              memory: "4096M"
              cpu: "2000m"
            limits:
              memory: "4096M"
              cpu: "2000m" 
          livenessProbe:
            httpGet:
              scheme: HTTP
              path: /test.html
              port: 80
            initialDelaySeconds: 20
            periodSeconds: 120
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            httpGet:
              scheme: HTTP
              path: /test.html
              port: 80
            initialDelaySeconds: 20
            periodSeconds: 120
      imagePullSecrets:                                              
        - name: xxx
---


apiVersion: v1
kind: Service
metadata:
  name: game-ucenter
  labels:
    app: game-ucenter
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: game-ucenter


# ...

步驟 4: 執行Jenkins Pipeline

當Jenkins Pipeline運行到"Development Deployment"階段時,它將循環創建和應用game-ucenter-1.yaml到game-ucenter-2.yaml的配置文件,從而部署2個game-ucenterdeployment服務實例。

27b4be8e-a645-11ee-8b88-92fbcf53809c.jpg

并保證單個實例的原有命名規則:

27ca0a6e-a645-11ee-8b88-92fbcf53809c.jpg

通過這一方法,我們不再需要為每個服務實例維護一個單獨的模板文件,而是可以通過一個模板文件和Jenkins Pipeline的自動化來簡化服務部署工作。這樣做不僅提升了效率,也降低了出錯的風險。

注意:

以上代碼和命令為示例性質,可能需要根據您具體的Jenkins環境和Kubernetes集群進行相應的調整。在生產環境中部署之前,請確保進行充分的測試。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模板
    +關注

    關注

    0

    文章

    108

    瀏覽量

    20563
  • 腳本
    +關注

    關注

    1

    文章

    389

    瀏覽量

    14864
  • jenkins
    +關注

    關注

    0

    文章

    28

    瀏覽量

    5154
  • kubernetes
    +關注

    關注

    0

    文章

    224

    瀏覽量

    8716

原文標題:解決方案

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Kubernetes Ingress 高可靠部署最佳實踐

    摘要: 在Kubernetes集群中,Ingress作為集群流量接入層,Ingress的高可靠性顯得尤為重要,今天我們主要探討如何部署一套高性能高可靠的Ingress接入層。簡介
    發表于 04-17 14:35

    阿里云容器Kubernetes監控(二) - 使用Grafana展現Pod監控數據

    Heapster的功能。因此Heapster成為了kubernetes中一個必不可少的組件,在阿里云的kubernetes集群中已經內置了Heapster+Influxdb的組合,如果需要將監控的數據進行
    發表于 05-10 15:28

    kubernetes部署與應用

    kubernetes運維筆記
    發表于 10-25 13:08

    kubernetes v112二進制方式集群部署

    kubernetes v112 二進制方式集群部署
    發表于 05-05 16:30

    請問鴻蒙系統上可以部署kubernetes集群嗎?

    鴻蒙系統上可以部署kubernetes集群嗎
    發表于 06-08 11:16

    Jenkins遠程部署Linux服務器的過程

    1、Jenkins遠程部署Linux服務器  之前在Jenkins上也有一些使用經驗了,但是都是使用團隊配置好的Jenkins,自己只需要管自己的項目以及執行構建即可,這一次自己嘗試了
    發表于 11-18 18:12

    如何部署基于Mesos的Kubernetes集群

    kubernetes是一個跨多個計算節點的管理容器化應用的系統,它提供了一系列基本的功能,如應用的自動化部署,維護和擴展等。Mesos是Apache下的開源分布式資源管理框架,它被稱為是分布式系統
    發表于 10-09 18:04 ?0次下載
    如何<b class='flag-5'>部署</b>基于Mesos的<b class='flag-5'>Kubernetes</b>集群

    jenkins自動化部署

    本文詳細介紹Jenkins的簡單使用—jenkins自動化部署
    的頭像 發表于 02-06 11:27 ?4693次閱讀
    <b class='flag-5'>jenkins</b>自動化<b class='flag-5'>部署</b>

    Jenkins詳細安裝與構建部署使用教程

    本文詳細介紹了Jenkins安裝與構建部署使用教程。Jenkins是一個開源軟件項目,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。Jenkins是基于Java開發的一種持
    發表于 02-06 13:47 ?1763次閱讀
    <b class='flag-5'>Jenkins</b>詳細安裝與構建<b class='flag-5'>部署</b>使用教程

    Jenkins是什么_Jenkins常用功能_jenkins的使用總結

    本文詳細回答了Jenkins是什么,Jenkins常用功能以及jenkins的使用總結。Jenkins 是一個可擴展的持續集成引擎。Jenkins
    發表于 02-06 14:44 ?2.8w次閱讀
    <b class='flag-5'>Jenkins</b>是什么_<b class='flag-5'>Jenkins</b>常用功能_<b class='flag-5'>jenkins</b>的使用總結

    如何解決Kubernetes部署故障及技巧

    Kubernetes資源配置中的錯誤,例如在部署(Deployment)和服務(Service)里。
    發表于 05-04 07:12 ?650次閱讀
    如何解決<b class='flag-5'>Kubernetes</b>中<b class='flag-5'>部署</b>故障及技巧

    部署Jenkins服務時如何保障服務的高可用性呢?

    現在的企業很多都在用Jenkins做持續集成,各個業務端都依靠Jenkins,vivo Devops也是使用Jenkins來進行持續構建,部署Jen
    的頭像 發表于 02-14 17:02 ?3250次閱讀

    Kubernetes的集群部署

    Kubeadm是一種Kubernetes集群部署工具,通過kubeadm init命令創建master節點,通過 kubeadm join命令把node節點加入到集群中
    的頭像 發表于 02-15 10:35 ?1726次閱讀

    Jenkins部署啟動案例

    電子發燒友網站提供《Jenkins部署啟動案例.zip》資料免費下載
    發表于 06-15 14:53 ?0次下載
    <b class='flag-5'>Jenkins</b><b class='flag-5'>部署</b>啟動案例

    Jenkins pipeline是如何連接Kubernetes的呢?

    Kubernetes 是一個開源的容器編排平臺,可以幫助開發團隊管理和部署容器化的應用程序。
    的頭像 發表于 10-23 11:13 ?1817次閱讀
    <b class='flag-5'>Jenkins</b> pipeline是如何連接<b class='flag-5'>Kubernetes</b>的呢?
    主站蜘蛛池模板: 国产精品99r8免费视频2022| 1000部啪啪未满十八勿入中国| 五月天毛片| 欧美性精品| 四虎永久精品视频在线| 波多野结衣在线观看一区二区三区| 五月婷婷综合激情网| 精品99久久| 能看的黄网| 国产成人精品系列在线观看| 鲁一鲁色一色| 免费一级牲交毛片| 超h高h文污肉| 国产无限资源| 35pao免费视频| 四虎影午夜成年免费精品| aaaaaaa毛片| 在厨房乱子伦在线观看| 日本三级最新中文字幕电影| 午夜国产视频| 美女视频一区二区三区| 蕾丝视频成人★在线观看| 精品精品国产高清a毛片牛牛| 一区二区三区伦理| 丁香婷婷九月| 欧美性受xxxx| 欧美黄三级在线观看| 免费看又爽又黄禁片视频1000| 妖精视频一区二区三区| 成人欧美一区二区三区视频不卡| 俄罗斯女人69xxx| 女人张腿让男桶免费视频观看 | 亚洲综合久久综合激情久久| 国内精品久久久久影| 午夜aa| 欧美性色黄| 国产小视频在线看| 色偷偷97| 狠狠干b| 日本三级日本三级日本三级极 | 精品卡1卡2卡三卡免费视频|