Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes Volume Plugins: Flocker

Kubernetes Volume Plugins: Flocker

A practical example about how to do a k8s volume plugin as we did with Flocker.

Alexandre González

October 19, 2015
Tweet

More Decks by Alexandre González

Other Decks in Technology

Transcript

  1. TOC 1. Introduction to Flocker 2. Introduction to Kubernetes 3.

    Introduction to Flocker plugin 4. Code 5. Summary
  2. What else does it offer? • AWS EBSRackspace Cloud Block

    Storage • Anything that supports the OpenStack Cinder API • EMC ScaleIO • EMC XtremIO • Local storage using our ZFS driver (currently Experimental)
  3. k8s architecture Kubernetes master Replication controllers Node #1 Container #1

    Container #2 … Container #1 Container #2 … Kubelet Docker daemon Node #2 …
  4. How does Flocker fit in? Kubernetes master Replication controllers Node

    #1 Container/s Container/s Flocker Agents Kubelet Flocker Control Service Storage backend Docker daemon
  5. How to use it (1/2): Create volume with the flocker-cli:

    $ uft-flocker-volumes \
 --control-service=172.16.255.250
 create --node=43a06d55 \
 -m name=my-flocker-vol -s 10G $ uft-flocker-volumes \
 --control-service=172.16.255.250
 list-nodes
  6. How to use it (2/2): spec:
 containers:
 - name: web


    image: nginx
 ports:
 - name: web
 containerPort: 80
 volumeMounts:
 - name: www-root
 mountPath: "/usr/share/nginx/html"
 volumes:
 - name: www-root
 flocker:
 datasetName: my-flocker-vol
  7. API: pkg/api/{,v1/}types.go type VolumeSource struct {
 Flocker *FlockerVolumeSource `json:"flocker,omitempty"`
 …


    } type PersistentVolumeSource struct {
 Flocker *FlockerVolumeSource `json:"flocker,omitempty"`
 …
 } type FlockerVolumeSource struct {
 // Required: the volume name. This is going to be store on metadata -> name on the payload for Flocker
 DatasetName string `json:"datasetName"`
 }
  8. VolumePlugin interface type VolumePlugin interface {
 Init(host VolumeHost)
 Name() string


    CanSupport(spec *Spec) bool
 NewBuilder(
 s *Spec, pod *api.Pod, opts VolumeOptions
 ) (Builder, error)
 NewCleaner(
 name string, podUID types.UID
 ) (Cleaner, error)
 } https://github.com/kubernetes/kubernetes/blob/master/pkg/volume/plugins.go#L55-L81
  9. How was it used for Flocker? NewBuilder
 just creates the

    struct that will allow us to setup the datasets NewCleaner
 doing nothing
  10. Builder interface type Builder interface {
 Volume // gives GetPath()


    SetUp() error
 SetUpAt(dir string) error
 IsReadOnly() bool
 } https://github.com/kubernetes/kubernetes/blob/master/pkg/volume/volume.go#L34-L48
  11. How was it used for Flocker? Setup -> Calls SetUpAt

    the datasetName received by API get dataset check primary node update it ok error not there match sync
  12. Things that didn’t go well • OMG, CLAs! Sorry Matt!

    • Shippable and Jenkins • Creating the volume on SetUp • hack/ scripts
  13. What did we talk about? 1. Flocker & Kubernetes 2.

    Plugin for Flocker 3. Something you have seen in the code