Panduan ini untuk pengembang perangkat lunak berpengalaman yang ingin mengerahkan aplikasi ke awan OpenStack.
Jika Anda sudah familiar dengan OpenStack namun belum membuat aplikasi cloud secara umum atau aplikasi OpenStack pada khususnya, bagian ini mengajarkan Anda bagaimana memprogram dengan komponen OpenStack.
Menerapkan aplikasi di lingkungan awan bisa sangat berbeda dengan menerapkannya di lingkungan TI tradisional. Panduan ini mengajarkan Anda cara menerapkan aplikasi pada OpenStack dan beberapa praktik terbaik untuk pengembangan aplikasi awan.
Tutorial ini menunjukkan dua aplikasi. Aplikasi pertama adalah generator fraktal sederhana yang menggunakan persamaan matematis untuk menghasilkan keindahan fractal images. Kami menunjukkan aplikasi ini secara keseluruhan sehingga Anda bisa membandingkannya dengan aplikasi kedua yang lebih kuat.
Aplikasi kedua adalah aplikasi OpenStack yang memungkinkan Anda untuk:
Buat dan hapus sumber daya komputasi. Sumber daya ini adalah instance mesin virtual tempat aplikasi Fractals berjalan.
Buat keputusan arsitektur cloud-related seperti mengubah fraction menjadi layanan micro-service dan memodulasinya.
Skala sumber daya yang tersedia naik dan turun.
Gunakan penyimpanan Object dan Block untuk file dan database persistence.
Gunakan layanan Orchestration untuk menyesuaikan diri secara otomatis dengan lingkungan.
Sesuaikan jaringan untuk kinerja dan segregasi yang lebih baik.
Jelajahi dan terapkan fitur awan OpenStack yang canggih.
Siapapun dengan latar belakang pemrograman dapat dengan mudah membaca kode dalam panduan ini. Meskipun panduan ini berfokus pada SDK tertentu, Anda dapat menggunakan bahasa dan toolkit lain dengan awan OpenStack:
Bahasa |
Nama |
Deskripsi |
URL |
---|---|---|---|
Python |
OpenStack SDK |
Perpustakaan berbasis Python yang resmi untuk OpenStack. |
|
Python |
Perpustakaan berbasis Python yang dikelola Apache Foundation. Gunakan untuk bekerja dengan beberapa jenis awan. |
https://libcloud.readthedocs.org/en/latest/compute/drivers/openstack.html |
|
Python |
Shade |
Perpustakaan berbasis Python yang dikembangkan oleh tim OpenStack Infra. Gunakan untuk mengoperasikan beberapa awan OpenStack. |
|
Java |
Perpustakaan berbasis Java yang dikelola Apache Foundation. Gunakan untuk bekerja dengan beberapa jenis awan. |
||
Ruby |
SDK berbasis Ruby. Gunakan untuk bekerja dengan beberapa awan. |
https://github.com/fog/fog-openstack/blob/master/docs/getting_started.md |
|
node.js |
SDK berbasis Node.js. Gunakan bekerja dengan banyak awan. |
https://github.com/pkgcloud/pkgcloud/tree/master/docs/providers/openstack |
|
PHP |
Sebuah perpustakaan berbasis PHP. Gunakan untuk menulis kode PHP yang bekerja dengan awan OpenStack. |
http://php-opencloud.readthedocs.org/en/latest/getting-started-with-openstack.html |
|
.NET Framework |
OpenStack SDK untuk Microsoft .NET |
Perpustakaan berbasis .NET. Gunakan untuk menulis kode C ++ atau C # untuk aplikasi Microsoft. |
|
Go |
SDK berbasis go. Gunakan untuk menulis kode Golang yang bekerja dengan awan OpenStack. |
Untuk daftar SDK yang tersedia, lihat Software Development Kits.
Versi lain dari panduan ini menunjukkan cara menggunakan SDK dan bahasa lainnya untuk menyelesaikan tugas ini. Jika Anda adalah pengembang untuk toolkit lain yang ingin disertakan dalam panduan ini, jangan ragu untuk mengirimkan cuplikan kode. Untuk informasi lebih lanjut, hubungi anggota OpenStack Documentation team.
Kami berasumsi bahwa Anda sudah dapat mengakses awan OpenStack. Anda harus memiliki sebuah proyek, juga dikenal sebagai tenant (penyewa), dengan kuota minimal enam instance. Karena aplikasi Fractals berjalan di distribusi berbasis Ubuntu, Debian, Fedora, dan openSUSE, Anda harus membuat instance yang menggunakan salah satu dari sistem operasi ini.
Untuk berinteraksi dengan awan, Anda juga harus memiliki
a recent version of shade installed.
Catatan
Sebelum melanjutkan, pasang versi terbaru dari shade (naungan).
Dapatkan informasi berikut dari penyedia awan Anda:
auth URL
user name
password
ID atau nama proyek (proyek juga dikenal sebagai tenant/penyewa)
cloud region
Anda juga bisa mendownload file RC OpenStack dari dashboard Horizon OpenStack. Masuk ke dasbor dan klik Project->Access & Security->API Access->Download OpenStack RC file. Jika Anda menggunakan metode ini, perhatikan bahwa "URL auth" tidak termasuk jalurnya. Misalnya, jika file openrc.sh
Anda menunjukkan:
export OS_AUTH_URL=http://controller:5000/v2.0
URL auth sebenarnya adalah:
http://controller:5000
Dalam tutorial ini, Anda berinteraksi dengan awan OpenStack Anda melalui SDK yang Anda pilih di "Choose your OpenStack SDK." Panduan ini mengasumsikan bahwa Anda tahu cara menjalankan code snippet (cuplikan kode) dalam bahasa pilihan Anda.
Catatan
Karena tutorialnya menggunakan kembali obyek conn
, pastikan selalu ada yang berguna.
Gunakan kredensial Anda di atas untuk menentukan nama penyedia awan, nama pengguna, kata sandi, project_name dan region_name dalam file ~/.config/openstack/clouds.yml
.
clouds:
myfavoriteopenstack:
auth:
auth_url: https://controller:5000/
username: $YOUR_USERNAME
password: $YOUR_PASSWORD
project_name: $YOUR_PROJECT
region_name: $REGION
Catatan
Jika Anda menggunakan cloud publik known by shade <https://opendev.org/openstack/os-client-config/src/os_client_config/vendors> _, Anda dapat menghindari menentukan: code: auth_url: dan sebagai gantinya sebutkan :code: profil: $ PROVIDER_NAME dalam file clouds.yml.
Untuk mengkonfigurasi shade (naungan) menggunakan profil, gunakan kredensial Anda di atas untuk menentukan nama provider awan, nama pengguna, kata sandi, nama proyek, dan nama wilayah dalam file ~/.config/openstack/clouds.yml
.
my-provider:
profile: $PROVIDER_NAME
auth:
username: $YOUR_USERNAME
password: $YOUR_PASSWORD
project_name: $YOUR_PROJECT
region_name: $REGION
Lihat configure shade, untuk mengkonfigurasi cloud Anda menggunakan profil.
from shade import *
simple_logging(debug=True)
conn = openstack_cloud(cloud='myfavoriteopenstack')
Untuk menjalankan aplikasi Anda, Anda harus meluncurkan sebuah instance. Contoh ini berfungsi sebagai mesin virtual.
Untuk meluncurkan sebuah instance, Anda memilih flavor dan image. Flavor mewakili ukuran instance, termasuk jumlah CPU dan jumlah RAM dan ruang disk. Image adalah instalasi OS yang disiapkan dari mana Anda mengkloning instance Anda. Saat Anda melakukan booting di awan publik, flavor yang lebih besar bisa lebih mahal daripada yang lebih kecil dari segi sumber daya dan biaya moneter.
Untuk daftar image yang tersedia di awan Anda, jalankan beberapa panggilan API:
images = conn.list_images()
for image in images:
print(image)
Kode ini menghasilkan output seperti ini:
checksum: 750a56555d4ec7303f5dc33b007ff632
container_format: bare
created_at: '2014-07-14T19:02:15Z'
direct_url:
rbd://7e14670e-a6f8-445b-b632-4b79bafc4781/masseffect-images/b4efbc2a-6130-4f2e-b436-55a618c4de20/snap
disk_format: raw
file: /v2/images/b4efbc2a-6130-4f2e-b436-55a618c4de20/file
id: b4efbc2a-6130-4f2e-b436-55a618c4de20
min_disk: 10
min_ram: 1024
name: Debian-7.0-Wheezy
owner: 0bacd8121bb548698f340455b38bf561
protected: false
schema: /v2/schemas/image
size: 5242880000
status: active
tags: []
updated_at: '2014-10-15T22:42:52Z'
visibility: public
Anda juga bisa mendapatkan informasi tentang flavor yang tersedia:
flavors = conn.list_flavors()
for flavor in flavors:
print(flavor)
Kode ini menghasilkan output seperti ini:
HUMAN_ID: true
NAME_ATTR: name
OS-FLV-DISABLED:disabled: false
OS-FLV-EXT-DATA:ephemeral: 0
disk: 80
ephemeral: 0
human_id: supersonic
id: '200'
is_public: true
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/flavors/200
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/200
rel: bookmark
name: supersonic
os-flavor-access:is_public: true
ram: 2048
swap: ''
vcpus: 1
Flavor dan image Anda akan berbeda, tentu saja.
Pilih flavor dan image untuk instance Anda. Anda memerlukan RAM 1GB, 1 CPU, dan disk 1GB. Contoh ini menggunakan image Ubuntu dengan sedikit flavor, yang merupakan pilihan yang aman. Di bagian tutorial berikutnya dalam panduan ini, Anda harus mengubah ID image dan flavor agar sesuai dengan image dan flavor yang Anda pilih.
Jika image yang Anda inginkan tidak tersedia di awan Anda, biasanya Anda dapat mengunggahnya berdasarkan setelan kebijakan awan Anda. Untuk informasi tentang cara mengunggah image, lihat obtaining images.
Tetapkan variabel image dan ukuran ke nilai yang sesuai untuk awan Anda. Kami akan menggunakan variabel-variabel ini di bagian selanjutnya.
Pertama, beritahu koneksi untuk mendapatkan image tertentu dengan menggunakan ID image yang Anda pilih di bagian sebelumnya:
image_id = 'c55094e9-699c-4da9-95b4-2e2e75f4c66e'
image = conn.get_image(image_id)
print(image)
Kode ini menghasilkan output seperti ini:
checksum: da578dd59289a35a0ac7744a0bd85cf5
container_format: bare
created_at: '2014-10-27T22:05:37Z'
direct_url:
rbd://7e14670e-a6f8-445b-b632-4b79bafc4781/masseffect-images/c55094e9-699c-4da9-95b4-2e2e75f4c66e/snap
disk_format: raw
file: /v2/images/c55094e9-699c-4da9-95b4-2e2e75f4c66e/file
id: c55094e9-699c-4da9-95b4-2e2e75f4c66e
min_disk: 0
min_ram: 0
name: Ubuntu-14.04-Trusty
owner: 0bacd8121bb548698f340455b38bf561
protected: false
schema: /v2/schemas/image
size: 10737418240
status: active
tags: []
updated_at: '2014-10-27T22:08:55Z'
visibility: public
Selanjutnya, beritahu script yang flavor ingin Anda gunakan:
Tentukan ID flavor yang ingin Anda gunakan.
flavor_id = '100'
flavor = conn.get_flavor(flavor_id)
print(flavor)
Kode ini menghasilkan output seperti ini:
HUMAN_ID: true
NAME_ATTR: name
OS-FLV-DISABLED:disabled: false
OS-FLV-EXT-DATA:ephemeral: 0
disk: 80
ephemeral: 0
human_id: subsonic
id: '100'
is_public: true
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: bookmark
name: subsonic
os-flavor-access:is_public: true
ram: 1024
swap: ''
vcpus: 1
Sekarang, Anda bisa meluncurkan instance.
Gunakan flavor dan image pilihan Anda untuk membuat sebuah instance.
Catatan
Contoh pembuatan instance berikut mengasumsikan bahwa Anda memiliki jaringan single-tenant. Jika Anda menerima kesalahan'Exception: 400 Bad Request Multiple possible networks found, use a Network ID to be more specific', Anda memiliki beberapa jaringan multiple-tenant. Anda harus menambahkan parameter networks ke panggilan yang membuat server. Lihat Appendix untuk rinciannya.
Buat instance.
Catatan
SDK Anda mungkin memanggil instance 'node' atau 'server'.
instance_name = 'testing'
testing_instance = conn.create_server(wait=True, auto_ip=True,
name=instance_name,
image=image_id,
flavor=flavor_id)
print(testing_instance)
Jika Anda mendaftar instance yang ada:
instances = conn.list_servers()
for instance in instances:
print(instance)
Instance baru muncul.
HUMAN_ID: true
NAME_ATTR: name
OS-DCF:diskConfig: MANUAL
OS-EXT-AZ:availability_zone: iad-1
OS-EXT-STS:power_state: 1
OS-EXT-STS:task_state: null
OS-EXT-STS:vm_state: active
OS-SRV-USG:launched_at: '2015-07-20T20:31:10.000000'
OS-SRV-USG:terminated_at: null
accessIPv4: ''
accessIPv6: ''
addresses:
private-network:
- OS-EXT-IPS-MAC:mac_addr: fa:16:3e:60:f5:cd
OS-EXT-IPS:type: fixed
addr: 2607:f298:6050:4e14:f816:3eff:fe60:f5cd
version: 6
- OS-EXT-IPS-MAC:mac_addr: fa:16:3e:60:f5:cd
OS-EXT-IPS:type: fixed
addr: 10.10.10.14
version: 4
config_drive: ''
created: '2015-07-20T20:30:23Z'
flavor:
id: '100'
links:
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: bookmark
hostId: f71865b497e6fa71063e292b11846eb64b5a41cd5c00fbb7465b6a48
human_id: testing
id: 67ecebdc-daff-4d84-bd04-bc76c67b48ec
image:
id: c55094e9-699c-4da9-95b4-2e2e75f4c66e
links:
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/images/c55094e9-699c-4da9-95b4-2e2e75f4c66e
rel: bookmark
key_name: null
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/servers/67ecebdc-daff-4d84-bd04-bc76c67b48ec
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/servers/67ecebdc-daff-4d84-bd04-bc76c67b48ec
rel: bookmark
metadata: {}
name: testing
networks:
private-network:
- 2607:f298:6050:4e14:f816:3eff:fe60:f5cd
- 10.10.10.14
os-extended-volumes:volumes_attached: []
progress: 0
security_groups:
- name: default
status: ACTIVE
tenant_id: 5d013ac5962749a49af7ff18c2fb228c
updated: '2015-07-20T20:31:10Z'
user_id: bfd3dbf1c8a242cd90884408de547bb9
Sebelum melanjutkan, Anda harus melakukan satu hal lagi.
Sumber daya awan, seperti instance yang tidak Anda gunakan lagi, bisa menghabiskan biaya. Untuk menghindari biaya tak terduga, hancurkan sumber daya awan.
conn.delete_server(name_or_id=instance_name)
Jika Anda mendaftar instance lagi, instance menghilang.
Biarkan shell Anda terbuka untuk menggunakannya pengerahan instance lain di bagian ini.
Sekarang setelah Anda tahu cara membuat dan menghapus instance, Anda dapat menerapkan contoh aplikasi tersebut. Instance yang Anda buat untuk aplikasi ini mirip dengan instance pertama yang Anda buat, tapi kali ini, kami memperkenalkan beberapa konsep tambahan.
Catatan
Konektivitas internet dari instance awan Anda diperlukan untuk mendownload aplikasi.
Saat Anda membuat sebuah instance untuk aplikasi ini, Anda ingin memberikan sedikit informasi lebih banyak daripada yang Anda berikan pada instance kosong yang baru saja Anda buat dan hapus. Kami akan membahas lebih terperinci di bagian selanjutnya, tapi untuk saat ini, cukup buat sumber daya berikut sehingga Anda bisa memberi mereka instance:
Pasangan kunci Untuk mengakses instance Anda, Anda harus mengimpor kunci publik SSH ke OpenStack untuk membuat pasangan kunci. OpenStack menginstal pasangan kunci ini pada instance baru. Biasanya, kunci publik Anda ditulis ke .ssh/id_rsa.pub
. Jika Anda tidak memiliki file kunci publik SSH, ikuti these instructions sebelumnya. Kami akan membahas instruksi ini secara mendalam Pengantar arsitektur aplikasi fraktal.
Pada contoh berikut, mengatur pub_key_file
ke lokasi file kunci SSH publik Anda.
print('Checking for existing SSH keypair...')
keypair_name = 'demokey'
pub_key_file = '/home/username/.ssh/id_rsa.pub'
if conn.search_keypairs(keypair_name):
print('Keypair already exists. Skipping import.')
else:
print('Adding keypair...')
conn.create_keypair(keypair_name, open(pub_key_file, 'r').read().strip())
for keypair in conn.list_keypairs():
print(keypair)
Akses jaringan. Secara default, OpenStack menyaring semua lalu lintas. Anda harus membuat grup keamanan dan menerapkannya pada instance Anda. Grup keamanan mengizinkan akses HTTP dan SSH. Kami akan membahas lebih rinci Pengantar arsitektur aplikasi fraktal.
print('Checking for existing security groups...')
sec_group_name = 'all-in-one'
if conn.search_security_groups(sec_group_name):
print('Security group already exists. Skipping creation.')
else:
print('Creating security group.')
conn.create_security_group(sec_group_name, 'network access for all-in-one application.')
conn.create_security_group_rule(sec_group_name, 80, 80, 'TCP')
conn.create_security_group_rule(sec_group_name, 22, 22, 'TCP')
conn.search_security_groups(sec_group_name)
Userdata (dara pengguna). Selama pembuatan instance, Anda dapat menyediakan userdata ke OpenStack untuk mengonfigurasi instance setelah booting. Layanan cloud-init menerapkan data pengguna ke sebuah instance. Anda harus melakukan pra-instal layanan cloud-init pada image yang Anda pilih. Kami akan membahas lebih rinci Pengantar arsitektur aplikasi fraktal.
ex_userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
-i faafo -i messaging -r api -r worker -r demo
'''
Sekarang, Anda bisa boot dan mengkonfigurasi instance.
Gunakan image, flavor, key pair, dan userdata untuk membuat sebuah instance. Setelah Anda meminta instance, tunggulah untuk membangunnya.
Shade framework (kerangka teduh) dapat memilih dan menetapkan floating IP (IP apung) bebas dengan cepat
instance_name = 'all-in-one'
testing_instance = conn.create_server(wait=True, auto_ip=False,
name=instance_name,
image=image_id,
flavor=flavor_id,
key_name=keypair_name,
security_groups=[sec_group_name],
userdata=ex_userdata)
Ketika instance boot, nilai variabel ex_userdata menginstruksikan instance untuk menerapkan aplikasi Fractals.
Kami meliput networking secara rinci di Jaringan.
Untuk melihat aplikasi berjalan, Anda harus tahu di mana mencarinya. Secara default, instance Anda memiliki akses jaringan keluar. Untuk membuat instance Anda dapat dijangkau dari Internet, Anda memerlukan alamat IP. Secara default dalam beberapa kasus, instance Anda tersedia dengan alamat IP yang dapat digunakan secara publik. Dalam kasus ini, Anda melihat alamat IP yang tercantum di bawah public_ips atau` private_ips` saat Anda mencantumkan instance. Jika tidak, Anda harus membuat dan menghubungkan alamat IP mengambang ke instance Anda.
f_ip = conn.available_floating_ip()
Jalankan skrip untuk memulai pengerahan.
Menyebarkan data dan konfigurasi aplikasi ke instance bisa memakan waktu lama. Pertimbangkan menikmati secangkir kopi sambil menunggu. Setelah aplikasi menyebar, Anda dapat menggunakan browser pilihan Anda untuk mengunjungi antarmuka grafis yang mempesona di link berikut.
print('The Fractals app will be deployed to http://%s' % f_ip['floating_ip_address'] )
Catatan
Jika Anda tidak menggunakan alamat IP mengambang, ganti alamat IP lain, jika sesuai.
Jangan khawatir jika konsep ini belum sepenuhnya jelas. Dalam Pengantar arsitektur aplikasi fraktal, kami mengeksplorasi konsep ini secara lebih rinci.
Scaling out: Pelajari bagaimana melakukan skala aplikasi Anda.
Make it durable: Pelajari cara menggunakan Object Storage agar aplikasi Anda awet.
Block Storage: Migrasikan database untuk memblokir penyimpanan, atau gunakan komponen basis data as-a-service.
Orchestration: Automatically orchestrate your application.
Jaringan: Learn about complex networking.
Saran bagi pengembang baru untuk operasi: Get advice about operations.
Going crazy: Pelajari beberapa hal gila yang mungkin tidak Anda pikirkan untuk dilakukan;)
File berikut berisi semua kode dari bagian tutorial ini. Sampel kode komprehensif ini memungkinkan Anda melihat dan menjalankan kode sebagai satu skrip.
Sebelum menjalankan skrip ini, konfirmasikan bahwa Anda telah menyetel informasi autentikasi, flavor ID, dan image ID.
#step-1
from shade import *
simple_logging(debug=True)
conn = openstack_cloud(cloud='myfavoriteopenstack')
#step-2
images = conn.list_images()
for image in images:
print(image)
#step-3
flavors = conn.list_flavors()
for flavor in flavors:
print(flavor)
#step-4
image_id = 'c55094e9-699c-4da9-95b4-2e2e75f4c66e'
image = conn.get_image(image_id)
print(image)
#step-5
flavor_id = '100'
flavor = conn.get_flavor(flavor_id)
print(flavor)
#step-6
instance_name = 'testing'
testing_instance = conn.create_server(wait=True, auto_ip=True,
name=instance_name,
image=image_id,
flavor=flavor_id)
print(testing_instance)
#step-7
instances = conn.list_servers()
for instance in instances:
print(instance)
#step-8
conn.delete_server(name_or_id=instance_name)
#step-9
print('Checking for existing SSH keypair...')
keypair_name = 'demokey'
pub_key_file = '/home/username/.ssh/id_rsa.pub'
if conn.search_keypairs(keypair_name):
print('Keypair already exists. Skipping import.')
else:
print('Adding keypair...')
conn.create_keypair(keypair_name, open(pub_key_file, 'r').read().strip())
for keypair in conn.list_keypairs():
print(keypair)
#step-10
print('Checking for existing security groups...')
sec_group_name = 'all-in-one'
if conn.search_security_groups(sec_group_name):
print('Security group already exists. Skipping creation.')
else:
print('Creating security group.')
conn.create_security_group(sec_group_name, 'network access for all-in-one application.')
conn.create_security_group_rule(sec_group_name, 80, 80, 'TCP')
conn.create_security_group_rule(sec_group_name, 22, 22, 'TCP')
conn.search_security_groups(sec_group_name)
#step-11
ex_userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
-i faafo -i messaging -r api -r worker -r demo
'''
#step-12
instance_name = 'all-in-one'
testing_instance = conn.create_server(wait=True, auto_ip=False,
name=instance_name,
image=image_id,
flavor=flavor_id,
key_name=keypair_name,
security_groups=[sec_group_name],
userdata=ex_userdata)
#step-13
f_ip = conn.available_floating_ip()
#step-14
conn.add_ip_list(testing_instance, [f_ip['floating_ip_address']])
#step-15
print('The Fractals app will be deployed to http://%s' % f_ip['floating_ip_address'] )
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.