
Задача следующая, удалять содержимое Persistent Storage для пода с Postgres базой данных при включенной опции при сборке в Jenkins.
Для удобства мое приложение называется: "myapplication"
manifest.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp2-myapplication
parameters:
fsType: ext4
type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
volumeBindingMode: Immediate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapplication-data
namespace: staging
spec:
storageClassName: gp2-myapplication
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: ConfigMap
metadata:
name: myapplication-postgres-config
namespace: staging
labels:
app: myapplication-postgres-app
data:
POSTGRES_DB: myapplication_database
POSTGRES_PASSWORD: PASSWORD
POSTGRES_USER: myapplication_user
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapplication-postgres-app
namespace: staging
labels:
app: myapplication-postgres-app
spec:
replicas: 1
selector:
matchLabels:
app: myapplication-postgres-app
strategy:
type: RollingUpdate
progressDeadlineSeconds: 300
template:
metadata:
labels:
app: myapplication-postgres-app
spec:
volumes:
- name: storage-myapplication
persistentVolumeClaim:
claimName: myapplication-data
containers:
- image: postgres
name: myapplication-postgres
imagePullPolicy: "IfNotPresent"
envFrom:
- configMapRef:
name: myapplication-postgres-config
ports:
- containerPort: 5432
volumeMounts:
- mountPath: "/usr/local/pgsql/data"
name: storage-myapplication
nodeSelector:
nodegroup: staging
---
apiVersion: v1
kind: Service
metadata:
name: postgres-db-myapplication
namespace: staging
spec:
ports:
- port: 5432
targetPort: 5432
selector:
app: myapplication-postgres-app
type: ClusterIP
Применим созданный манифест:
kubectl create -f manifest.yml
В Jenkins в MultibrachPipeline добавляем параметр сборки:
pipeline {
agent any
parameters {
booleanParam(name: 'reinitialize_psql', defaultValue: false, description: 'Allows you to reinitialize postgreSQL.')
}
И собственно шаг очистки:
stage ('Reinitialize postgreSQL.'){
when {
allOf {
branch 'staging'
expression { return params.reinitialize_psql }
}
}
steps {
sh "${KUBECTL} -n staging delete -f .jenkins/database.yml"
sh "sleep 30"
sh "${KUBECTL} -n staging apply -f .jenkins/database.yml"
}
}
Содержимое файла "database.yml" в директории ".jenkins"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapplication-data
namespace: staging
spec:
storageClassName: gp2-myapplication
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapplication-postgres-app
namespace: staging
labels:
app: myapplication-postgres-app
spec:
replicas: 1
selector:
matchLabels:
app: myapplication-postgres-app
strategy:
type: RollingUpdate
progressDeadlineSeconds: 300
template:
metadata:
labels:
app: myapplication-postgres-app
spec:
volumes:
- name: storage-myapplication
persistentVolumeClaim:
claimName: myapplication-data
containers:
- image: postgres
name: myapplication-postgres
imagePullPolicy: "IfNotPresent"
envFrom:
- configMapRef:
name: myapplication-postgres-config
ports:
- containerPort: 5432
volumeMounts:
- mountPath: "/usr/local/pgsql/data"
name: storage-myapplication
nodeSelector:
nodegroup: staging