KubeSphere DevOps流水线部署
文章目錄
- 一. 安裝
- 1.1 下載yaml
- 1.2 設置默認StorageClass
- 1.3 安裝
- 1.4 配置
- 1.5 查看
- 1.6 頁面
- 二. 流水線部署
- 2.1 開啟流水線設置
- 2.1.1 未安裝KS前進行設置
- 2.1.2 已安裝過KS通過管理界面進行設置
- 2.2 查看流水線安裝
- 2.3 創建企業空間
- 2.4 創建DevOps項目
- 2.5 Devops項目添加憑證
- 2.6 自定義 Jenkins Agent(忽略這一步)
- 2.6.1 查看agent配置
- 2.6.2 自定義agent配置(label沒有發現)
- 2.6.3 java8
- 2.6.4 java11
- 2.6.5 maven-pvc(可以不用pvc執行掛載hostPath)
- 2.7 測試流水線Jenkinsfile(可以跳過)
- 2.7.1 使用自帶的`label` `maven`
- 2.7.2 使用自定義得`label` `maven && jdk11`(報錯label發現不了)
- 2.7.3 yaml
- 2.8 測試流水線
- 2.8.1 項目添加`Jekinsfile``2.7.1`
- 2.8.2 創建流水線
- 2.8.3 查看git分支
- 2.8.4 運行
- 2.8.5 查看日志
- 2.9 項目Jenkinsfile
- 2.10 Jenkins
- 三. 集成sonar
- 3.1 helm安裝sonar
- 3.2 創建 SonarQube 管理員令牌 (Token)
- 3.3 創建 Webhook 服務器
- 3.4 將 SonarQube 配置添加到 ks-installer
- 3.5 將 SonarQube 服務器添加至 Jenkins
- 3.5.1 配置sonar服務器
- 3.5.2 全局配置SonarQube Scanner
- 3.6 將 sonarqubeURL 添加到 KubeSphere 控制臺
- 3.7 重啟服務
- 3.8 項目Jenkinsfile
- 3.9 測試
- 四. 提交代碼自動構建
- 4.1 查看Webhook 推送 URL
- 4.2 gitee添加webhook
- 4.3 測試
一. 安裝
1.1 下載yaml
mkdir -p /root/i/yaml/kubesphere && cd /root/i/yaml/kubesphere wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/kubesphere-installer.yaml wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/cluster-configuration.yaml查看
[root@master kubesphere]# ls cluster-configuration.yaml kubesphere-installer.yaml1.2 設置默認StorageClass
[root@master kubesphere]# kubectl get sc | grep nfs-storage nfs-storage nfs-storage Retain Immediate false 115d [root@master kubesphere]# kubectl patch storageclass nfs-storage -p '{ "metadata" : { "annotations" :{"storageclass.kubernetes.io/is-default-class": "true"}}}' storageclass.storage.k8s.io/nfs-storage patched [root@master kubesphere]# kubectl get sc | grep nfs-storage nfs-storage (default) nfs-storage Retain Immediate false 115d如果沒有設置,不會安裝
1.3 安裝
kubectl create ns kubesphere-system kubectl apply -f kubesphere-installer.yaml安裝成功
[root@master kubesphere]# kubectl get pods -n kubesphere-system NAME READY STATUS RESTARTS AGE ks-installer-c9655d997-hpqns 1/1 Running 0 72s1.4 配置
kubectl apply -f cluster-configuration.yaml檢查安裝日志
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f1.5 查看
新建了命名空間
kubesphere-controls-system: kubesphere-monitoring-federated:聯邦集群,多集群 kubesphere-monitoring-system:集群監控 kubesphere-system:其他資源
[root@master kubesphere]# kubectl get pods -n kubesphere-system NAME READY STATUS RESTARTS AGE ks-apiserver-66cd784f8f-jn2k5 1/1 Running 0 11m ks-console-5c5676fb55-h6krc 1/1 Running 0 11m ks-controller-manager-6d6b54464d-qrxfs 1/1 Running 0 11m ks-installer-c9655d997-kz4gb 1/1 Running 0 12m[root@master kubesphere]# kubectl get svc -n kubesphere-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ks-apiserver ClusterIP 10.109.250.63 <none> 80/TCP 11m ks-console NodePort 10.102.49.78 <none> 80:30880/TCP 11m ks-controller-manager ClusterIP 10.101.243.88 <none> 443/TCP 11m[root@master kubesphere]# kubectl get pods -n kubesphere-monitoring-system NAME READY STATUS RESTARTS AGE alertmanager-main-0 2/2 Running 0 8m58s alertmanager-main-1 2/2 Running 0 8m57s alertmanager-main-2 2/2 Running 0 8m56s kube-state-metrics-645c64569c-pkvkj 3/3 Running 0 9m55s node-exporter-2t6pq 2/2 Running 0 9m54s node-exporter-bstgl 2/2 Running 0 9m54s node-exporter-mts6g 2/2 Running 0 9m55s notification-manager-deployment-7dd45b5b7d-p4bpr 2/2 Running 0 5m15s notification-manager-deployment-7dd45b5b7d-sp8vw 2/2 Running 0 5m15s notification-manager-operator-8598775b-vppz6 2/2 Running 0 9m34s prometheus-k8s-0 2/2 Running 0 8m57s prometheus-k8s-1 2/2 Running 0 8m55s prometheus-operator-57c78bd7fb-jbfxs 2/2 Running 0 9m56s[root@master kubesphere]# kubectl get pvc -n kubesphere-monitoring-system NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE prometheus-k8s-db-prometheus-k8s-0 Bound pvc-9046cbb5-8c31-4014-9342-6a63fb348fb3 20Gi RWO nfs-storage 9m9s prometheus-k8s-db-prometheus-k8s-1 Bound pvc-5816cdfc-0976-4312-918c-d4dc361d5ec9 20Gi RWO nfs-storage 9m7s1.6 頁面
訪問 http://192.168.4.27:30880,默認賬號密碼admin/P@88w0rd,然后要求修改密碼Ww$19930327
二. 流水線部署
2.1 開啟流水線設置
2.1.1 未安裝KS前進行設置
在安裝KS前,可通過編輯config-sample.yaml文件,設置如下:
devops:enabled: true # 將"false"更改為true2.1.2 已安裝過KS通過管理界面進行設置
若之前已安裝過KS,則可通過KS管理界面(平臺管理->集群管理)左側菜單定時資源定義(CRD) -> 搜索clusterconfiguration -> 然后編輯其下資源ks-installer,如下圖:
點擊進入
同樣設置devops.enabled為true:
在 kubectl 中執行以下命令檢查安裝過程:
Kubesphere Devops詳細開啟說明可參見:
https://kubesphere.io/zh/docs/pluggable-components/devops/
2.2 查看流水線安裝
設置完成后可通過KS管理界面查看系統組件 - DevOps相關資源是否已安裝完成,如下圖:
狀態都是健康,安裝成功
2.3 創建企業空間
工作臺 -> 企業空間 -> 創建
2.4 創建DevOps項目
2.5 Devops項目添加憑證
后續在使用流水線時,Jenkins pipeline腳本需要與外部Git倉庫、Docker倉庫、K8s集群(可以是外部集群)進行交互,所以需要在其對應的Devops項目中添加憑證(用于訪問外部環境的賬號密碼、密鑰等),后續在Jenkins pipeline腳本中會通過憑證名稱(ID)進行引用。
測試環境的外部依賴如下:
| gitee-wanfei | 用戶名和密碼 | Gitee登錄賬號密碼,用于流水線拉取代碼 |
| docker-aliyun | 用戶名和密碼 | 阿里云容器鏡像服務ACR個人版 docker login賬號密碼,用于Jenkins腳本推送docker鏡像 |
| k8s-config-ks | kubeconfig | 當前K8s集群的kubeconfig文件(新建時默認填充),用于Jenkins腳本部署K8s應用負載 |
雙擊 DevOps 項目名稱進入
具體憑證列表如下圖:
2.6 自定義 Jenkins Agent(忽略這一步)
2.6.1 查看agent配置
配置->配置字典->搜索jenkins-casc-config->編輯YAML
搜索data.jenkins_user.yaml:jenkins.clouds.kubernetes.templates
2.6.2 自定義agent配置(label沒有發現)
也可以添加自定義鏡像,例如:
- name: "maven-jdk11" # 自定義 Jenkins Agent 的名稱。label: "maven jdk11" # 自定義 Jenkins Agent 的標簽。若要指定多個標簽,請用空格來分隔標簽。inheritFrom: "maven" # 該自定義 Jenkins Agent 所繼承的現有容器組模板的名稱。containers:- name: "maven" # 該自定義 Jenkins Agent 所繼承的現有容器組模板中指定的容器名稱。image: "kubespheredev/builder-maven:v3.2.0jdk11" # 此鏡像只用于測試。您可以使用自己的鏡像。2.6.3 java8
官方鏡像:kubesphere/builder-maven:v3.2.0,但是helm版本是2
2.6.4 java11
官方鏡像:kubesphere/builder-maven:v3.2.1-jdk11,但是helm版本是2
Dockerfile可以參考 https://hub.docker.com/layers/builder-maven/kubesphere/builder-maven/v3.2.1-jdk11/images/sha256-0fed85db83a4b215a128ae1155a3f007fa6d03adc37f65acfd9bc2cdb4c5597a?context=explore
2.6.5 maven-pvc(可以不用pvc執行掛載hostPath)
添加maven-pvc,也可以使用現有的devops-jenkins pvc,存儲maven下載的jar,多次部署不用重復下載
2.7 測試流水線Jenkinsfile(可以跳過)
2.7.1 使用自帶的label maven
pipeline {agent {node {label 'maven'}}stages {stage('Print Maven and JDK version') {steps {container('maven') {sh '''mvn -vjava -version'''}}}} }參考 https://kubesphere.io/zh/docs/v3.3/devops-user-guide/how-to-use/pipelines/choose-jenkins-agent/
2.7.2 使用自定義得label maven && jdk11(報錯label發現不了)
pipeline {agent {node {label 'maven && jdk11'}}stages {stage('Print Maven and JDK version') {steps {container('maven') {sh '''mvn -vjava -version'''}}}} }參考 https://kubesphere.io/zh/docs/v3.3/devops-user-guide/how-to-use/pipelines/customize-jenkins-agent/
2.7.3 yaml
pipeline {agent {kubernetes {//cloud 'kubernetes'label 'mypod'yaml """ apiVersion: v1 kind: Pod spec:containers:- name: mavenimage: kubesphere/builder-maven:v3.2.1-jdk11command: ['cat']tty: true """}}stages {stage('Print Maven and JDK version') {steps {container('maven') {sh '''mvn -vjava -version'''}}}} }2.8 測試流水線
2.8.1 項目添加Jekinsfile``2.7.1
2.8.2 創建流水線
輸入git倉庫地址和憑證
2.8.3 查看git分支
雙擊流水線名稱進入
2.8.4 運行
運行中
雙擊進入
2.8.5 查看日志
點擊右上角 查看日志
可以看到執行了Jenkinsfile配置的流水線腳本
2.9 項目Jenkinsfile
def label = "slave-${UUID.randomUUID().toString()}"def helmLint(String chartDir) {println "校驗 chart 模板"sh "helm lint ${chartDir}" }def helmDeploy(Map args) {if (args.dry_run) {println "Debug 應用 ${args.profile} 環境"sh "helm upgrade --install --dry-run --debug --install ..."} else {println "部署應用 到 ${args.profile} 環境"sh "helm upgrade --install --set global.pullPolicy=Always --set global.javaOpts='-Xms256m -Xmx1024m -Xss512k -XX:+PrintGC' \--set global.imagePullSecrets=${args.imagePullSecrets} --set global.imageHub.server=${args.imageHubServer}\--set global.imageHub.project=${args.imageHubProject} --set global.version=${args.imageTag} \--set global.profiles=${args.profile} --set global.namespace=${args.namespace} ${args.name} ${args.chartDir}"echo "應用 ${args.name} 部署成功. 可以使用 helm status ${args.name} 查看應用狀態"} }podTemplate(label: label,containers: [containerTemplate(name: 'maven', image: 'kubesphere/builder-maven:v3.2.1-jdk11', command: 'cat', ttyEnabled: true),containerTemplate(name: 'helm', image: 'hypnoglow/kubernetes-helm:3.0.2', command: 'cat', ttyEnabled: true)],volumes: [hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock'),hostPathVolume(hostPath: '/var/data/jenkins_maven_cache', mountPath: '/root/.m2'),hostPathVolume(mountPath: '/var/data/jenkins_sonar_cache', hostPath: '/root/.sonar/cache')]) {node(label) {// checkout scm 下載代碼def myRepo = checkout scmdef gitCommit = myRepo.GIT_COMMITdef gitBranch = myRepo.GIT_BRANCH// Docker憑證IDdef dockerCredentialId = "docker-aliyun"def imageHubServer = "registry.cn-shanghai.aliyuncs.com"def imageHubProject = "wanfei"def imageTag = "1.0.0-dev"// K8S配置憑證IDdef k8sConfigCredentialId = 'k8s-config-ks'stage('代碼編譯打包') {container('maven') {echo "1. 代碼編譯打包階段"echo "當前commit: ${gitCommit}, 分支: ${gitBranch}"sh """ls -lamvn clean package -Dmaven.test.skip=true"""}}stage('構建 Docker 鏡像') {container('maven') {withCredentials([usernamePassword(credentialsId: "${dockerCredentialId}", passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME')]) {echo "2. 構建 Docker 鏡像階段"sh """ls -laecho "$DOCKER_PASSWORD" | docker login "${imageHubServer}" -u "$DOCKER_USERNAME" --password-stdinsh ./script/deploy/buildImage.sh -v "${imageTag}" -s "${imageHubServer}" -p "${imageHubProject}""""}}}stage('運行 Helm') {container('helm') {echo "3. [INFO] 開始 Helm 部署"// 使用對應K8s配置withCredentials([kubeconfigFile(credentialsId: "${k8sConfigCredentialId}",variable: 'KUBECONFIG')]) {helmDeploy(dry_run : false,imagePullSecrets : "",imageHubServer : "${imageHubServer}",imageHubProject : "${imageHubProject}",imageTag : "${imageTag}",profile : "dev",namespace : "default",name : "devops-demo",chartDir : "./script/deploy/chart/")echo "[INFO] Helm 部署應用成功..."}}}} }2.10 Jenkins
訪問 http://192.168.4.27:30180/ ,賬號密碼admin / P@88w0rd
參考 https://kubesphere.io/zh/docs/v3.3/faq/devops/install-jenkins-plugins/
三. 集成sonar
3.1 helm安裝sonar
helm upgrade --install sonarqube sonarqube \--repo https://charts.kubesphere.io/main \-n kubesphere-devops-system \--create-namespace \--set service.type=NodePort \--set service.nodePort=32590- repo地址:https://charts.kubesphere.io/main
- 安裝版本:8.9-community
界面訪問 http://192.168.4.27:32590/ 賬號密碼 admin / admin,修改密碼為www19930327
3.2 創建 SonarQube 管理員令牌 (Token)
點擊右上角字母 A,然后從菜單中選擇 My Account 以轉到 Profile 頁面。
點擊 Security 并輸入令牌名稱,例如 kubesphere。
點擊 Generate 并復制此令牌。
c0500471a49371f7fa4053f3b9dc50e091fc3d72
將上面生成的token保存到Jenkins憑據中
3.3 創建 Webhook 服務器
執行以下命令獲取 SonarQube Webhook 的地址。(就是Jenkins地址)
export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins) export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT/sonarqube-webhook/預期輸出結果:
http://192.168.4.27:30180/sonarqube-webhook/依次點擊 Administration、Configuration 和 Webhooks 創建一個 Webhook。
點擊 Create。
在彈出的對話框中輸入 Name 和 Jenkins Console URL(即 SonarQube Webhook 地址)。點擊 Create 完成操作。
3.4 將 SonarQube 配置添加到 ks-installer
執行以下命令編輯 ks-installer。
kubectl edit cc -n kubesphere-system ks-installer搜尋至 devops。添加字段 sonarqube 并在其下方指定 externalSonarUrl 和 externalSonarToken。
devops:enabled: truejenkinsJavaOpts_MaxRAM: 2gjenkinsJavaOpts_Xms: 512mjenkinsJavaOpts_Xmx: 512mjenkinsMemoryLim: 2GijenkinsMemoryReq: 1500MijenkinsVolumeSize: 8Gisonarqube: # Add this field manually.externalSonarUrl: http://192.168.4.27:32590 # The SonarQube IP address.externalSonarToken: c0500471a49371f7fa4053f3b9dc50e091fc3d72 # The SonarQube admin token created above.完成操作后保存此文件。
3.5 將 SonarQube 服務器添加至 Jenkins
3.5.1 配置sonar服務器
登錄Jenkins
點擊 系統管理 -> 系統配置
搜尋到 SonarQube servers,然后點擊 Add SonarQube。
點擊確定
3.5.2 全局配置SonarQube Scanner
點擊 系統管理 -> 全局工具配置
點擊保存
3.6 將 sonarqubeURL 添加到 KubeSphere 控制臺
您需要指定 sonarqubeURL,以便可以直接從 KubeSphere 控制臺訪問 SonarQube。
執行以下命令:
kubectl edit cm -n kubesphere-system ks-console-config搜尋到 data.client.enableKubeConfig,在下方添加 devops 字段并指定 sonarqubeURL。
client:enableKubeConfig: truedevops: # 手動添加該字段。sonarqubeURL: http://192.168.4.27:32590 # SonarQube IP 地址。保存該文件。
3.7 重啟服務
kubectl -n kubesphere-devops-system rollout restart deploy devops-apiserver kubectl -n kubesphere-system rollout restart deploy ks-console3.8 項目Jenkinsfile
def label = "slave-${UUID.randomUUID().toString()}"def helmLint(String chartDir) {println "校驗 chart 模板"sh "helm lint ${chartDir}" }def helmDeploy(Map args) {if (args.dry_run) {println "Debug 應用 ${args.profile} 環境"sh "helm upgrade --install --dry-run --debug --install ..."} else {println "部署應用 到 ${args.profile} 環境"sh "helm upgrade --install --set global.pullPolicy=Always --set global.javaOpts='-Xms256m -Xmx1024m -Xss512k -XX:+PrintGC' \--set global.imagePullSecrets=${args.imagePullSecrets} --set global.imageHub.server=${args.imageHubServer}\--set global.imageHub.project=${args.imageHubProject} --set global.version=${args.imageTag} \--set global.profiles=${args.profile} --set global.namespace=${args.namespace} ${args.name} ${args.chartDir}"echo "應用 ${args.name} 部署成功. 可以使用 helm status ${args.name} 查看應用狀態"} }podTemplate(label: label,containers: [containerTemplate(name: 'maven', image: 'kubesphere/builder-maven:v3.2.1-jdk11', command: 'cat', ttyEnabled: true),containerTemplate(name: 'helm', image: 'hypnoglow/kubernetes-helm:3.0.2', command: 'cat', ttyEnabled: true)],volumes: [hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock'),hostPathVolume(hostPath: '/var/data/jenkins_maven_cache', mountPath: '/root/.m2'),hostPathVolume(mountPath: '/var/data/jenkins_sonar_cache', hostPath: '/root/.sonar/cache')]) {node(label) {// checkout scm 下載代碼def myRepo = checkout scmdef gitCommit = myRepo.GIT_COMMITdef gitBranch = myRepo.GIT_BRANCH// Docker憑證IDdef dockerCredentialId = "docker-aliyun"def imageHubServer = "registry.cn-shanghai.aliyuncs.com"def imageHubProject = "wanfei"def imageTag = "1.0.0-dev"// K8S配置憑證IDdef k8sConfigCredentialId = 'k8s-config-ks'stage('代碼編譯打包') {container('maven') {echo "1. 代碼編譯打包階段"echo "當前commit: ${gitCommit}, 分支: ${gitBranch}"sh """ls -lamvn clean package -Dmaven.test.skip=true"""}}stage('代碼掃描') {echo "2. 代碼掃描階段"// jenkins配置的 sonar-server namewithSonarQubeEnv('sonar') {def SCANNER_HOME = tool 'sonar-scan'sh """${SCANNER_HOME}/bin/sonar-scanner \-Dsonar.projectKey=devops-demo1 \-Dsonar.projectName=devops-demo1 \-Dsonar.projectVersion=1.0 \-Dsonar.sourceEncoding=UTF-8 \-Dsonar.language=java \-Dsonar.sources=src \-Dsonar.java.binaries=target/classes"""}}stage('檢查結果分析') {echo "3. 檢查結果分析階段"timeout(5) {// 等待sonarqube結果回調過來def qg = waitForQualityGate()echo "結果狀態: ${qg.status}"if (qg.status != 'OK') {error "未通過Sonarqube的代碼質量閾檢查,請及時修改!failure: ${qg.status}"}}}stage('構建 Docker 鏡像') {container('maven') {withCredentials([usernamePassword(credentialsId: "${dockerCredentialId}", passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME')]) {echo "4. 構建 Docker 鏡像階段"sh """ls -laecho "$DOCKER_PASSWORD" | docker login "${imageHubServer}" -u "$DOCKER_USERNAME" --password-stdinsh ./script/deploy/buildImage.sh -v "${imageTag}" -s "${imageHubServer}" -p "${imageHubProject}""""}}}stage('運行 Helm') {container('helm') {echo "5. [INFO] 開始 Helm 部署"// 使用對應K8s配置withCredentials([kubeconfigFile(credentialsId: "${k8sConfigCredentialId}",variable: 'KUBECONFIG')]) {helmDeploy(dry_run : false,imagePullSecrets : "",imageHubServer : "${imageHubServer}",imageHubProject : "${imageHubProject}",imageTag : "${imageTag}",profile : "dev",namespace : "default",name : "devops-demo",chartDir : "./script/deploy/chart/")echo "[INFO] Helm 部署應用成功..."}}}} }3.9 測試
四. 提交代碼自動構建
4.1 查看Webhook 推送 URL
流水線 -> 編輯
復制URL
4.2 gitee添加webhook
添加
因為部署再本地環境,gitee無法訪問,所以配置下內網穿透測試
# 原地址 http://192.168.4.27:30880/devops_webhook/git/?url=https://gitee.com/www19930327/devops-demo.git# 內網穿透后 http://frp-tai.wanfei.wang/devops_webhook/git/?url=https://gitee.com/www19930327/devops-demo.git
添加成功
4.3 測試
隨便添加一行代碼
觸發自動構建
代碼檢查通過
構建成功
總結
以上是生活随笔為你收集整理的KubeSphere DevOps流水线部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016世界人工智能大会 AI领袖共启智
- 下一篇: 布林带