RWX volume provided by storageclass

This commit is contained in:
Laszlo Fogas
2019-04-14 09:48:26 +02:00
parent f7fe9edd0b
commit 015c03b4bb
3 changed files with 33 additions and 90 deletions

View File

@@ -517,10 +517,24 @@ var flags = []cli.Flag{
Name: "kubernetes",
Usage: "Kubernetes backend is enabled",
},
cli.StringFlag{
EnvVar: "DRONE_KUBERNETES_NAMESPACE",
Name: "namespace",
Usage: "Kubernetes namespace to create resource in",
},
cli.StringFlag{
EnvVar: "DRONE_KUBERNETES_STORAGECLASS",
Name: "storageclass",
Usage: "Kubernetes storageclass to use for volumes",
},
cli.StringFlag{
EnvVar: "DRONE_KUBERNETES_VOLUME_SIZE",
Name: "volumesize",
Usage: "Size of the volume available for the pipeline",
},
}
func server(c *cli.Context) error {
// debug level if requested by user
if c.Bool("debug") {
logrus.SetLevel(logrus.DebugLevel)
@@ -601,7 +615,7 @@ func server(c *cli.Context) error {
}
log.Printf("pipeline: received next execution: %s", work.ID)
engine, err := kubernetes.New()
engine, err := kubernetes.New(c.String("namespace"), c.String("storageclass"), c.String("volumesize"))
if err != nil {
logrus.Error(err)
return err

View File

@@ -6,7 +6,6 @@ import (
"fmt"
"io"
"io/ioutil"
"math/rand"
"strings"
"time"
@@ -25,13 +24,15 @@ import (
)
type engine struct {
logs *bytes.Buffer
kubeClient kubernetes.Interface
namespace string
logs *bytes.Buffer
kubeClient kubernetes.Interface
namespace string
storageClass string
volumeSize string
}
// New returns a new Kubernetes Engine.
func New() (backend.Engine, error) {
func New(namespace1 string, storageClass1 string, size string) (backend.Engine, error) {
var kubeClient kubernetes.Interface
_, err := rest.InClusterConfig()
if err != nil {
@@ -45,9 +46,11 @@ func New() (backend.Engine, error) {
}
return &engine{
logs: new(bytes.Buffer),
kubeClient: kubeClient,
namespace: "default",
logs: new(bytes.Buffer),
kubeClient: kubeClient,
namespace: namespace1,
storageClass: storageClass1,
volumeSize: size,
}, nil
}
@@ -55,38 +58,9 @@ func New() (backend.Engine, error) {
func (e *engine) Setup(ctx context.Context, conf *backend.Config) error {
e.logs.WriteString("Setting up Kubernetes primitives\n")
// We don't need to create a PVC if no volumes are requested
if len(conf.Volumes) == 0 {
return nil
}
nodeList, err := e.kubeClient.CoreV1().Nodes().List(metav1.ListOptions{})
if err != nil {
return err
}
var nodeNames []string
for _, n := range nodeList.Items {
nodeNames = append(nodeNames, n.Name)
}
// Pick random node for now.
var node string
if len(nodeNames) == 1 {
node = nodeNames[0]
} else {
node = nodeNames[rand.Intn(len(nodeNames)-1)]
}
for _, vol := range conf.Volumes {
pv := PersistentVolume(node, e.namespace, vol.Name)
_, err := e.kubeClient.CoreV1().PersistentVolumes().Create(pv)
if err != nil {
return err
}
pvc := PersistentVolumeClaim(e.namespace, vol.Name)
_, err = e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Create(pvc)
pvc := PersistentVolumeClaim(e.namespace, vol.Name, e.storageClass, e.volumeSize)
_, err := e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Create(pvc)
if err != nil {
return err
}
@@ -264,17 +238,11 @@ func (e *engine) Destroy(ctx context.Context, conf *backend.Config) error {
}
for _, vol := range conf.Volumes {
pvc := PersistentVolumeClaim(e.namespace, vol.Name)
pvc := PersistentVolumeClaim(e.namespace, vol.Name, e.storageClass, e.volumeSize)
err := e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Delete(pvc.Name, deleteOpts)
if err != nil {
return err
}
pv := PersistentVolume("", e.namespace, vol.Name)
err = e.kubeClient.CoreV1().PersistentVolumes().Delete(pv.Name, deleteOpts)
if err != nil {
return err
}
}
return nil

View File

@@ -8,46 +8,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
var (
volumeSize = resource.MustParse("1Gi")
)
func PersistentVolume(node, namespace, name string) *v1.PersistentVolume {
return &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
Name: volumeName(name),
Namespace: namespace,
},
Spec: v1.PersistentVolumeSpec{
Capacity: v1.ResourceList{
v1.ResourceStorage: volumeSize,
},
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimRetain,
StorageClassName: "local-storage",
PersistentVolumeSource: v1.PersistentVolumeSource{
Local: &v1.LocalVolumeSource{
Path: "/tmp/drone",
},
},
NodeAffinity: &v1.VolumeNodeAffinity{
Required: &v1.NodeSelector{
NodeSelectorTerms: []v1.NodeSelectorTerm{{
MatchExpressions: []v1.NodeSelectorRequirement{{
Key: "kubernetes.io/hostname",
Operator: v1.NodeSelectorOpIn,
Values: []string{node},
}},
}},
},
},
},
}
}
func PersistentVolumeClaim(namespace, name string) *v1.PersistentVolumeClaim {
localStorageClass := "local-storage"
func PersistentVolumeClaim(namespace, name string, storageClass string, size string) *v1.PersistentVolumeClaim {
return &v1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: volumeName(name),
@@ -55,10 +16,10 @@ func PersistentVolumeClaim(namespace, name string) *v1.PersistentVolumeClaim {
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
StorageClassName: &localStorageClass,
StorageClassName: &storageClass,
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: volumeSize,
v1.ResourceStorage: resource.MustParse(size),
},
},
},