• 使用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

      --------------------------------------------------------- 恐惧是因为努力的还不够,加油 ~~---------------------------------------------
    • 相关阅读:
      痛苦之旅——安装Eric4
      如何把自己写的python程序给别人用
      (转)史上最好的Python线程指南
      (转)python编码问题
      Beautiful Soup的一些中文资料
      oracle监听配置
      redhat6.5安装oracle 11g
      《深入浅出MFC》– Document-View深入探讨
      CAS解扰小结
      ts包、表、子表、section的关系
    • 原文地址:https://www.cnblogs.com/zhaobowen/p/13526910.html
    Copyright © 2020-2023  润新知