Feature/persistent volumes

This commit is contained in:
Oleksii Kliukin 2017-03-07 13:36:48 +01:00 committed by Murat Kabilov
parent ae77fa15e8
commit a2e78ac2ec
4 changed files with 49 additions and 20 deletions

View File

@ -3,13 +3,13 @@ kind: "Postgresql"
metadata: metadata:
name: testcluster name: testcluster
namespace: acid namespace: default
spec: spec:
teamId: "50051320" teamId: "50051320"
volume: volume:
size: 100Gi size: 10Gi
storageClass: gp2 storageClass: standard
numberOfInstances: 3 numberOfInstances: 3
users: #Application/Robot users users: #Application/Robot users
jdoe: jdoe:

View File

@ -200,10 +200,14 @@ func (c *Cluster) Create() error {
func (c *Cluster) Update(newSpec *spec.Postgresql, rollingUpdate bool) error { func (c *Cluster) Update(newSpec *spec.Postgresql, rollingUpdate bool) error {
nSpec := newSpec.Spec nSpec := newSpec.Spec
cSpec := c.Spec
clusterName := c.ClusterName() clusterName := c.ClusterName()
volumeSize := cSpec.Volume.Size
volumeStorageClass := cSpec.Volume.StorageClass
resourceList := resources.ResourceList(nSpec.Resources) resourceList := resources.ResourceList(nSpec.Resources)
template := resources.PodTemplate(clusterName, resourceList, c.dockerImage, nSpec.Version, c.etcdHost) template := resources.PodTemplate(clusterName, resourceList, c.dockerImage, nSpec.Version, c.etcdHost)
statefulSet := resources.StatefulSet(clusterName, template, nSpec.NumberOfInstances) volumeClaimTemplate := resources.VolumeClaimTemplate(volumeSize, volumeStorageClass)
statefulSet := resources.StatefulSet(clusterName, template, volumeClaimTemplate, nSpec.NumberOfInstances)
//TODO: mind the case of updating allowedSourceRanges //TODO: mind the case of updating allowedSourceRanges
err := c.updateStatefulSet(statefulSet) err := c.updateStatefulSet(statefulSet)

View File

@ -104,10 +104,13 @@ func (c *Cluster) ListResources() error {
func (c *Cluster) createStatefulSet() (*v1beta1.StatefulSet, error) { func (c *Cluster) createStatefulSet() (*v1beta1.StatefulSet, error) {
cSpec := c.Spec cSpec := c.Spec
volumeSize := cSpec.Volume.Size
volumeStorageClass := cSpec.Volume.StorageClass
clusterName := c.ClusterName() clusterName := c.ClusterName()
resourceList := resources.ResourceList(cSpec.Resources) resourceList := resources.ResourceList(cSpec.Resources)
template := resources.PodTemplate(clusterName, resourceList, c.dockerImage, cSpec.Version, c.etcdHost) template := resources.PodTemplate(clusterName, resourceList, c.dockerImage, cSpec.Version, c.etcdHost)
statefulSet := resources.StatefulSet(clusterName, template, cSpec.NumberOfInstances) volumeClaimTemplate := resources.VolumeClaimTemplate(volumeSize, volumeStorageClass)
statefulSet := resources.StatefulSet(clusterName, template, volumeClaimTemplate, cSpec.NumberOfInstances)
statefulSet, err := c.config.KubeClient.StatefulSets(statefulSet.Namespace).Create(statefulSet) statefulSet, err := c.config.KubeClient.StatefulSets(statefulSet.Namespace).Create(statefulSet)
if k8sutil.ResourceAlreadyExists(err) { if k8sutil.ResourceAlreadyExists(err) {
@ -145,11 +148,11 @@ func (c *Cluster) deleteStatefulSet(statefulSet *v1beta1.StatefulSet) error {
} }
func (c *Cluster) createEndpoint() (*v1.Endpoints, error) { func (c *Cluster) createEndpoint() (*v1.Endpoints, error) {
endpoint := resources.Endpoint(c.ClusterName()) endpointSpec := resources.Endpoint(c.ClusterName())
endpoint, err := c.config.KubeClient.Endpoints(endpoint.Namespace).Create(endpoint) endpoint, err := c.config.KubeClient.Endpoints(endpointSpec.Namespace).Create(endpointSpec)
if k8sutil.ResourceAlreadyExists(err) { if k8sutil.ResourceAlreadyExists(err) {
return nil, fmt.Errorf("Endpoint '%s' already exists", util.NameFromMeta(endpoint.ObjectMeta)) return nil, fmt.Errorf("Endpoint '%s' already exists", util.NameFromMeta(endpointSpec.ObjectMeta))
} }
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -17,6 +17,7 @@ import (
const ( const (
superuserName = "postgres" superuserName = "postgres"
replicationUsername = "replication" replicationUsername = "replication"
dataVolumeName = "pgdata"
) )
func credentialSecretName(clusterName, username string) string { func credentialSecretName(clusterName, username string) string {
@ -147,7 +148,7 @@ bootstrap:
}, },
VolumeMounts: []v1.VolumeMount{ VolumeMounts: []v1.VolumeMount{
{ {
Name: "pgdata", Name: dataVolumeName,
MountPath: "/home/postgres/pgdata", //TODO: fetch from manifesto MountPath: "/home/postgres/pgdata", //TODO: fetch from manifesto
}, },
}, },
@ -158,13 +159,7 @@ bootstrap:
podSpec := v1.PodSpec{ podSpec := v1.PodSpec{
ServiceAccountName: constants.ServiceAccountName, ServiceAccountName: constants.ServiceAccountName,
TerminationGracePeriodSeconds: &terminateGracePeriodSeconds, TerminationGracePeriodSeconds: &terminateGracePeriodSeconds,
Volumes: []v1.Volume{ Containers: []v1.Container{container},
{
Name: "pgdata",
VolumeSource: v1.VolumeSource{EmptyDir: &v1.EmptyDirVolumeSource{}},
},
},
Containers: []v1.Container{container},
} }
template := v1.PodTemplateSpec{ template := v1.PodTemplateSpec{
@ -179,7 +174,33 @@ bootstrap:
return &template return &template
} }
func StatefulSet(cluster spec.ClusterName, podTemplate *v1.PodTemplateSpec, numberOfInstances int32) *v1beta1.StatefulSet { func VolumeClaimTemplate(volumeSize, volumeStorageClass string) *v1.PersistentVolumeClaim {
metadata := v1.ObjectMeta{
Name: dataVolumeName,
}
if volumeStorageClass != "" {
// TODO: check if storage class exists
metadata.Annotations = map[string]string{"volume.beta.kubernetes.io/storage-class": volumeStorageClass}
} else {
metadata.Annotations = map[string]string{"volume.alpha.kubernetes.io/storage-class": "default"}
}
volumeClaim := &v1.PersistentVolumeClaim{
ObjectMeta: metadata,
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: resource.MustParse(volumeSize),
},
},
},
}
return volumeClaim
}
func StatefulSet(cluster spec.ClusterName, podTemplate *v1.PodTemplateSpec,
persistenVolumeClaim *v1.PersistentVolumeClaim, numberOfInstances int32) *v1beta1.StatefulSet {
statefulSet := &v1beta1.StatefulSet{ statefulSet := &v1beta1.StatefulSet{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: v1.ObjectMeta{
Name: cluster.Name, Name: cluster.Name,
@ -187,9 +208,10 @@ func StatefulSet(cluster spec.ClusterName, podTemplate *v1.PodTemplateSpec, numb
Labels: labelsSet(cluster.Name), Labels: labelsSet(cluster.Name),
}, },
Spec: v1beta1.StatefulSetSpec{ Spec: v1beta1.StatefulSetSpec{
Replicas: &numberOfInstances, Replicas: &numberOfInstances,
ServiceName: cluster.Name, ServiceName: cluster.Name,
Template: *podTemplate, Template: *podTemplate,
VolumeClaimTemplates: []v1.PersistentVolumeClaim{*persistenVolumeClaim},
}, },
} }