Openstack Networking VXLAN , sadece cli !

Islemlere baslamadan once ilgili komutlari calistiracaginiz sunucuda veya client’da ilgili Openstack RC (environment variables) dosyasini ayarlayin ve calistirin. Asagida bir ornek mevcut , bunun disinda Horizon’a ilgili kimlik bilgileri ile login olup Project –> Compute –> Access & Security tab’indan indirebilirsiniz.

Cli uzerinden islem yapmak icin Openstack-client kurulu olmali , eger kurulu degil ise kullandiginiz ilgili link’den gerekli paketleri kurabilirsiniz.

Ek olarak asagida calistiracaginiz tum komutlarin parametre bilgilerini vermeden once –debug yazarak calistirdiginizda (ornegin nova –debug list , openstack –debug project list) Openstack REST API‘de kesfetmeniz mumkun.

VXLAN icin on bilgiye ihtiyaciniz var ise bu makaleyi inceleyebilirsiniz , VMware/NSX olmus , OpenvSwitch (OVS), Hyper-V/NVGRE olmus cok onemli degil, prensipte birbirlerine yakin calisiyorlar.

Benim icin ; 

stack@helion-cp1-c0-m1-mgmt:~$ source service.osrc

Ornek icerik ; 

stack@helion-cp1-c0-m1-mgmt:~$ cat service.osrc

unset OS_DOMAIN_NAME

export OS_IDENTITY_API_VERSION=3

export OS_AUTH_VERSION=3

export OS_PROJECT_NAME=admin

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USERNAME=admin

export OS_USER_DOMAIN_NAME=Default

export OS_PASSWORD=<sifre>

export OS_AUTH_URL=https://10.111.45.3:5000/v3

export OS_ENDPOINT_TYPE=internalURL

# OpenstackClient uses OS_INTERFACE instead of OS_ENDPOINT

export OS_INTERFACE=internal

export OS_CACERT=/etc/ssl/certs/ca-certificates.crt

export OS_COMPUTE_API_VERSION=2

Uzerinde degisiklik yapmak istediginizde ve ilgili environment degiskenlerinin ne oldugunu unuttugunuzda asagidaki komutu calistirabilirsiniz.

stack@helion-cp1-c0-m1-mgmt:~$ env | grep OS

Network Islemleri 

  • Once ilgili networkleri listeleyelim
    • stack@helion-cp1-c0-m1-mgmt:~$ neutron net-list
    • Diger bir kullanim sekli ise ciktiyi filtrelemek, bunun icin -c yani column
      •  stack@helion-cp1-c0-m1-mgmt:~$ neutron net-list -c name
  • Simdi kendimizi bir network yaratalim , benim kullandigim kullanici default Admin Domain’indeki admin kullanicisi ve demo adli proje icin iki addet network yaratmak istiyorum.
    • Once demo projesinin ID sine ihtiyacimiz olacak , burada keystone komutu artik ilerki versionlarda kaldirilacagindan keystone tenant-list komutunu kullanmiyoruz.
      • stack@helion-cp1-c0-m1-mgmt:~$ openstack project list
    • Simdi networkleri yaratalim , Demo-WebServers-Network1 ve Demo-DBServers-Network1 adinda ve –tenant-id ile ilgili hangi proje icin bu networkler yaratilacak ise onlari set ediyoruz.
      • stack@helion-cp1-c0-m1-mgmt:~$ neutron net-create –tenant-id 68ca3d8aa2294bc1bc606acbb8b9405a Demo-WebServers-Network1
      • stack@helion-cp1-c0-m1-mgmt:~$ neutron net-create –tenant-id 68ca3d8aa2294bc1bc606acbb8b9405a Demo-DBServers-Network1
      •  Ilgili komutlari calistirdiginizda bir ciktiniz olacak , burada bizim icin onemli olan iki adet parametre var , birincisi provider:network_type, ikincisi ise provider:segmentation_id , buradan tenantlar icin tanimlanan varsayili network tipinin vxlan oldugunu anliyoruz , digeride size vxlan VNI numarasini yani VLAN deyimiyle VLAN ID sini belirtiyor. Bunla beraber router:external ‘de yarattigimiz networkun ic kullanim icin oldugunu gosteriyor. Eger router:external true set edilmis olsa idi bu bize ilgili networking floating ip icin kullanilacagini buraya sanal makine degil router’larin baglanabilecegini belirtiyor olacakti.
      • Yukardaki komut istenir ise –provider:network_type=vxlan ve –provider:segmentation_id=4000 ilgili parametreler eklenerek kullanilabilir.
        • stack@helion-cp1-c0-m1-mgmt:~$ neutron net-create –tenant-id 68ca3d8aa2294bc1bc606acbb8b9405a  –-provider:network_type=vxlan –provider:segmentation_id=40000 test-vxlan-manuel-id
      • Daha fazla bilgi icin ml2_conf.ini dosyanizin [ml2] tab’i tenant_network_types / type_drivers / mechanisim_drivers , [ml2_type_vxlan] tab’i vni_ranges ,  [ovs] tab’i local_ip ve [agent] tab’i tunnet_type parametrelerini kontrol edin. HP Helion icin bu yol /opt/stack/service/neutron-20160722T142043Z/etc/ml2_conf.ini (Bu arada farkli python env olabilir ona gore path degisiklik gosterebilir) . Farkli kurulumlarda ml2_conf.ini /etc/neutron dizini veya /etc/neutron/plugin dizininde olabilir.
      • [ovs] tab’i local_ip parametresi bize VTEP interface’i belirtiyor.
      • [ml2_type_vxlan] tab’i vni_ranges parametresi bize kac sanal network host etmek istedigimizi soruyor. Mesel 5000
      • Ornek
        • [ml2]
          • type_drivers = local, flat, vlan, gre, vxlan
          • tenant_network_types = vlan,vxlan
          • mechanism_drivers =  openvswitch , l2population
        • [ml2_type_vxlan]
          • vni_ranges = 1001:65535
        • [ovs]
          • local_ip = 10.111.47.2
        • [agent]
          • tunnel_types = vxlan
      • Eger olasi ml2_conf.ini uzerinde degisiklik yaptiysaniz Neutron Server ve Neutron Agent deamon’larini restart etmelisiniz. Neutron Agent servislerini compute ve network node‘lari uzerinde calismaktadir , Neutron Server‘da muhtemelen controller/network node uzerinde.
      • Neutron Server to Neutron Agent konusma sekli ; screen-shot-2016-10-08-at-14-07-30
      • Yaratilmis networkler hakkinda bilgi alabilmek icinstack@helion-cp1-c1-m1-mgmt:~$ neutron net-show a6fd01a6-12c9-4931-8a0e-5727ff5f65a2
      • Yaratilan networkleri silmek icin tahmin edebileceginiz gibi komut neutron net-delete <network_id>
  • Network objesi Openstack’de kendi icersinde birden fazla subnet icerebilir , simdi VM’lere veya Openstack deyimiyile instance’lara IP atayabilmek icin tanimladigimiz network objelerine birer sub-network yani IP adres blogu atayalim
    • Once var olan subnet’leri gormekle baslayalim
      • stack@helion-cp1-c1-m1-mgmt:~$ neutron subnet-list
    • Simdi Demo-WebServers-Network1 ve Demo-DBServers-Network1 adli networklere sirasiyla 10.10.1.0/24 ve 10.10.2.0/24 atayalim
      • stack@helion-cp1-c1-m1-mgmt:~$ neutron subnet-create –name web-subnet Demo-WebServers-Network1 10.10.1.0/24
      • stack@helion-cp1-c1-m1-mgmt:~$ neutron subnet-create –name db-subnet Demo-DBServers-Network1 10.10.2.0/24
        • Not : Farkli networklerle iliskilendirilmis ayni isimli subnetleriniz olabilir, dikkat !
    • Yukardaki komut ciktilarinda goreceksinizki ilgili networkler icin dhcp aktive edilmis , ilgili networkler icin default gw atanmis ipv4 secilmis , dilerseniz bunlarida komut satirinda sizde belirleyebilirsiniz , daha fazlasi icin neutron subnet-create –help komutunu calistirin.
    • Ilgili subnet’ler yaratildiginda (Bazi dokumanlarda ilk port –instance vinterface/vnic diyelim– yaratildiginda) ilgili network icin DHCP Agent’lar calismaya baslayacaklardir. Ilgili DHCP agent’lari Network Node’lari uzerinde kosacaktir (Controller ve Network Node’lari ayni makine uzerinde olabilir bu durumda controller node’a bakiniz), kontrol etmek icin linux komut satirinda ilgili komutu calistirin.
      • stack@helion-cp1-c1-m1-mgmt:~$ ps -fe | grep dnsmasq
        • veya
      • stack@helion-cp1-c1-m1-mgmt:~$ ps -fe | grep dnsmasq | grep <net_id>
    • pid-file paramteresinde gordugunuz guid ilgili subnet’in bagli oldugu network_id numarasidir –> –pid-file=/var/run/neutron/dhcp/bb8dd87f-466e-4082-b69b-c6436bb12a18/pid
    • DHCP Agent yedeklilik icin artirilabilir bunu icin bakiniz neutron.conf ve dhcp_agents_per_network parametersine
      • stack@helion-cp1-c1-m1-mgmt:~$ sudo vi /opt/stack/service/neutron-20160722T142043Z/etc/neutron.conf
      • dhcp_agents_per_network = 2
      • Yukarda network yaratmistik , bu network’de hangi DHCP-Agent’lar nerede calisiyorduyu gormek icin
        • stack@helion-cp1-c0-m1-mgmt:~$ neutron dhcp-agent-list-hosting-net Demo-WebServers-Network1
      • DHCP-Agent hakkinda daha fazla bilgi icin
        • stack@helion-cp1-c0-m1-mgmt:~$ neutron agent-show 8cc9c0ec-c67f-4cb2-a7be-a9260b1c52dc
      • Diyelim bizim konfigrasyona gore yarattigimiz network icin iki adet DHCP-Agent yetmedi ve bir tane daha yaratmak istiyorsunuz bu durumda once sistemdeki DHCP-Agent’lari listeleyip sonrasinda ilgili agent’i ilgili network’e atayabilirsiniz.
        • stack@helion-cp1-c0-m1-mgmt:~$ neutron agent-list | grep DHCP
        • stack@helion-cp1-c0-m1-mgmt:~$ neutron dhcp-agent-network-add 146c7c35-f963-469a-b76a-0bd23eda5ca7 Demo-WebServers-Network1
        • kaldirmak icin dhcp-agent-network-remove
      • DHCP HA kontrol etmek icin udhcpc veya dhclient uygulamalarini kullanabilirsiniz.
  • Openstack icin baska onemli bir obje ise port ki kendisini Horizon uzerinden yaratmak mumkun degil , illa cli kullanilmali veya instance yaratildiginda zaten otomatik olarak yaratiliyor fakat yinede cli’dan islem yapiyoruz ve port’un ne oldugunu ve port yaratmayi gorelim.
    • port = instance icin virtual interface
    • Openstack Neutron modulu port yaratildiginda ona tekil bir MAC adresi atiyor
    • Ilgili network adi belirtildiginde Neatron ilgili ip adresini port’a atayacaktir , ilgili mac ve ip adresini ifconfig/ipconfig yaptiginizda goruyor olacaksiniz. (Fixed ip)
    • Once var olan portlari listeleyelim ;
      • stack@helion-cp1-c1-m1-mgmt:~$ neutron port-list
    • Simdi port yaratalim , bu islemi yaparken yine ilgili port’u hangi proje icin yarattiginiza dikkat edin aksi taktirde demo projesi icin instance yaratirken port eger admin projesine atanmis ise garip hatalarla karsilasabilirsiniz, mesela ben bu tip bir islem yaptigimida bana “Instance’i koyacagi bir Host yok gibi bir mesaj verdi
      • stack@helion-cp1-c1-m1-mgmt:~$ neutron port-create –tenant-id 68ca3d8aa2294bc1bc606acbb8b9405a –name web-elle-port1 Demo-WebServers-Network1
      • Aslinda instance yaratilirken otomatik olarak port yaratilacakti ama varsayalimki instance’a atamak istedigimiz bir IP adresi var bu durumda oncesinde port yaratip intance’a atayabiliriz.
      • Ek olarak isteseydik kendimizin istedigi bir ip adresinide istedigimiz bir subnet’den atayabilirdik bu durumda fixed_ip parametresini kullanabiliridik, asagida yarattigim network altinda bir adet subnet oldugundan onu tanimlamadim olsa idi –fixed-ip subnet_id=xxx,ip_adderss=yyy seklinde set edicektik.
      • stack@helion-cp1-c0-m1-mgmt:~$ neutron port-create –tenant-id 68ca3d8aa2294bc1bc606acbb8b9405a –name web-elle-port2 –fixed-ip ip_address=10.10.1.66 Demo-WebServers-Network1
      • Eger IP Aliasing yani ikinci ipi vermemiz gerekiyor ise instance’a bu durumda komut satirinda kullandiginiz –fixed-ip parameteresini ikinci kez, ucuncu kez kullanabilirsiniz , hatta bir network altinda birden fazla subnet olabildiginden farkli subnetlerdende ip alabilirsiniz. Bu sekilde nova boot komutu ile instance boot ettiginde ilk ip adresini alip sanal kart’a baglayacak ikinci veya ucuncu ip icin ifconfig/ipconfig araclarina ihtiyaciniz olacak. Ornegin ;
        • stack@helion-cp1-c0-m1-mgmt:~$ neutron port-create –tenant-id 68ca3d8aa2294bc1bc606acbb8b9405a –name web-elle-port2 –fixed-ip ip_address=10.10.1.66 –fixed-ip ip_address=10.10.1.67 Demo-WebServers-Network1
      • fixed_ip kullanimi bu sekilde DHCP uzerinden rezervasyon yapmanizada yardimci olacak.
      • ip set etmek istediginizde API set edilmek istenen IP ile networkun birbiriyle uyusup uyusmadigini kontrol etmektedir.
  • Elimizdeki network,subnet,port ve instance imaji ile sanal sunucuyu ayaga kaldiralim ;
    • Bunun icin nova komutunu kullanacagiz ;
      • Oncelikle elimizdeki instance imajlarina bakalim
        • stack@helion-cp1-c1-m1-mgmt:~$ glance image-list
      • Elimizdeki instance tiplerine bakalim
        • stack@helion-cp1-c1-m1-mgmt:~$ nova flavor-list
      • Port ID‘i bulalim
        • stack@helion-cp1-c1-m1-mgmt:~$ neutron port-list | grep web-elle-port1
      • Simdi VM/instance  yaratalim , once ilgili projeyi set edelim ortama (daha once admin RC file kullandigimizi dusunerekten)
        • stack@helion-cp1-c1-m1-mgmt:~$ export OS_PROJECT_NAME=demo
        • stack@helion-cp1-c1-m1-mgmt:~$ nova boot –flavor m1.tiny –image cirros-0.3.3-x86_64 –nic port-id=9759d23d-7863-497d-88c3-02067af12714 WebServer1
        • nova list komutu ile kontrol edin , daha fazlasi icin instance id not edin
        • Ek olarak bilmekte fayda var muhtemelen nova’da bir sure sonra kullanilmayacak bunun yerine asagidaki gibide instance’lari set edebilirsiniz
          • stack@helion-cp1-c0-m1-mgmt:~$ openstack server list
        • Birden fazla intsance yaratmak icin –max-count kullanabilirsiniz. Ornegin asagida artik port degil ilgili network_id yaratilmis durumda ve isim olarak base dememdeki sebep , ilgili ismi kullanarak base-1 , base-2 seklinde iki instance yaratacak, bu arada port_id kaldirildi.
          • stack@helion-cp1-c1-m1-mgmt:~$ nova boot –flavor m1.tiny –image cirros-0.3.3-x86_64 –nic net-id=dbfce43e-0388-44f9-a2ce-169414413394  –max-count 2 base
        • Ek olarka soyle birsey yapmak isteyebiliriz, sunucuyu istedigimiz host uzerinde acmak gibi , bunun icin oncelikle sahip oldugumuz host’lari listeleyelim
          • stack@helion-cp1-c0-m1-mgmt:~$ nova hypervisor-list
          • Elimizde helion-cp1-compute0001-mgmt diye bir host oldugunu dusunelim
          • stack@helion-cp1-c0-m1-mgmt:~$ nova boot –flavor m1.tiny –image cirros-0.3.3-x86_64 –availability-zone nova:helion-cp1-compute0001-mgmt –nic net-id=dbfce43e-0388-44f9-a2ce-169414413394 TestServer1
        • Birsonraki adima gecmeden once ornek bir instance yaratmayi openstack server komutu ilede yapalim
          • stack@helion-cp1-c0-m1-mgmt:~$ openstack server create –flavor m1.tiny –image cirros-0.3.3-x86_64 –nic net-id=dbfce43e-0388-44f9-a2ce-169414413394 YeniYeniServer1
          • Artik instance yaratirken size spawn degil BUILD status’u ile karsilik verecek.
        • Ayrintilari gormek icin ;
          • stack@helion-cp1-c1-m1-mgmt:~$ nova show 9fd17930-29c5-4507-a763-34b0a7d32a61
          • Burada ilgili VM’e uygulanmis Security Group , hangi tenant’a ait , hangi flavor , ne tip attribute’ler almis gibi bircok seye erisebiliyoruz
          • VM icersinden ifconfig diyerek eth0’a atanmis MAC ve IP adresini kontrol edin , port ile ayni oldugunu goreceksiniz, bu sekilde port ile instance(VM) birbirine baglanmis oldu. (Direkt Openstack uzerinden Console yapin (VNC))
          • Ayni islemi compute node uzerinden ilgili komutu calistirarak’da gorebilirsiniz.stack@helion-cp1-compute0002-mgmt:~$ sudo virsh dumpxml instance-0000003c | grep mac
        • Compute Node uzerinden ilgili OVS tanimlarini gorelim
        • Oncesinde instance ‘in linux bridge’e , linux bridge’in OVS port’una , OVS icerindeki bridge patch baglantilarina ve disariya dogru diger compute ve network node’lara olan baglantiyi bir hatirlayalim screen-shot-2016-10-08-at-15-38-36
          • port_id biliyoruz 9759d23d-7863-497d-88c3-02067af12714
          • Hangi compute node uzerinde oldugunu OS-EXT-SRV-ATTR:host degerinden cikartabiliyoruz. Ilgili instance helion-cp1-compute0002-mgmt uzerinde
          • Compute node’a ssh yapin
          • Bize port_id’nin ilk 11 karakteri gerekli 9759d23d-78
          • Simdi OpenvSwitch’i (OVS) sorgulayip OVS tarafindaki port’u bulalim. Ilgili port br-int bridge’ine bagli olmali.
            • stack@helion-cp1-compute0002-mgmt:~$ sudo ovs-vsctl show | grep 9759d23d-78        Port “qvo9759d23d-78″Interface “qvo9759d23d-78”
            • veya sed ile
            • stack@helion-cp1-compute0002-mgmt:~$ sudo ovs-vsctl show | sed -n “/9759d23d-78/,/9759d23d-78/p”

              Port “qvo9759d23d-78″tag: 5

              Interface “qvo9759d23d-78”

            • Yukarda yakalamadik fakat ilgili interface icin OVS bir tag atamis durumda, bu VNI numarasindan farkli, sadece OVS’nin hypervisor icindeki trafik ayrimi/izolasyonu icin. br_int bridge’inden cikip dis dunyaya gideriken OVS internel tag’i VXLAN segment_id’si ile degistirecek. Yukardaki komutu grep‘lemeden veya sed ile olan ciktiyi kontrol edin.
            • OVS tarafindaki port’a atanan tag degeri 5. OVS’in disariya baglanti koprusu br-tun , bu bridge’den gecen flow’lari incelemek istersek asagidaki komutu calistirmaliyiz.
            • dl_vlan = OVS internal segragation id (ic vlan id)
            • set_tunnel = VNI id
            • Bu arada VNI hex olarak kodlanmis durumda bunu cevirmel icin
              • stack@helion-cp1-compute0001-mgmt:~$ echo $((0x9c40))
            • Boylece paket br-tun’dan br_int’e dogru aktiginda ilgili paketleri ilgili port’a iletmek icin OVS 5 nolu tag’i,
            • OVS switch’den disariya dogru bir paket var ise ilgili 5 nolu tag VXLAN VNI id ile degistiriliyor.
            • stack@helion-cp1-compute0002-mgmt:~$ sudo ovs-ofctl dump-flows br-tun | grep dl_vlan=5 | grep tunnel 
              • cookie=0x9dfdd283abb52bc6, duration=2838866.147s, table=20, n_packets=166, n_bytes=21730, idle_age=65534, hard_age=65534, priority=2,dl_vlan=5,dl_dst=fa:16:3e:64:8c:d8 actions=strip_vlan,set_tunnel:0x44a,output:10
              • cookie=0x9dfdd283abb52bc6, duration=2838866.117s, table=20, n_packets=12, n_bytes=1042, idle_age=65534, hard_age=65534, priority=2,dl_vlan=5,dl_dst=fa:16:3e:69:b8:da actions=strip_vlan,set_tunnel:0x44a,output:11
              • cookie=0x9dfdd283abb52bc6, duration=2838866.151s, table=22, n_packets=53, n_bytes=3090, idle_age=65534, hard_age=65534, dl_vlan=5 actions=strip_vlan,set_tunnel:0x44a,output:10,output:11
            • Dikkat ederseniz calisan dnsmasq deamon’larinada nasil ulasacagimiz belirtilmis durumda (flow’lar programlanmis), dl_dst olarak belirtilen mac adresleri ilgili dhcp deamin tap interface mac adreleri.
            •  dump sonundaki output ibareleri flow’un OVS uzerindeki hedef port numarasini gosteriyor, ilgili bridge interface’indeki port numarasini gormek icin asagidaki komutu calistirin
            • stack@helion-cp1-compute0002-mgmt:~$ sudo ovs-ofctl show br-tun
            • Asagida gorebileceginiz gibi sanki bir fiziksel switch’in portlari gibi siralanmis port numaralari mevcut 1,10,11,12 gibi
            • screen-shot-2016-11-02-at-14-37-28
          • Yukarda DHCP deamon mac adreslerini belirtmistik simdi bu tap interface’leri network/controller node’lari uzerindeki OVS uzerinden gorelim
            • Ilgill  network/controller node uzerinden sadece ilk match eden tap kaydini yakalayalim ve interface’in adini alalim.
            • stack@helion-cp1-c1-m1-mgmt:~$ ps -fe | grep dnsmasq | grep tap | head -1
            • –interface=tapa8992be0-c1
            • OVS uzerinde gorelim , Ilgili interface br-int altinda olmadi grep veya sed kullanmadanda gorebilirsiniz.
            • stack@helion-cp1-c1-m1-mgmt:~$ sudo ovs-vsctl show | sed -n “/tapa8992be0-c1/,/tapa8992be0-c1/p”

              Port “tapa8992be0-c1“tag: 45

              Interface “tapa8992be0-c1

        • Boylece instance’a ait port , dhcp ait tap gibi interface’lerin nasil bulunacagini gormus olduk.

Cok uzun oldu🙂

VM

Posted on 02/11/2016, in Neutron Networking, Openstack and tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. 2 Comments.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: