Feature/persistent volumes
This commit is contained in:
parent
ae77fa15e8
commit
a2e78ac2ec
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue