Openstack之路(六)创建云主机实例

时间:2024-10-04 07:04:37

创建云主机流程

Openstack之路(六)创建云主机实例

  1. 当访问Dashboard的时候,会显示一个登录页面,Dashboard会告诉你,想使用Openstack创建云主机?那你得先把你的账号密码交给我,我去Keystone上验证你的身份之后才能让你登录。
  2. Keystone接收到前端表单传过来的域,用户名,密码信息以后,到数据库查询,确认身份后将一个Token返回给该用户,让这个用户以后再进行操作的时候就不需要再提供账号密码,而是拿着Token来。
  3. Horizon拿到Token之后,找到创建云主机的按钮并点击,填写云主机相关配置信息。点击启动实例后,Horizon就带着三样东西(创建云主机请求、云主机配置相关信息、Keystone返回的Token)找到Nova-API。
  4. Horizon要创建云主机?你先得把你的Token交给我,我去Keystone上验证你的身份之后才给你创建云主机。
  5. Keystone一看Token发现这不就是我刚发的那个吗?但程序可没这么聪明,它还得乖乖查一次数据库,然后告诉Nova-API,这兄弟信得过,你就照它说的做吧。
  6. Nova-API把Horizon给的提供的云主机配置相关写到数据库(Nova-DB)。
  7. 数据库(Nova-DB)写完之后,会告诉Nova-API,哥,我已经把云主机配置相关信息写到我的数据库里啦。
  8. 把云主机配置相关信息写到数据库之后,Nova-API会往消息队列(RabbitMQ)里发送一条创建云主机的消息。告诉手下的小弟们,云主机配置相关信息已经放在数据库里了,你们给安排安排咯。
  9. Nova-Schedular时时观察着消息队列里的消息,当看到这条创建云主机的消息之后,就要干活咯。
  10. 要创建云主机,但它要看一看云主机都要什么配置,才好决定该把这事交给谁(Nova-Compute)去做,所以就去数据库去查看了
  11. 数据库收到请求之后,把要创建云主机的配置发给Nova-Schedular
  12. Nova-Schedular拿到云主机配置之后,使用调度算法决定了要让Nova-Compute去干这个事,然后往消息队列里面发一条消息,某某某Nova-Compute,就你了,给创建一台云主机,配置都在数据库里。
  13. Nova-Compute时时观察着消息队列里的消息,当看到这条让自己创建云主机的消息之后,就要去干活咯。注意:本应该直接去数据库拿取配置信息,但因为Nova-Compute的特殊身份,Nova-Compute所在计算节点上全是云主机,万一有一台云主机被******从而控制计算节点,直接***是很危险的。所以不能让Nova-Compute知道数据库在什么地方
  14. Nova-Compute没办法去数据库取东西难道就不工作了吗?那可不行啊,他不知道去哪取,但Nova-Conductor知道啊,于是Nova-Compute往消息队列里发送一条消息,我要云主机的配置相关信息,Nova-Conductor您老人家帮我去取一下吧。
  15. Nova-Conductor时时观察着消息队列里的消息,当看到Nova-Conductor发的消息之后,就要去干活咯。
  16. Nova-Conductor告诉数据库我要查看某某云主机的配置信息。
  17. 数据库把云主机配置信息发送给Nova-Conductor。
  18. Nova-Conductor把云主机配置信息发到消息队列。
  19. Nova-Compute收到云主机配置信息。
  20. Nova-Compute读取云主机配置信息一看,立马就去执行创建云主机了。首先去请求Glance-API,告诉Glance-API我要某某某镜像,你给我吧。
  21. Glance-API可不鸟你,你是谁啊?你先得把你的Token交给我,我去Keystone上验证你的身份之后才给你镜像。Keystone一看Token,兄弟,没毛病,给他吧。
  22. Glance-API把镜像资源信息返回给Nova-Compute。
  23. Nova-Compute拿到镜像后,继续请求网络资源,首先去请求Neutron-Server,告诉Neutron-Server我要某某某网络资源,你给我吧。
  24. Neutron-Server可不鸟你,你是谁啊?你先得把你的Token交给我,我去Keystone上验证你的身份之后才给你网络。Keystone一看Token,兄弟,没毛病,给他吧。
  25. Neutron-Server把网络资源信息返回给Nova-Compute。
  26. Nova-Compute拿到网络后,继续请求存储资源,首先去请求Cinder-API,告诉Cinder-API我要多少多少云硬盘,你给我吧。
  27. Cinder-API可不鸟你,你是谁啊?你先得把你的Token交给我,我去Keystone上验证你的身份之后才给你网络。Keystone一看Token,兄弟,没毛病,给他吧。
  28. Cinder-API把存储资源信息返回给Nova-Compute。
  29. Nova-Compute拿到所有的资源后(镜像、网络、存储),其实Nova-Compute也没有创建云主机的能力,他把创建云主机的任务交给了Libvird,然后创建云主机(KVM/ZEN)

创建云主机网络

  • 在控制节点上,加载admin凭证来获取管理员能执行的命令访问权限
[root@linux-node1 ~]# source admin-openrc
  • 创建网络
  1. [root@linux-node1 ~]# openstack network create --share --external \
  2. --provider-physical-network provider \
  3. --provider-network-type flat provider
  4. +---------------------------+--------------------------------------+
  5. | Field | Value |
  6. +---------------------------+--------------------------------------+
  7. | admin_state_up | UP |
  8. | availability_zone_hints | |
  9. | availability_zones | |
  10. | created_at | 2018-01-22T06:05:17Z |
  11. | description | |
  12. | headers | |
  13. | id | d8acc6f1-8aed-4f7c-a630-83225f592039 |
  14. | ipv4_address_scope | None |
  15. | ipv6_address_scope | None |
  16. | mtu | 1500 |
  17. | name | provider |
  18. | port_security_enabled | True |
  19. | project_id | 14055178975d417987c5a94f030c7acf |
  20. | project_id | 14055178975d417987c5a94f030c7acf |
  21. | provider:network_type | flat |
  22. | provider:physical_network | provider |
  23. | provider:segmentation_id | None |
  24. | revision_number | 4 |
  25. | router:external | External |
  26. | shared | True |
  27. | status | ACTIVE |
  28. | subnets | |
  29. | tags | [] |
  30. | updated_at | 2018-01-22T06:05:18Z |
  31. +---------------------------+--------------------------------------+
  32. [root@linux-node1 ~]# neutron net-list
  33. +--------------------------------------+----------+---------+
  34. | id | name | subnets |
  35. +--------------------------------------+----------+---------+
  36. | d8acc6f1-8aed-4f7c-a630-83225f592039 | provider | |
  37. +--------------------------------------+----------+---------+
  • 在网络上创建一个子网
  1. [root@linux-node1 ~]# openstack subnet create --network provider \
  2. --allocation-pool start=192.168.56.100,end=192.168.56.200 \
  3. --dns-nameserver 192.168.56.2 --gateway 192.168.56.2 \
  4. --subnet-range 192.168.56.0/24 provider-subnet
  5. +-------------------+--------------------------------------+
  6. | Field | Value |
  7. +-------------------+--------------------------------------+
  8. | allocation_pools | 192.168.56.100-192.168.56.200 |
  9. | cidr | 192.168.56.0/24 |
  10. | created_at | 2018-01-22T06:13:27Z |
  11. | description | |
  12. | dns_nameservers | 192.168.56.2 |
  13. | enable_dhcp | True |
  14. | gateway_ip | 192.168.56.2 |
  15. | headers | |
  16. | host_routes | |
  17. | id | 5ae96c6c-2295-4cef-8ce5-cc19f4596c90 |
  18. | ip_version | 4 |
  19. | ipv6_address_mode | None |
  20. | ipv6_ra_mode | None |
  21. | name | provider-subnet |
  22. | network_id | d8acc6f1-8aed-4f7c-a630-83225f592039 |
  23. | project_id | 14055178975d417987c5a94f030c7acf |
  24. | project_id | 14055178975d417987c5a94f030c7acf |
  25. | revision_number | 2 |
  26. | service_types | [] |
  27. | subnetpool_id | None |
  28. | updated_at | 2018-01-22T06:13:27Z |
  29. +-------------------+--------------------------------------+
  30. [root@linux-node1 ~]# neutron subnet-list
  31. +--------------------------------------+-----------------+-----------------+-------------------------------------------+
  32. | id | name | cidr | allocation_pools |
  33. +--------------------------------------+-----------------+-----------------+-------------------------------------------+
  34. | 5ae96c6c-2295-4cef-8ce5-cc19f4596c90 | provider-subnet | 192.168.56.0/24 | {"start": "192.168.56.100", "end": |
  35. | | | | "192.168.56.200"} |
  36. +--------------------------------------+-----------------+-----------------+-------------------------------------------+
  37. [root@linux-node1 ~]# neutron net-list
  38. +--------------------------------------+----------+------------------------------------------------------+
  39. | id | name | subnets |
  40. +--------------------------------------+----------+------------------------------------------------------+
  41. | d8acc6f1-8aed-4f7c-a630-83225f592039 | provider | 5ae96c6c-2295-4cef-8ce5-cc19f4596c90 192.168.56.0/24 |
  42. +--------------------------------------+----------+------------------------------------------------------+

创建云主机类型

默认的最小规格的主机需要512MB内存,对于环境中计算节点内存不足4 GB的,我们推荐创建只需要64MB的规格的主机。若单纯为了测试的目的,请使用规格的主机来加载CirrOS镜像。

  1. [root@linux-node1 ~]# openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1
  2. +----------------------------+-----------+
  3. | Field | Value |
  4. +----------------------------+-----------+
  5. | OS-FLV-DISABLED:disabled | False |
  6. | OS-FLV-EXT-DATA:ephemeral | 0 |
  7. | disk | 1 |
  8. | id | 0 |
  9. | name | |
  10. | os-flavor-access:is_public | True |
  11. | properties | |
  12. | ram | 64 |
  13. | rxtx_factor | 1.0 |
  14. | swap | |
  15. | vcpus | 1 |
  16. +----------------------------+-----------+

创建密钥

  • 导入demo项目凭证
[root@linux-node1 ~]# source demo-openrc
  • 生成和添加秘钥对
  1. [root@linux-node1 ~]# ssh-keygen -q -N ""
  2. Enter file in which to save the key (/root/.ssh/id_rsa):
  3. [root@linux-node1 ~]# ls -l .ssh/
  4. total 8
  5. -rw------- 1 root root 1679 Jan 22 14:28 id_rsa
  6. -rw-r--r-- 1 root root 398 Jan 22 14:28 id_rsa.pub
  7. [root@linux-node1 ~]# openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
  8. +-------------+-------------------------------------------------+
  9. | Field | Value |
  10. +-------------+-------------------------------------------------+
  11. | fingerprint | 6d:5f:c6:92:ac:5e:49:40:5c:3e:b4:14:9c:f9:59:8c |
  12. | name | mykey |
  13. | user_id | 48cd83bd3ce54b8ebece24680e8c8b0a |
  14. +-------------+-------------------------------------------------+
  • 验证公钥的添加
  1. [root@linux-node1 ~]# openstack keypair list
  2. +-------+-------------------------------------------------+
  3. | Name | Fingerprint |
  4. +-------+-------------------------------------------------+
  5. | mykey | 6d:5f:c6:92:ac:5e:49:40:5c:3e:b4:14:9c:f9:59:8c |
  6. +-------+-------------------------------------------------+

创建安全组规则

默认情况下,default安全组适用于所有实例并且包括拒绝远程访问实例的防火墙规则。对诸如CirrOS这样的Linux镜像,我们推荐至少允许ICMP (ping))和安全Shell(SSH)规则。

  • 允许ICMP请求
  1. [root@linux-node1 ~]# openstack security group rule create --proto icmp default
  2. +-------------------+--------------------------------------+
  3. | Field | Value |
  4. +-------------------+--------------------------------------+
  5. | created_at | 2018-01-22T06:46:59Z |
  6. | description | |
  7. | direction | ingress |
  8. | ethertype | IPv4 |
  9. | headers | |
  10. | id | 51ed729f-b268-4a99-b8a6-3a2ba0d31c77 |
  11. | port_range_max | None |
  12. | port_range_min | None |
  13. | project_id | 8a788702c6ea46419bb85b4e4600e3c4 |
  14. | project_id | 8a788702c6ea46419bb85b4e4600e3c4 |
  15. | protocol | icmp |
  16. | remote_group_id | None |
  17. | remote_ip_prefix | 0.0.0.0/0 |
  18. | revision_number | 1 |
  19. | security_group_id | 20346c59-a0c4-4cc3-90be-f94c3581edab |
  20. | updated_at | 2018-01-22T06:46:59Z |
  21. +-------------------+--------------------------------------+
  • 允许安全Shell(SSH)的访问
  1. [root@linux-node1 ~]# openstack security group rule create --proto tcp --dst-port 22 default
  2. +-------------------+--------------------------------------+
  3. | Field | Value |
  4. +-------------------+--------------------------------------+
  5. | created_at | 2018-01-22T06:49:46Z |
  6. | description | |
  7. | direction | ingress |
  8. | ethertype | IPv4 |
  9. | headers | |
  10. | id | 950a1be7-6fd3-4c80-ba60-7f4f0b573771 |
  11. | port_range_max | 22 |
  12. | port_range_min | 22 |
  13. | project_id | 8a788702c6ea46419bb85b4e4600e3c4 |
  14. | project_id | 8a788702c6ea46419bb85b4e4600e3c4 |
  15. | protocol | tcp |
  16. | remote_group_id | None |
  17. | remote_ip_prefix | 0.0.0.0/0 |
  18. | revision_number | 1 |
  19. | security_group_id | 20346c59-a0c4-4cc3-90be-f94c3581edab |
  20. | updated_at | 2018-01-22T06:49:46Z |
  21. +-------------------+--------------------------------------+

启动云主机实例

启动一台实例,您必须至少指定一个类型、镜像名称、网络、安全组、密钥和实例名称。

  • 在控制节点上,获得admin凭证来获取只有管理员能执行的命令的访问权限
[root@linux-node1 ~]# source demo-openrc
  • 一个实例指定了虚拟机资源的大致分配,包括处理器、内存和存储

列出可用类型

  1. [root@linux-node1 ~]# openstack flavor list
  2. +----+-----------+-----+------+-----------+-------+-----------+
  3. | ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
  4. +----+-----------+-----+------+-----------+-------+-----------+
  5. | 0 | | 64 | 1 | 0 | 1 | True |
  6. +----+-----------+-----+------+-----------+-------+-----------+

列出可用镜像

  1. [root@linux-node1 ~]# openstack image list
  2. +--------------------------------------+--------+--------+
  3. | ID | Name | Status |
  4. +--------------------------------------+--------+--------+
  5. | cd96090c-87ca-4eb3-b964-a7457639bc1e | cirros | active |
  6. +--------------------------------------+--------+--------+

列出可用网络

  1. [root@linux-node1 ~]# openstack network list
  2. +--------------------------------------+----------+--------------------------------------+
  3. | ID | Name | Subnets |
  4. +--------------------------------------+----------+--------------------------------------+
  5. | d8acc6f1-8aed-4f7c-a630-83225f592039 | provider | 5ae96c6c-2295-4cef-8ce5-cc19f4596c90 |
  6. +--------------------------------------+----------+--------------------------------------+

列出可用的安全组

  1. [root@linux-node1 ~]# openstack security group list
  2. +--------------------------------------+---------+------------------------+----------------------------------+
  3. | ID | Name | Description | Project |
  4. +--------------------------------------+---------+------------------------+----------------------------------+
  5. | 20346c59-a0c4-4cc3-90be-f94c3581edab | default | Default security group | 8a788702c6ea46419bb85b4e4600e3c4 |
  6. +--------------------------------------+---------+------------------------+----------------------------------+
  • 启动实例
  1. [root@linux-node1 ~]# openstack server create --flavor --image cirros \
  2. --nic net-id=d8acc6f1-8aed-4f7c-a630-83225f592039 --security-group default \
  3. --key-name mykey demo-instance
  4. +--------------------------------------+-----------------------------------------------+
  5. | Field | Value |
  6. +--------------------------------------+-----------------------------------------------+
  7. | OS-DCF:diskConfig | MANUAL |
  8. | OS-EXT-AZ:availability_zone | |
  9. | OS-EXT-STS:power_state | NOSTATE |
  10. | OS-EXT-STS:task_state | scheduling |
  11. | OS-EXT-STS:vm_state | building |
  12. | OS-SRV-USG:launched_at | None |
  13. | OS-SRV-USG:terminated_at | None |
  14. | accessIPv4 | |
  15. | accessIPv6 | |
  16. | addresses | |
  17. | adminPass | MowXppdE5ayJ |
  18. | config_drive | |
  19. | created | 2018-01-22T07:13:02Z |
  20. | flavor | (0) |
  21. | hostId | |
  22. | id | 3b5f20c8-8b17-48a2-9b72-70cc74f6fc8f |
  23. | image | cirros (cd96090c-87ca-4eb3-b964-a7457639bc1e) |
  24. | key_name | mykey |
  25. | name | demo-instance |
  26. | os-extended-volumes:volumes_attached | [] |
  27. | progress | 0 |
  28. | project_id | 8a788702c6ea46419bb85b4e4600e3c4 |
  29. | properties | |
  30. | security_groups | [{u'name': u'default'}] |
  31. | status | BUILD |
  32. | updated | 2018-01-22T07:13:02Z |
  33. | user_id | 48cd83bd3ce54b8ebece24680e8c8b0a |
  34. +--------------------------------------+-----------------------------------------------+
  • 检查实例的状态,状态为ACTIVE那台虚拟机已经成功创建
  1. [root@linux-node1 ~]# openstack server list
  2. +--------------------------------------+---------------+--------+-------------------------+------------+
  3. | ID | Name | Status | Networks | Image Name |
  4. +--------------------------------------+---------------+--------+-------------------------+------------+
  5. | 3b5f20c8-8b17-48a2-9b72-70cc74f6fc8f | demo-instance | ACTIVE | provider=192.168.56.110 | cirros |
  6. +--------------------------------------+---------------+--------+-------------------------+------------+

验证操作

  • 使用SSH加密连接实例
  1. [root@linux-node1 ~]# ssh cirros@192.168.56.110
  2. The authenticity of host '192.168.56.110 (192.168.56.110)' can't be established.
  3. RSA key fingerprint is 2f:58:9f:5e:da:c5:1f:46:43:e1:c4:64:da:ee:2e:e6.
  4. Are you sure you want to continue connecting (yes/no)? yes
  5. Warning: Permanently added '192.168.56.110' (RSA) to the list of known hosts.
  6. $
  • 验证能否ping通公有网络的网关
  1. $ ping -c 4 114.114.114.114
  2. PING 114.114.114.114 (114.114.114.114): 56 data bytes
  3. 64 bytes from 114.114.114.114: seq=0 ttl=128 time=29.289 ms
  4. 64 bytes from 114.114.114.114: seq=1 ttl=128 time=29.160 ms
  5. 64 bytes from 114.114.114.114: seq=2 ttl=128 time=34.413 ms
  6. 64 bytes from 114.114.114.114: seq=3 ttl=128 time=29.153 ms
  7. --- 114.114.114.114 ping statistics ---
  8. 4 packets transmitted, 4 packets received, 0% packet loss
  9. round-trip min/avg/max = 29.153/30.503/34.413 ms
  • 验证能否连接到互联网
  1. $ ping -c 4
  2. PING (14.215.177.39): 56 data bytes
  3. 64 bytes from 14.215.177.39: seq=0 ttl=128 time=12.611 ms
  4. 64 bytes from 14.215.177.39: seq=1 ttl=128 time=8.424 ms
  5. 64 bytes from 14.215.177.39: seq=2 ttl=128 time=10.575 ms
  6. 64 bytes from 14.215.177.39: seq=3 ttl=128 time=11.595 ms
  7. --- ping statistics ---
  8. 4 packets transmitted, 4 packets received, 0% packet loss
  9. round-trip min/avg/max = 8.424/10.801/12.611 ms
  • 使用虚拟控制台访问实例
  1. [root@linux-node1 ~]# openstack console url show demo-instance
  2. +-------+------------------------------------------------------------------------------------+
  3. | Field | Value |
  4. +-------+------------------------------------------------------------------------------------+
  5. | type | novnc |
  6. | url | http://192.168.56.11:6080/vnc_auto.html?token=aff15e93-1ebe-49f3-877b-3213e6faa027 |
  7. +-------+------------------------------------------------------------------------------------+
  • 浏览器访问192.168.56.11:6080/vnc_auto.html?token=aff15e93-1ebe-49f3-877b-3213e6faa027

Openstack之路(六)创建云主机实例