使用pipeline快速構建mysql容器併發布到K8S
阿新 • • 發佈:2020-08-23
目錄
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 "[email protected]"
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"
}
}
}
}
}