LibCloud: Διαχείριση δημόσιων και ιδιωτικών cloud

dimitris | Τετ, 08/21/2013 - 08:28 | 14'

Παρουσιάζουμε τη βιβλιοθήκη libcloud που παρέχει ένα ενοποιημένο περιβάλλον διαχείρισης υπηρεσιών cloud και δοκιμάζουμε ορισμένες ενέργειες, όπως το reboot ενός server στο cloud EC2 της Amazon, και τη δημιουργία ενός virtual server μέσω εντολών!

Του Μάρκου Γώγουλου

To Cloud Computing είναι μια τεχνολογία που αφορά την παροχή υπολογιστικής ισχύς και αποθηκευτικού χώρου ως υπηρεσία προς τους τελικούς χρήστες.

Ο τομέας γνωρίζει μεγάλη άνθιση τα τελευταία χρόνια. Όλο και περισσότερες εταιρίες, οργανισμοί αλλά και απλοί χρήστες, μεταφέρουν κομμάτι της υπολογιστικής τους υποδομής και των δεδομένων τους σε δημόσια cloud, όπως αυτά που παρέχουν μεγάλοι πάροχοι (Amazon, Rackspace, Linode).

Επιπλέον έχουμε την εμφάνιση στην αγορά όλο και περισσότερων τεχνολογιών για την ανάπτυξη ιδιωτικών υπολογιστικών νεφών, πολλές από τις οποίες είναι ανοικτού κώδικα (π.χ. OpenStack, Ganeti, Eucalyptus) και σαν συνέπεια βλέπουμε όλο και περισσότερους οργανισμούς που αναπτύσσουν ιδιωτικά νέφη για τους χρήστες τους.

Κάθε πάροχος cloud computing υπηρεσιών διαθέτει στους πελάτες του και σχετικό web interface για τη διαχείριση των εικονικών μηχανών, δίσκων και δικτύων που τους παρέχει, καθώς και κάποιo προγραμματιστικό API για την ανάπτυξη εναλλακτικών εφαρμογών διαχείρισης.

Περι libcoud

Τόσο τα web interfaces, όσο και τα API που διαθέτουν οι κύριοι πάροχοι (π.χ. Amazon, Rackspace, κ.α.) διαφέρουν μεταξύ τους σε δομή, ευχρηστία και παρεχόμενη λειτουργικότητα. Διαφορετικές είναι και οι επιλογές σε υπολογιστική υποδομή, καθώς και οι τιμές που χρεώνουν οι πάροχοι, οπότε πολλοί τελικοί χρήστες καταλήγουν να χρησιμοποιούν περισσότερους από έναν παρόχους cloud ανάλογα με τα σενάρια χρήσης τους.


Οι Providers που υποστηρίζει η libcloud

Η libcloud είναι μια βιβλιοθήκη για Python και Java που δίνει μία όσο το δυνατόν ενιαία διεπαφή προγραμματισμού για τη διαχείριση εικονικών μηχανών, δίσκων και δικτύων σε πολλαπλά cloud computing backends. Με αυτό τον τρόπο επιλύει το πρόβλημα της ενιαίας διαχείρισης στα διαφορετικά clouds και να παρέχει έναν εύχρηστο τρόπο επικοινωνίας με τους παρόχους υπηρεσιών cloud. Έτσι είναι εύκολο μέσω αυτού του εργαλείου να επικοινωνήσουμε με όσους διαφορετικούς παρόχους cloud υποστηρίζει και να δημιουργήσουμε scripts ή εφαρμογές για τη διαχείριση των server μας.

Η libcloud είναι ανοιχτού κώδικα και δημιουργήθηκε το 2009 από την cloudkick.com ενώ πλέον είναι επίσημο project του Apache foundation. Η τρέχουσα stable έκδοση είναι η 0.9.1 και επιτρέπει να διαχειριζόμαστε τα εξής:

  • Cloud Servers που παρέχουν υπηρεσίες όπως το EC2 και το Rackspace CloudServers, μέσω των modules libcloud.compute.*
  • Cloud Storage που παρέχουν υπηρεσίες όπως τα Amazon S3 και Rackspace CloudFiles, μέσω των modules libcloud.storage.*
  • Υπηρεσίες Load Balancers, μέσω των modules libcloud.loadbalancer.*
  • Υπηρεσίες DNS, μέσω των modules libcloud.dns.*

Ορισμένοι απο τους providers που υποστηρίζει η libcloud είναι οι Amazon, Rackspace, Cloudsigma, Dreamhost, Gandi, Slicehost κα.

Χρήσιμοι όροι

Για να χρησιμοποιήσουμε την libcloud πρώτα ας έρθουμε σε επαφή με την ορολογία της. Οι κύριοι όροι είναι οι εξής:

providers. Ένας provider είναι μια υπηρεσία cloud, όπως το Amazon EC2, ή το Rackspace. Κάθε provider είναι προσβάσιμος μέσω του αντίστοιχου driver της libcloud.

nodes. Ένα node είναι ο virtual server μας, σε κάποιον provider.

images. Τα images είναι τα λειτουργικά συστήματα τα οποία παρέχει ένας provider προς deployment. Ο κάθε provider παρέχει τα δικά του images. Ένα Image πχ που παρέχει το Rackspace είναι το Ubuntu 11.10 Server.

sizes. Ένα size αντιπροσωπεύει την υπολογιστική ισχύ, αποθηκευτικό χώρο και δικτυακό bandwidth τα οποία παρέχει ένας provider για έναν συγκεκριμένο virtual server που μπορούμε να δημιουργήσουμε. Είναι προφανές οτι το κόστος των sizes μεγαλώνει όσο αυξάνονται οι παροχές! Ένα image πχ για τo Amazon EC2 είναι το medium, με 4G μνήμη και 400G δίσκο

locations. Ένα location αντιστοιχεί σε μια γεωγραφική τοποθεσία για κάθε provider. Για παράδειγμα, ένα location του Amazon EC2 είναι το us-east-1a (Amazon US N. Virginia)

Λειτουργίες

Μέσω του αντίστοιχου driver για τον κάθε provider, έχουμε και τις αντίστοιχες δυνατότητες στην libcloud. Όλοι οι drivers υποστηρίζουν κάποιες βασικές λειτουργίες, ενώ ορισμένοι drivers περιλαμβάνουν και επιπρόσθετες λειτουργίες .

Οι βασικές λειτουργίες είναι οι μέθοδοι:

  • list_images() , όπου παίρνουμε μια λίστα με τα images που υποστηρίζει ο provider
  • list_sizes() , όπου παίρνουμε τα sizes
  • list_locations() , όπου παίρνουμε τα locations
  • list_nodes() , όπου παίρνουμε τα nodes μας, εφόσον φυσικά έχουμε
  • create_node() , για να δημιουργήσουμε ένα node, αφού προσδιορίσουμε τα κατάλληλα ορίσματα φυσικά
  • destroy_node() , για τη διαγραφή ενός node
  • reboot_node() , για να κάνουμε reboot ένα node

Μέσω της τεκμηρίωσης της libcloud, ή με dir() στην python μπορούμε να δούμε τις μεθόδους που υποστηρίζει ένας driver.

Εγκατάσταση

Ήρθε η ώρα να περάσουμε στην πράξη. Θα εγκαταστήσουμε τη libcloud με έναν από τους παρακάτω διαφορετικούς τρόπους.

- Σαν πακέτο στη διανομή μας, πχ  στα Debian/Ubuntu:

apt-get install python-libcloud

- Μέσω του easy_install εργαλείου της python. easy_install apache-libcloud ή του pip, για να μπορούμε να κάνουμε και upgrade (pip install --upgrade apache-libcloud)

- Κάνοντας clone το git repository στο github.

git clone https://github.com/apache/libcloud.git

Ο πρώτος τρόπος έχει το μειονέκτημα οτι θα έχουμε παλιότερη έκδοση της libcloud, μιας και το πακέτο ανανεώνεται απο την διανομή και άρα θα είναι μονίμως κάποια παλιότερη έκδοση.

Η ανάπτυξη της libcloud είναι ραγδαία, όπως μπορεί να διαπιστώσει κανείς παρακολουθώντας το ρυθμό των commits στο github, οπότε αν θέλουμε να είμαστε συνεχώς στην πιο πρόσφατη έκδοση δεν έχουμε παρά να ακολουθήσουμε τον τρίτο δρόμο!

Σύνδεση με τον Amazon EC2 driver

Με την libcloud εγκατεστημένη είναι ώρα να ξεκινήσουμε.

>>> from libcloud.compute.types import Provider
>>> from libcloud.compute.providers import get_driver
#κάνουμε τα απαραίτητα imports
>>> EC2_ACCESS_ID = 'ABC'
>>> EC2_SECRET_KEY = 'DEF'
#προσδιορίζουμε τα προσωπικά στοιχεία για τη σύνδεση
>>> Driver = get_driver(Provider.EC2)
>>> conn = Driver(EC2_ACCESS_ID, EC2_SECRET_KEY)
#επιλέγουμε τον driver
>>> conn.name
'Amazon EC2 (us-east-1)'
>>> dir(conn)
…
'connection', 'connectionCls', 'country', 'create_node', 'deploy_node', 'destroy_node', 'ex_associate_addresses','ex_import_keypair', 'ex_list_availability_zones', 'ex_modify_instance_attribute', 'list_images', 'list_locations', 'list_nodes', 'list_sizes'
...
#βλέπουμε τις μεθόδους και τις ιδιότητες

Έχοντας εγκαταστήσει σύνδεση με τον Amazon EC2, ας τρέξουμε κάποια χρήσιμα functions που έχουν αναφερθεί πιο πάνω.

>>> conn.list_sizes()
[<NodeSize: id=m1.medium, name=Medium Instance, ram=3700 disk=410 bandwidth=None price=0.16 driver=Amazon EC2 (us-east-1) ...>, <NodeSize: id=cg1.4xlarge, name=Cluster GPU Quadruple Extra Large Instance,
...
]
>>> len(conn.list_sizes() )
13
#η Amazon παρέχει 13 sizes
>>> conn.list_locations()
[<EC2NodeLocation: id=0, name=Amazon US N. Virginia, country=US, availability_zone=us-east-1a driver=Amazon EC2 (us-east-1)>,
...
]
>>> len(conn.list_locations() )
4
>>> images = conn.list_images()
>>> len(images)
11021
#Η amazon παρέχει 11021 διαφορετικά images!!!
>>> images[0]
<NodeImage: id=aki-00806369, name=karmic-kernel-zul/ubuntu-kernel-2.6.31-300-ec2-i386-20091001-test-04.manifest.xml, driver=Amazon EC2 (us-east-1) ...>
>>> nodes = conn.list_nodes()
#παίρνουμε τα nodes μας
>>> nodes
[<Node: uuid=hdjd8333344444fbece2c7ce292167792fd674f6c, name=ec2Web, state=0, public_ips=['127.12.124.10', '137.12.14.11'], provider=Amazon EC2 (us-east-1) ...>, <Node: uuid=2da116d197e4170e31ab45a981...]
>>> node1=nodes[0]
>>> dir(node1)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_private_ips', '_get_public_ips', '_set_private_ips', '_set_public_ips', '_uuid', 'destroy', 'driver', 'extra', 'get_uuid', 'id', 'image', 'name', 'private_ip', 'private_ips', 'public_ip', 'public_ips', 'reboot', 'size', 'state', 'uuid']
#βλέπουμε τις μεθόδους που παρέχει ο Amazon driver για τα nodes.
>>> node1.extra
#εδώ παίρνουμε τα metadata ή tags για το συγκεκριμένο node

Μπορούμε να κάνουμε reboot στο node αυτό με τη μέθοδο reboot()

>>> node1.reboot()

Ενώ μπορούμε να το διαγράψουμε με τη μέθοδο destroy()

>>> node1.destroy()

Για να ορίσουμε metadata στο node μας χρησιμοποιούμε την ex_create_tags. Π.χ.

>>> metadata = {'Purpose': 'Testing Web Server'}
>>> conn.ex_create_tags(node1, metadata)
>>> conn.ex_describe_tags(node1)
{'Name': 'ec2Web', 'tags': "{'something1','something2'}", 'Purpose': 'Testing Web Server'}

 

Δημιουργία node

Μια απο τις πιο χρήσιμες επιλογές. Αφού έχουμε συνδεθεί με τον driver του παρόχου που μας ενδιαφέρει, προσδιορίζουμε όνομα, size και image και το node μας θα δημιουργηθεί.

Παράδειγμα

>>> node = conn.create_node(name='test linuxinside', image=images[0], size=sizes[0])

Μπορούμε επίσης να προσδιορίσουμε το location καθώς και post installation βήματα μέσω των σχετικών μεθόδων. Με αυτό τον τρόπο μπορούμε να θέσουμε το ιδιωτικό μας κλειδί ώστε να μπούμε στον server με ssh μόλις δημιουργηθεί, ή να εκτελέσουμε ένα script με εντολές, χρήσιμο για πολλαπλά deployments.

Υπάρχοντα projects

Έχουν αναπτυχθεί διάφορα εργαλεία, command line, web και scripts που βασίζονται στην libcloud και επιτρέπουν τη διαχείριση cloud. Ορισμένα απο αυτά είναι και open source. Μπορούμε να δούμε τη λίστα στο http://libcloud.apache.org/whos-using.html

Mist.io

Η Unweb.me αναπτύσσει μια mobile friendly υπηρεσία για τη διαχείριση και monitoring των virtual servers σε διαφορετικά clouds. Ο πυρήνας της υπηρεσίας θα κυκλοφορήσει σαν ανοιχτό λογισμικό, το μεγαλύτερο μέρος της online υπηρεσίας θα είναι δωρεάν, ενώ θα υπάρχει χρέωση για πιο πολύπλοκες λειτουργίες. Το project βρίσκεται σε alpha έκδοση στη διεύθυνση https://mist.io

 

Σύνδεσμοι

[1] Η σελίδα της libcloud: http://libcloud.apache.org
[2] Ένα tutorial: http://goo.gl/gXNKi
[3] Τεκμηρίωση: : http://libcloud.apache.org/docs/
[4] API Reference Documentation: http://libcloud.apache.org/apidocs/.

 

 

Ο ΣΥΓΓΡΑΦΕΑΣ ΤΟΥ ΑΡΘΡΟΥ

Ο Μάρκος είναι software engineer και ιδρυτικό μέλος της Unweb.me...

 

Δώσε αστέρια!

MO: 5 (ψήφοι: 1)