使用pipeline构建mysql容器并发布到K8S

目录

    1、准备pvc也就是k8s容器的持久化存储
    创建pv、pvc

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-mysql-data
      namespace: db
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: nfs-mysql
      nfs:
        path: /data/db
        server: 10.61.150.16
    
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-mysql-data
      namespace: db
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: nfs-mysql
    

    2、准备创建服务所需要的dp和svc

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: mysql
      namespace: db
    spec:
      selector:
        matchLabels:
          app: mysql-db
      template:
        metadata:
          labels:
            app: mysql-db
        spec:
          volumes:
            - name: pvc-mysql-data
              persistentVolumeClaim:
                claimName: pvc-mysql-data
          containers:
            - name: mysql-db
              image: mysql:5.7
              ports:
                - containerPort: 3306
              env:
                - name: LANG
                  value: 'C.UTF-8'
                - name: MYSQL_ROOT_PASSWORD
                  value: 'password'
              volumeMounts:
                - name: pvc-mysql-data
                  mountPath: /var/lib/mysql      
        
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-svc
      namespace: db
      labels:
        name: mysql-svc
    spec:
      type: NodePort
      ports:
      - port: 3306
        protocol: TCP
        targetPort: 3306
        name: http
        nodePort: 31106
      selector:
        app: mysql-db
    
    

    mysql -h10.61.150.17 -uroot -P31106 -ppassword
    测试是否可以登录mysql

    3、使用变量替换yaml文件

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-{pv_name}
      namespace: db
    spec:
      capacity:
        storage: {pv_volume}Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: nfs-{pv_name}
      nfs:
        path: /data/db
        server: 10.61.150.16
    
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-{pv_name}
      namespace: db
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: {pv_volume}Gi
      storageClassName: nfs-{pv_name}
    
     
    ---
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: {dp_name}
      namespace: db
    spec:
      selector:
        matchLabels:
          app: {dp_name}-db
      template:
        metadata:
          labels:
            app: {dp_name}-db
        spec:
          volumes:
            - name: pvc-{pv_name}
              persistentVolumeClaim:
                claimName: pvc-{pv_name}
          containers:
            - name: {dp_name}-db
              image: mysql:5.7
              ports:
                - containerPort: 3306
              env:
                - name: LANG
                  value: 'C.UTF-8'
                - name: MYSQL_ROOT_PASSWORD
                  value: 'password'
              volumeMounts:
                - name: pvc-{pv_name}
                  mountPath: /var/lib/mysql      
        
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: {dp_name}_svc
      namespace: db
      labels:
        name: {dp_name}_svc
    spec:
      type: NodePort
      ports:
      - port: 3306
        protocol: TCP
        targetPort: 3306
        name: http
        nodePort: {nodeport}
      selector:
        app: mysql-db
    

    4、上传K8S-yaml到scm

    git init
    git config --global user.email "you@example.com"
    git config --global user.name "Your Name"
    git remote add origin $git项目地址
    git pull --rebase origin master
    
    git add mysql_jenkinsfile.yaml
    git commit -m "jenkinsfile commit
    
    git push -u origin master
    

    5、从scm中拉取jenkinsfile

    pipeline {
      agent any
      stages{
        stage("Git clone"){
          steps {
            //拉取front代码
            echo "工作目录是:$WORKSPACE"
            echo '正在拉取代码...'
            dir("projdir"){
              git  credentialsId: 'fad39094-6d07-4e3a-a86d-8b011f37b5de', url: 'http://192.168.2.32:8090/root/devops.git',branch:'master',changelog:true
            }
          }
        }
      }
    }
    

    6、使用parameters获取第三步中替换掉的变量
    使用jenkins的变量替换掉yaml文件中的name、端口等信息
    需要替换的变量

    • pv和pvc的name
    • pv和pvc的大小
    • dp的name,需要加上项目名作为区别
    • svr的nodeport
    pipeline {
        agent any 
        parameters {
            string(name: 'pv_name', defaultValue: 'test_mysql_pv', description: '请输入pv的名称 eg:test_mysql_pv')
    		string(name: 'pv_volume', defaultValue: '5', description: '请输入pv的大小 eg:5')
    		string(name: 'dp_name', defaultValue: 'test_mysql', description: '请输入dp的名称 eg:test_mysql')
    		string(name: 'dp_port', defaultValue: '32260', description: '请输入dp的端口号 eg:32260')
        }
    	stages {
            stage('get_params'){
                steps {
                    echo "pv_name: ${params.pv_name}"
    				echo "pv_volume: ${params.pv_volume}"
    				echo "dp_name: ${params.dp_name}"
    				echo "dp_port: ${params.dp_port}"
                }
            }
    		stage("Git clone"){
    			steps {
    				//拉取front代码
    				echo "工作目录是:$WORKSPACE"
    				echo '正在拉取代码...'
    				dir("projdir"){
    					git  credentialsId: 'fad39094-6d07-4e3a-a86d-8b011f37b5de', url: 'http://192.168.2.32:8090/root/devops.git',branch:'master',changelog:true
    				}
    			}
    		}
    		stage("update yaml"){
    			steps {
    				dir("projdir"){
    					sh "sed -e 's#{pv_name}#${params.pv_name}#g;s#{pv_volume}#${params.pv_volume}#g;s#{dp_name}#${params.dp_name}#g;s#{nodeport}#${params.dp_port}#g' mysql_k8s.yaml > mysql_k8s.yaml" 
    				}
    			}
    		}
        }
    }
    
    
    

    7、使用可以使用kubectl的angent代理执行部署

    stage("update yaml"){
    	agent {label 'kubectl-agent'}
    	steps {
    	  dir("projdir"){
    	    sh "sed -e 's#{pv_name}#${params.pv_name}#g;s#{pv_volume}#${params.pv_volume}#g;s#{dp_name}#${params.dp_name}#g;s#{nodeport}#${params.dp_port}#g' mysql_k8s.yaml > mysql_k8s_temp.yaml"
    	    sh "kubectl apply -f mysql_k8s_temp.yaml"
    	  }
    	}
    }
    

    agent {label 'kubectl-agent'} 需要提前制作的docker agent代理
    网上有其他方案,将K8S_CONFIG中的内容进行base64解密并存为~/.kube/config配置文件,再从pipeline中读取并输出到.kube中,执行kubectl命令部署至k8s。

    8、完整的pipeline

    pipeline {
        agent any 
        parameters {
            string(name: 'pv_name', defaultValue: 'test_mysql', description: '请输入pv的名称 eg:test-mysql')
    		string(name: 'pv_volume', defaultValue: '5', description: '请输入pv的大小 eg:5')
    		string(name: 'dp_name', defaultValue: 'test_mysql', description: '请输入dp的名称 eg:test-mysql')
    		string(name: 'dp_port', defaultValue: '32260', description: '请输入dp的端口号 eg:32260')
        }
    	stages {
            stage('get_params'){
                steps {
                    echo "pv_name: ${params.pv_name}"
    				echo "pv_volume: ${params.pv_volume}"
    				echo "dp_name: ${params.dp_name}"
    				echo "dp_port: ${params.dp_port}"
                }
            }
    		stage("Git clone"){
    			steps {
    				//拉取front代码
    				echo "工作目录是:$WORKSPACE"
    				echo '正在拉取代码...'
    				dir("projdir"){
    					git  credentialsId: 'fad39094-6d07-4e3a-a86d-8b011f37b5de', url: 'http://192.168.2.32:8090/root/devops.git',branch:'master',changelog:true
    				}
    			}
    		}
    		stage("update yaml"){
    			agent {label 'kubectl-agent'}
    			steps {
    				dir("projdir"){
    					sh "sed -e 's#{pv_name}#${params.pv_name}#g;s#{pv_volume}#${params.pv_volume}#g;s#{dp_name}#${params.dp_name}#g;s#{nodeport}#${params.dp_port}#g' mysql_k8s.yaml > mysql_k8s_temp.yaml"
    					sh "kubectl apply -f mysql_k8s_temp.yaml"
    				}
    			}
    		}
        }
    }
    

    参考文档1
    参考文档2

    posted @ 2020-08-23 20:59  名字很长容易被惦记  阅读(556)  评论(0编辑  收藏  举报