1. 程式人生 > >Openstack實踐(1)安裝部署第一個實例及neutron網絡

Openstack實踐(1)安裝部署第一個實例及neutron網絡

ipv6 dir hostname 鏈接 segment 訪問外網 繼續 過程 命名

版權聲明:本文為博主原創文章,歡迎轉載,轉載請註明作者、原文超鏈接 ,博主地址:http://www.cnblogs.com/SuperXJ/

如何快速部署使用openstack,使用kolla吧,openstack技術結合容器分分鐘部署(單點或者多節點,任選),分分鐘升級,kolla項目是為了容器化openstack,目標是做到開箱即用,所有的組件的HA都具備。kolla是一個革命性的項目,我們以前積累的安裝部署經驗,全部都報廢。使用kolla可以快速部署可擴展,可靠的生產就緒的openstack環境。,OpenStack Kolla項目是一個支持Openstack服務以容器的方式部署,借助ansible部署工具可以簡單的擴展到多個節點。同時,又借助於使用 heat 來編排 Kolla 集群。我們也可以把 Kolla 鏡像註冊到一個內部的 Hub,並通過 Kubernetes(k8s)等工具來管理。kolla

最終目標是為OpenStack的每一個服務都創建一個對應的Docker Image,通過Docker Image將升級的粒度減小到Service級別,從而使升級時,對OpenStack影響能達到最小,並且一旦升級失敗,也很容易回滾。升級只需要三步:Pull新版本的容器鏡像,停止老版本的容器服務,然後啟動新版本容器。回滾也不需要重新安裝包了,直接啟動老版本容器服務就行,非常方便,kolla是openstack成功結合微服務和容器的開始。

目前,Kolla提供的鏡像支持部署如下OpenStack項目:

Aodh

Ceilometer

Cinder

Designate

Glance

Gnocchi

Heat

Horizon

Ironic

Keystone

Magnum

Mistral

Murano

Nova

Neutron

Swift

Tempest

Zaqar

以及這些基礎設施組件:

• Ceph implementation for Cinder, Glance and Nova
• Openvswitch and Linuxbridge backends for Neutron
• MongoDB as a database backend for Ceilometer and Gnocchi

• RabbitMQ as a messaging backend for communication between services.
• HAProxy and Keepalived for high availability of services and their endpoints.
• MariaDB and Galera for highly available MySQL databases

1、準備工作:

The host machine must satisfy the following minimum requirements:

2 network interfaces(第一個是ens33,NAT網絡 ,DHCP分配,IP:33192.168.226.137,Horizon訪問就是通過這個IP地址 ; 第二個是 ens37,NAT網絡 ,DHCP分配,IP:33192.168.226.138;,這個其實是讓neutron的br-ex 綁定使用,虛擬機是通過這塊網卡訪問外網。 )

8GB main memory

40GB disk space

1.1、安裝python pip最新版本

Yum install epel-release

說明:EPEL 是yum的一個軟件源,裏面包含了許多基本源裏沒有的軟件。

Yum install python-pip

pip Install -U pip

說明:pip是 python可以跨平臺的安裝工具

1.2、安裝依賴包

yum install python-devel libffi-devel gcc openssl-devel libselinux-python

pip install -U docker-py

#yum install -y python-docker-py

1.3、安裝ansible,kolla通過ansible來部署openstack

Yum install ansible

1.4、安裝docker

yum install docker-engine-1.12.5 docker-engine-selinux-1.12.5

Systemctl enable docker

說明:根據kolla安裝要求,安裝1.12.5版本的docker

1.5、配置(當使用Systemd 建立docker引擎,如果不設置MountFlags 選項, kolla-ansible的neutron-dhcp-agent會部署失敗並拋出 APIError/HTTPError.)

Tee /etc/systemd/system/docker.service.d/kolla.conf <<-‘EOF‘

[Service]

MountFlags=shared

EOF

或者再/usr/lib/systemd/system/docker.service

[service]裏加上

#MountFlags=shared

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.226.134:4000

說明:增加一個本地registry

Systemctl daemon-reload

Systemctl restart docker

說明:重新加載並啟動

1.6、配置ntp 多機部署需要配置,否則會調度錯誤

Yum install ntp

Systemctl enable ntpd.service

Systemctl start ntpd.service

1.7、禁用libvirtd

Systemctl stop libvirtd.service

Systemctl disable libvirtd.service

1.8、關閉防火墻和selinux

systemctl stop firewalld && systemctl disable firewalld sed -i ‘7d;1a SELINUX=disabled‘ /etc/selinux/config

2、安裝kolla

Kolla安裝包有兩種模式:

(1)evaluation是使用pip來安裝kolla,先安裝kolla-ansible,然後通過kolla-ansile將openstack的各項目鏡像從互聯網拉取下來。

(2)Development是使用源碼來安裝kolla,下載源碼,本地編譯構建安裝,相對比第一種要復雜一些。

2.1、我們這裏使用Development方式安裝valla:

git clone http://git.trystack.cn/openstack/kolla-ansible –b stable/ocata

cd kolla-ansible pip install .

說明:kolla-ansible 是一個將openstack部署到docker的工具

Cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/kolla/

Vi /etc/kolla/globals.yml

kolla_base_distro: "centos"

kolla_install_type: "source"

openstack_release: "4.0.3"

kolla_internal_vip_address: "192.168.226.222"

docker_registry: "192.168.226.134:4000"

network_interface: "ens33"

neutron_external_interface: "ens37"

enable_haproxy: "no"

api_interface: "{{ network_interface }}"

docker_namespace: "lokolla"

說明:該配置文件配置了kolla源信息

cp /usr/local/share/kolla-ansible/ansible/inventory/* .

說明:這裏存放了單節點和多節點部署的配置文件,我們采用單節點部署

默認docker的registry是使用5000端口,對於OpenStack來說,有端口沖突,所以改成4000

docker run -d -v /opt/registry:/var/lib/registry -p 4000:5000 --restart=always --name registry registry:2

下載kolla官方提供的鏡像

http://tarballs.openstack.org/kolla/images/

這是kolla官方提供的鏡像給CI使用,只保留最新版本和最新的stable版本。大家可以下載Ocata版本

wget http://tarballs.openstack.org/kolla/images/centos-source-registry-ocata.tar.gz tar zxvf centos-source-registry-ocata.tar.gz -C /opt/registry/

這樣就把kolla的docker鏡像文件放到Regisitry服務器上。

2.2 配置/etc/kolla/globals.yml

network_interface: "ens33"

說明:ens33屬於NAT網絡裏,設置的IP是:192.168.226.134,Horizon訪問就是通過這個IP地址

neutron_external_interface: "ens37"

說明:ens37橋接模式,ip其實是dhcp分配,這個其實是讓neutron的br-ex 綁定使用,虛擬機是通過這塊網卡訪問外網。

2.3 配置登錄Dashboard的密碼

kolla-genpwd

說明:自動生產復雜密碼,對應文件/etc/kolla/passwords.yml

Vi /etc/kolla/passwords.yml

修改keystone_admin_password: xiongjian

2.4測試一下kolla-ansible -i all-in-one bootstrap-servers

kolla-ansible prechecks -i ~/kolla/all-in-one -vvv

如果是在虛擬機裏裝kolla,希望可以啟動虛機後再啟動nova虛擬機,那麽你需要把virt_type=qemu,默認是kvm

mkdir -p /etc/kolla/config/nova

cat << EOF > /etc/kolla/config/nova/nova-compute.conf [libvirt] virt_type=qemu

EOF

2.5 部署 (測試環境采用all-in-one部署,生產環境請采用多節點部署)

kolla-ansible pull -i ~/kolla/all-in-one

kolla-ansible deploy -i ~/kolla/all-in-one

2.6 安裝openstack 客戶端

pip install -U python-openstackclient python-neutronclient

2.7 kolla-ansible post-deploy運行以下命令可以生成一個openrc文件(運行openstack CLI所需的環境變量):

openrc文件生成之後,使用以下命令可以幫你做一下openstack的初始化工作,包括上傳一個glance鏡像以及創建幾個虛擬網絡:

source /etc/kolla/admin-openrc.sh

[root@localhost ~]# cat /etc/kolla/admin-openrc.sh

export OS_PROJECT_DOMAIN_NAME=default

export OS_USER_DOMAIN_NAME=default

export OS_PROJECT_NAME=admin

export OS_TENANT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=xiongjian

export OS_AUTH_URL=http://192.168.226.222:35357/v3

export OS_INTERFACE=internal

export OS_IDENTITY_API_VERSION=3

編輯 /usr/share/kolla-ansible/init-runonce,

網絡需要根據實際情況修改

EXT_NET_CIDR=‘192.168.226.0/24‘

EXT_NET_RANGE=‘start=192.168.226.180,end=192.168.226.199‘

EXT_NET_GATEWAY=‘192.168.226.1‘

說明一下,192.168.226.0的網絡,就是上面ens34接的網絡,這個網絡是通過路由器訪問互聯網,配置好這個,裝完虛擬機就可以直接ping通。

2.8 執行nova demo1

Sh init-runonce

To deploy a demo instance, run:

openstack server create

--image cirros

--flavor m1.tiny

--key-name mykey

--nic net-id=40f71353-665a-4885-9cd6-8fccea8c908a

demo1

+-------------------------------------+-----------------------------------------------+

| Field | Value |

+-------------------------------------+-----------------------------------------------+

| OS-DCF:diskConfig | MANUAL |

| OS-EXT-AZ:availability_zone | |

| OS-EXT-SRV-ATTR:host | None |

| OS-EXT-SRV-ATTR:hypervisor_hostname | None |

| OS-EXT-SRV-ATTR:instance_name | |

| OS-EXT-STS:power_state | NOSTATE |

| OS-EXT-STS:task_state | scheduling |

| OS-EXT-STS:vm_state | building |

| OS-SRV-USG:launched_at | None |

| OS-SRV-USG:terminated_at | None |

| accessIPv4 | |

| accessIPv6 | |

| addresses | |

| adminPass | 7RRu8kextShC |

| config_drive | |

| created | 2017-11-25T08:26:43Z |

| flavor | m1.tiny (1) |

| hostId | |

| id | 5cfdc7e2-25a8-4387-b462-2bf4100e2c37 |

| image | cirros (86705719-3402-4d9c-865a-f86646419905) |

| key_name | mykey |

| name | demo1 |

| progress | 0 |

| project_id | ffd2a5003e7f4cdb8cefa48fdb2bd767 |

| properties | |

| security_groups | name=‘default‘ |

| status | BUILD |

| updated | 2017-11-25T08:26:45Z |

| user_id | 4edc2043e5864941acd205f60838a744 |

| volumes_attached | |

+-------------------------------------+-----------------------------------------------+

通過openstack 控制臺看一下,運行成功

技術分享圖片

技術分享圖片

查看是否支持kvm命令,我的顯示不支持

egrep -c ‘(vmx|svm)‘ /proc/cpuinfo

0 表示不支持,1 表示支持。

[docker 構建鏡像](https://docs.docker.com/engine/getstarted/step_four/)

[kolla-ansible 構建鏡像](https://docs.openstack.org/developer/kolla/image-building.html)

[kolla 鏡像倉庫](https://hub.docker.com/u/kolla/)

[docker 服務配置](https://docs.docker.com/engine/admin/systemd/)

[問題debug](https://docs.openstack.org/developer/kolla-ansible/troubleshooting.html)

3、openstack Neutron

3.1先簡單了解一下neutron

Neutron能提供虛擬的分布式(這樣就可以實現跨物理機虛機在同一個vlan)二層vswitch(提供虛擬的network\subnet\port)、三層router、防火墻、負載均衡等抽象網絡功能,能為每個租戶提供獨立的虛擬網絡環境,neutron是用來創建虛擬網絡的,所謂虛擬網絡,就是虛擬機啟動的時候會有一個虛擬網卡,虛擬網卡會連接到虛擬switch上,虛擬交換機連接到虛擬router上,虛擬路由器最終和物理網卡聯通,從而虛擬網絡和物理網絡聯通起來,可能用到的技術包括:

L2層:通過linux內核的bridge實現虛擬二層交換機,所有連接到linux bridge的設備(如tap)處於同一網段

L2層:Linux tap實現虛擬網卡,一個tap設備就是linux下一個進程,兩個虛機通過tap通信實際上就是兩個進程間通信,可以操作/dev/tap*,。

L2層:Linux veth實現虛擬網線,用於連接兩個虛擬網絡設備,如下面說的qbr和br-int)

L2層:在虛擬網橋中,如果希望虛機和外部通信,必須打開橋接到虛擬網橋中的物理網卡為混雜模式(ifconfig eth0 0.0.0.0 promisc up )。

L3層:通過ipv4 forward(將數據包從一塊網卡路由到另一塊網卡)和iptable的NAT實現靜態路由及轉發.(例如可以實現從物理機A的eth33發出的數據包像是從物理機B的eth34端口發出去一樣)。

L3層:通過RIP OSPF BGP 自動學習建立路由表。

L2層:OVS,作用和linux bridge類似,也是實現二層vswitch,但是多了QOS\netflow流量監控能力。

L3層:GRE本職是在隧道的兩端L4層建立UDP連接傳輸重新包裝的L3層爆頭,在目的地進行解包,因為是直接在隧道兩端建立UDP連接,所以不需要像VLAN一樣在物理交換機上配置TRUNK。GRE缺點是點點對的UDP連接占用端口資源和帶寬資源。

L3層:Neutron中GRE,即使兩臺物理機上的兩臺虛機也不直接建立GRE,而是通過L3的網絡節點進行中轉,這樣可以方便使用iptable做隔離網絡流量。

L3 層:vxlan 的本職是重新定義L2層的數據幀再通過L4的UDP進行傳輸,對端對UDP拆包後查看L2數據幀可以看到和對端是在同一個2層。也是是通過L3L4層擴展L2層。VXLAN同樣使用了GRE的隧道通過UDP傳輸重新封裝的數據幀(其中的VNI類似於VLAN,但是為24Bit),通過VXLAN可以實現虛機跨中心遷移。

L4-7 LBAAS 為一個租戶下的多臺虛機提供負載均衡,根據負載均衡策略動態的將VIP綁定到具體提供服務的虛機固定IP上,註意這個VIP可以是內網IP也可以是外網IP,根據需要實現。底層技術是基於HAPROXY

L4-L7 FWAAS(基於iptables) 、vpnaas(基於 ipsec vpn or mpls vpn or ssl vpn)

3.2 neutron分成多個模塊分布在三個節點上。

1.Controller節點:

運行neutron-server進程,用於接受RESTful API請求創建網絡,子網,路由器等,然而創建的這些東西僅僅是一些數據結構在數據庫裏面。

2.Network節點:

neutron-l3-agent,用於創建和管理虛擬路由器,當neutron-server將路由器的數據結構創建好,neutron-l3-agent是做具體事情的,真正的調用命令行將虛擬路由器,路由表,namespace,iptables規則全部創建好。

neutron-dhcp-agent,用於創建和管理虛擬DHCP server,每個虛擬網絡都會有一個DHCP server,這個DHCP server為這個虛擬網絡裏面的虛擬機提供IP。

neutron-openvswitch-plugin-agent,這個是用於創建L2的switch的,在Network節點上,Router和DHCP Server都會連接到二層的switch上。

3.Compute節點:

neutron-openstackvswitch-plugin-agent,這個是用於創建L2層switch的,在compute節點上,虛擬機的網卡也是連接到二層的switch上。

Neutron一般包括三種網絡:

1、External Network/API Network,這個網絡是鏈接外網的,無論是用戶調用OpenStack的API,還是創建出來的虛擬機要訪問外網,或者外網要ssh到虛擬機,都需要通過這個網絡。

2、Data Network,數據網絡,虛擬機之間的數據傳輸通過這個網絡來進行,比如一個虛擬機要連接到另一個虛擬機,虛擬機要連接虛擬路由都是通過這個網絡來進行

3、Management Network,管理網絡,OpenStack各個模塊之間的交互,連接數據庫,連接Message Queue都是通過這個網絡來進行。

3.3 看個例子:

技術分享圖片

假設虛擬機VM0網卡eth0(掛載在linux bridge上面,linux虛擬網卡,可以操作/dev/tap*向這個虛擬網卡寫數)有網絡數據包向外網發送,那麽數據會依次經過qbr Linux Bridge設備,qvb(tap設備,通常叫qvb***,quantum veth bridge)和qvo(也是TAP,通常叫做qvo***,quantum veth ovs)虛擬網絡設備,到達OVS網橋br-int(完成標記和去除內部即本地租戶VLAN TAG,本機虛機2層流量的本地轉發)上,br-int將數據包attach到OVS網橋br-tun上,數據包再從compute節點OVS網橋的br-tun(OVS虛擬出來的網橋,進行隧道封裝,並完成VNI和VLAN映射,通過他將G於其他物理機聯通起來,這樣物理節點之間就可以形成一個GRE的點對點通信網絡或者vxlan網絡)和network節點OVS網橋br-tun構成的GRE隧道穿過,交付到Network節點的OVS網橋br-int上;網絡節點的br-int通過qr設備借助Linux命名空間qrouter(就是上面介紹的網絡節點上的neutron-l3-agent)連通到br-ex上的qg設備,將數據包交付到OVS網橋br-ex上,最後br-ex通過網絡節點的外部物理端口eth1把數據包傳送到外部路由器的網關。

註:

1、如果是VLAN模型則hr-tun會被替換成成 ovs br-eth*,完成流量送出送入,進行本地租戶VLAN和物理網絡租戶VLAN的轉換,例如將內部VLAN100轉換為外部VLAN200

2、既然qbr和br-int都是網橋,為什麽不直接連到br-int,還要通過qbr,qvb,qvo豈不是多余,為什麽會有qbr呢?這是和security group的概念有關。簡單說就是OVS網橋br-int沒有設置iptables規則的功能,但openstack又要提供安全組服務,就借助了Linux bridge(qbr)的功能,雖然OVS的br-int和linux bridge (qbr)都是二層網橋,但是為了功能互補就同時出現了。具體了解,openstack中的security group開通哪些端口,屏蔽哪些端口是用iptables來實現的,然而br-int這些虛擬bridge都是openvswitch創建的,openstack的Kernel mode和netfilter的kernel mode不兼容。一個IP包進來要麽走iptables規則進行處理,要麽走openvswitch的規則進行處理,br-int上有很多openvswitch的規則,比如vlan tag等,所以iptables必須要另外建立一個linux bridge(qbr)來做,因而就有了qbr,在了解拓撲結構的時候,可以將qbr忽略,看到VM直接連接到br-int上就可以了

3、為什麽會有namespace呢,java的namespace是為了在不同namespace下有相同類名,openstack也想做到這一點。不同Tenant都創建自己的router和private network,彼此不知道別人指定了哪些網段,很有可能兩個tenant都指定了192.168.0.0/24,這樣不同的private network的路由表,DHCP Server就需要隔離,不然就亂了,因而就有了namespace。

4、每個機器上都有了自己的br-int,但是對於虛擬機和虛擬router來說,它們仍然覺得自己連接到了一個大的L2的br-int上,通過這個br-int相互通信的,它們感受不到br-int下面的虛擬網卡br-tun。所以對於多節點結構,我們可以想象br-int是一個大的,橫跨所有compute和network節點的二層switch。這是一種很重要的抽象思維,好像openstack環境中所有虛擬機都連接到了一個巨型的虛擬交換機上。然而br-int畢竟被物理的割開了,需要有一種方式將他們串聯起來,openstack提供了多種方式,可以用GRE tunnel將不同機器的br-int連接起來,也可以通過VLAN將br-int連接起來,當然還可以使用vxlan。這就是為什麽openstack有了br-int這個bridge,但是不把所有的openvswitch的規則都在它上面實現。就是為了提供這種靈活性,對於虛擬機來講,看到的是一大整個br-int,不同機器的br-int可以有多種方式連接,這在br-int下面的網卡上面實現。

5\br-tun也是OVS創建的虛擬網橋,它是一個中間層,接收br-int的網絡數據,然後在通過特定網絡協議與各個節點的br-tun相連構成一個通道層。如果所有的br-int構成的抽象層定義為虛擬二層網絡,那麽所有的br-tun構成的抽象層邊上虛擬三層網絡了。

3.4 Horizon上創建一個neutron網絡的過程:

1、為這個Tenant創建一個private network,不同的private network是需要通過VLAN tagging進行隔離的,互相之間廣播(broadcast)不能到達,這裏我們我們用的是GRE模式,也需要一個類似VLANID的東西,稱為Segment ID(當然也可以是FLAT模式,不用vlan)

2、為private network創建一個subnet,subnet才是真正配置IP網段的地方,對於私網,我們常常用192.168.0.0/24這個網段

3、為這個Tenant創建一個Router,才能夠訪問外網

4、將private network連接到Router上

5、創建一個External Network((就是我們上面設置的192.168.226.138,ens37))

6、創建一個External Network的Subnet,這個外網邏輯上代表了我們數據中心的物理網絡,通過這個物理網絡,我們可以訪問外網。因而PUBLIC_GATEWAY應該設為數據中心裏面的Gateway,PUBLCI_RANGE也應該和數據中心的物理網絡的CIDR一致,否則連不通。之所以設置PUBLIC_START和PUBLIC_END,是因為在數據中心中,不可能所有的IP地址都給OpenStack使用,另外的可能搭建了VMware Vcenter,可能有物理機,所以僅僅分配一個區間給OpenStack來用。

7、將Router連接到External Network

3.5下面我們看看kolla demo1都幹了什麽,打開horizon網絡:

可看到有兩個網絡1、demo-net(采用vxlan網絡)連接的子網 demo-subnet 10.0.0.0/24 ,這個是內網, 2、和 public1(采用flat網絡)連接的子網public1-subnet 192.168.226.0/24,這個是外網

再看看路由,這裏有一個demo-router ,是內網訪問外網使用的。讓demo-net連到這個路由上面。

看看網絡拓撲

技術分享圖片

我們創建的demo1虛機連接到了demo-net上,demo-net連接到了demo-router後通過public1訪問外網。

查看一下網絡信息,只列出了第一行。

[root@localhost ~]# ifconfig

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536

qbr349ef9d5-c1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 //linux bridge網橋

qvb349ef9d5-c1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1450 //qbr 連接qvo的網卡

qvo349ef9d5-c1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1450 //qbr 連接qvo的網卡

tap349ef9d5-c1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 //直連虛機的網卡

veth51ddac5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 //虛擬網線

結語:

初入坑,網絡部分理解了半天,一臺電腦也不好搭建多虛機和跨三層的大二層打通環境,先到這,後面在繼續。

Openstack實踐(1)安裝部署第一個實例及neutron網絡