From 55e667a3859bfd78b05070d2782a708373f96ba5 Mon Sep 17 00:00:00 2001 From: nguyenhungsync Date: Tue, 25 Dec 2018 21:18:07 +0700 Subject: [PATCH] Update --- 1. Intro Cloud Computing.md | 70 +++ 2.install-pack-stack.md | 257 +++++++++++ Advance/1. Key-Rotate-&-Decrypt.md | 96 ++++ Advance/10. Limit-CPU-Resource.md | 55 +++ Advance/11. Metadata.md | 102 +++++ Advance/12. Cloud-init.md | 50 +++ Advance/13. Cloud-init-Script.md | 336 ++++++++++++++ Advance/14. QOS.md | 100 +++++ Advance/2.RabbitMQ-&-API-Endpoint.md | 19 + Advance/3. Log.md | 61 +++ Advance/4. Setup-noVNC.md | 122 ++++++ Advance/5. Nova-Compute-Serice-&-RabbitMQ.md | 107 +++++ Advance/6. Placement-API-&-Nova-Conductor.md | 163 +++++++ Advance/7.1. Resource-Management-OPS.md | 112 +++++ ... . Nova-Scheduler-&-Host-Aggreaggregate.md | 294 +++++++++++++ Advance/7.3. Lab-Filter-Scheduler.md | 124 ++++++ Advance/8. Resize-instance.md | 79 ++++ Advance/9. Rescue-instance.md | 66 +++ Cinder/1. Introduction-cinder.md | 56 +++ Cinder/2. Cinder-Disk-Work-Flow.md | 88 ++++ Cinder/3. Install-Cinder-LVM.md | 204 +++++++++ Cinder/4. Basic-Command.md | 168 +++++++ Cinder/5. Install-Multi-Backend.md | 169 ++++++++ Cinder/6. Filtering-Multi-Backend.md | 154 +++++++ Cinder/7. Cinder-More.md | 94 ++++ Glance/1. Introduction-Glance.md | 131 ++++++ Glance/2. Install Glance.md | 167 +++++++ Glance/3. Openstack-Glance-&-CURL.md | 190 ++++++++ Glance/4. Config.md | 76 ++++ Glance/5. Glance-Advanced.md | 121 ++++++ Horizon/Introduction-horizon.md | 47 ++ Keystone/1. Introduction-Keystone.md | 128 ++++++ Keystone/2.Install-Keystone.md | 198 +++++++++ .../3. Architecture-Keystone( additional ).md | 11 + Keystone/4. Config-Keystone.md | 141 ++++++ Keystone/5. Keystone-Openstack-CLI.md | 181 ++++++++ Keystone/6. Keystone-CURL.md | 273 ++++++++++++ Keystone/7. Token-Keystone.md | 108 +++++ Neutron/1. Introduction-neutron.md | 130 ++++++ Neutron/10. OPS-Packet-Provider.md | 80 ++++ Neutron/11. VXLAN-Tunnel.md | 153 +++++++ Neutron/12. VXLAN-Tunnel-Host-pair-OPS.md | 107 +++++ Neutron/2. Install Neutron Linux Bridge.md | 303 +++++++++++++ Neutron/2.1 . OVS-Self-Services.md | 402 +++++++++++++++++ Neutron/2.2. OVS Self-Service-&-Provider.md | 275 ++++++++++++ Neutron/3. Neutron-CLI.md | 410 ++++++++++++++++++ Neutron/4. Neutron-Namespace-Agent.md | 97 +++++ .../5. Packet-Walkthrough-Linux-Bridge.md | 151 +++++++ Neutron/6. Bonding.md | 184 ++++++++ Neutron/7. VXLAN.md | 176 ++++++++ Neutron/8. OpenvSwitch-OPS.md | 71 +++ Neutron/9. OPS-Packet-Self-Service.md | 135 ++++++ Neutron/Untitled Diagram.png | Bin 0 -> 23717 bytes Nova/1.Introduction-nova.md | 49 +++ Nova/2. Install-nova.md | 360 +++++++++++++++ Nova/3.Nova-Client&Curl.md | 171 ++++++++ Nova/4. Nova-Instance-Work-flow.md | 63 +++ Nova/5. Debug.md | 12 + Nova/6. Config-section.md | 39 ++ Readme.md | 68 +++ 60 files changed, 8354 insertions(+) create mode 100644 1. Intro Cloud Computing.md create mode 100644 2.install-pack-stack.md create mode 100644 Advance/1. Key-Rotate-&-Decrypt.md create mode 100644 Advance/10. Limit-CPU-Resource.md create mode 100644 Advance/11. Metadata.md create mode 100644 Advance/12. Cloud-init.md create mode 100644 Advance/13. Cloud-init-Script.md create mode 100644 Advance/14. QOS.md create mode 100644 Advance/2.RabbitMQ-&-API-Endpoint.md create mode 100644 Advance/3. Log.md create mode 100644 Advance/4. Setup-noVNC.md create mode 100644 Advance/5. Nova-Compute-Serice-&-RabbitMQ.md create mode 100644 Advance/6. Placement-API-&-Nova-Conductor.md create mode 100644 Advance/7.1. Resource-Management-OPS.md create mode 100644 Advance/7.2 . Nova-Scheduler-&-Host-Aggreaggregate.md create mode 100644 Advance/7.3. Lab-Filter-Scheduler.md create mode 100644 Advance/8. Resize-instance.md create mode 100644 Advance/9. Rescue-instance.md create mode 100644 Cinder/1. Introduction-cinder.md create mode 100644 Cinder/2. Cinder-Disk-Work-Flow.md create mode 100644 Cinder/3. Install-Cinder-LVM.md create mode 100644 Cinder/4. Basic-Command.md create mode 100644 Cinder/5. Install-Multi-Backend.md create mode 100644 Cinder/6. Filtering-Multi-Backend.md create mode 100644 Cinder/7. Cinder-More.md create mode 100644 Glance/1. Introduction-Glance.md create mode 100644 Glance/2. Install Glance.md create mode 100644 Glance/3. Openstack-Glance-&-CURL.md create mode 100644 Glance/4. Config.md create mode 100644 Glance/5. Glance-Advanced.md create mode 100644 Horizon/Introduction-horizon.md create mode 100644 Keystone/1. Introduction-Keystone.md create mode 100644 Keystone/2.Install-Keystone.md create mode 100644 Keystone/3. Architecture-Keystone( additional ).md create mode 100644 Keystone/4. Config-Keystone.md create mode 100644 Keystone/5. Keystone-Openstack-CLI.md create mode 100644 Keystone/6. Keystone-CURL.md create mode 100644 Keystone/7. Token-Keystone.md create mode 100644 Neutron/1. Introduction-neutron.md create mode 100644 Neutron/10. OPS-Packet-Provider.md create mode 100644 Neutron/11. VXLAN-Tunnel.md create mode 100644 Neutron/12. VXLAN-Tunnel-Host-pair-OPS.md create mode 100644 Neutron/2. Install Neutron Linux Bridge.md create mode 100644 Neutron/2.1 . OVS-Self-Services.md create mode 100644 Neutron/2.2. OVS Self-Service-&-Provider.md create mode 100644 Neutron/3. Neutron-CLI.md create mode 100644 Neutron/4. Neutron-Namespace-Agent.md create mode 100644 Neutron/5. Packet-Walkthrough-Linux-Bridge.md create mode 100644 Neutron/6. Bonding.md create mode 100644 Neutron/7. VXLAN.md create mode 100644 Neutron/8. OpenvSwitch-OPS.md create mode 100644 Neutron/9. OPS-Packet-Self-Service.md create mode 100644 Neutron/Untitled Diagram.png create mode 100644 Nova/1.Introduction-nova.md create mode 100644 Nova/2. Install-nova.md create mode 100644 Nova/3.Nova-Client&Curl.md create mode 100644 Nova/4. Nova-Instance-Work-flow.md create mode 100644 Nova/5. Debug.md create mode 100644 Nova/6. Config-section.md create mode 100644 Readme.md diff --git a/1. Intro Cloud Computing.md b/1. Intro Cloud Computing.md new file mode 100644 index 0000000..a43212a --- /dev/null +++ b/1. Intro Cloud Computing.md @@ -0,0 +1,70 @@ + +# Cloud Computing and Openstack + + +## 1.Cloud Computing + +### 1.1 : Khái niệm Cloud Computing +Khái niệm Cloud Computing, tại Việt Nam thì đa số hiểu là Điện Toán Đám Mây. Một trong các công nghệ “hot” trong vài năm trở lại đây. Đây cũng là một cụm từ được nhắc đến nhiều trong các bài báo, bài viết của các hãng công nghệ. Nó cũng có nguyên một định nghĩa của Viện tiêu chuẩn và công nghệ quốc gia của Mỹ (NIST) , thường được trích ra trong các bài thuyết trình của các chuyên gia (ngoài ra, có nhiều định nghĩa của các hãng tên tuổi khác nhưng tôi không đưa vào đây). Bạn có thể xem nó tại đây: [Định nghĩa về Cloud Computing của NIST](http://csrc.nist.gov/publications/nistpubs/800-145/SP800-145.pdf) + + +**Định nghĩa lược dịch từ NIST** + +> Cloud Computing là mô hình cho phép truy cập qua mạng để lựa chọn và sử dụng tài nguyên có thể được tính toán (ví dụ: mạng, máy chủ, lưu trữ, ứng dụng và dịch vụ) theo nhu cầu một cách thuận tiện và nhanh chóng; đồng thời cho phép kết thúc sử dụng dịch vụ, giải phóng tài nguyên dễ dàng, giảm thiểu các giao tiếp với nhà cung cấp” + +### 1.2. Mô hình 5 - 4 - 3 trong Cloud Computing + +**5 đặc điểm của cloud computing: *** + +- Khả năng thu hồi và cấp phát tài nguyên (Rapid elasticity) +- Truy nhập qua các chuẩn mạng (Broad network access) +- Dịch vụ sử dụng đo đếm được (Measured service,) hay là chi trả theo mức độ sử dụng pay as you go. +- Khả năng tự phục vụ (On-demand self-service). +- Chia sẻ tài nguyên (Resource pooling). + + +**_4 mô hình triển khai (mô hình sản phẩm) **: + +- Public Cloud: Đám mây công cộng (là các dịch vụ trên nền tảng Cloud Computing để cho các cá nhân và tổ chức thuê, họ dùng chung tài nguyên). +- Private Cloud: Đám mây riêng (dùng trong một doanh nghiệp và không chia sẻ với người dùng ngoài doanh nghiệp đó) . Điều này giúp cho doanh nghiệp có thể chủ động kiểm soát tối đa đối với dữ liệu, bảo mật và chất lượng dịch vụ. Doanh nghiệp sở hữu cơ sở hạ tầng và quản lý các ứng dụng được triển khai trên đó. +- Community Cloud: Đám mây cộng đồng (là các dịch vụ trên nền tảng Cloud computing do các công ty cùng hợp tác xây dựng và cung cấp các dịch vụ cho cộng đồng. ) +- Hybrid Cloud : Là mô hình kết hợp (lai) giữa các mô hình Public Cloud và Private Cloud + +![](https://www.dialwebhosting.com/images/typesofmodel.png) + +**_3 mô hình dịch vụ::_** + +- Hạ tầng như một dịch vụ (Infrastructure as a Service) : + - Cung cấp cho người dùng hạ tầng thô - các server, resource là: RAM, CPU, Storage (thường là dưới hình thức các máy ảo) như là một dịch vụ + - Dịch vụ IaaS phổ biến hiện nay trên thế giới như Amazon Cloud, Google Cloud, Microsoft +- Nền tảng như một dịch vụ (Platform as a Service) + - Cung cấp dịch vụ mà khách hàng có thể sử dụng ngôn ngữ lập trình, công cụ, nền tảng để phát triển và triển khai ứng dụng trên nền tảng dùng chung với khả năng kiểm soát môi trường và ứng dụng đã triển khai. IBM Workload Deployer, Google App Engine, Windows Azure, Force.com từ Salesforce là những ví dụ về PaaS +- Phần mềm như một dịch vụ (Software as a Service) + - Mô hình phổ biến mà khách hàng sử dụng các ứng dụng chuyên môn từ các thiết bị khác khác nhau qua một trình duyệt Web trên nền tảng dùng chung mà không cần quản lý hay kiểm soát tài nguyên cơ sở. Ví dụ, Gmail, Google Docs, IBM LotusLive. + - Nhà cung cấp dịch vụ triển khai gần như toàn bộ hoàn toàn hệ thống, các user sẽ sử dụng tài nguyên được cung cấp. +![](http://blog.appliedis.com/wp-content/uploads/2014/01/PaaS-1.png) + +## 2. Openstack + +### 2.1. Introduction + +- Openstack là một nền tảng mã nguồn mở sử dụng trong điện toán đám mây, mô hình triển khai mà Openstack hướng đến chủ yếu là Private Cloud và Private Cloud, nhờ Openstack mà các máy ảo , hoặc storage được đưa ra dựa vào yêu cầu của nhờ dùng. Nền tảng này bao gồm rất nhiều thành phần như hardware process, networking resource, storage. Người dùng có thể tương tác với Openstack quá Web-base, Resfull API và CLI +- Openstack được khởi xưởng bởi Nasa và Rackspace hosting vào năm 2010. Đến năm 2016. Openstack được phát triển bởi Openstack Foundation, một công ty phi lợi nhuận nhắm phát triển Openstack và nhận được sự đóng góp từ hơn 500 công ty lớn nhỏ vào dự án + +### 2.1. Đặc điểm của Openstack +- Được phát triển theo mô hình của Amazon Web Service +- Openstack là một dự án nói chung , phát triển nhờ sự hết hợp của các project con : nova, glance, neutron , swift.... +- Openstack có chu kỳ 6 tháng release một phiên bản mới +- +## 2.2. . Kiến trúc Openstack Core + +- Sơ đồ sau đây cung cấp một cái nhìn tổng quan về project core trong OpenStack và mối quan hệ của chúng với nhau. +![](https://access.redhat.com/webassets/avalon/d/Red_Hat_OpenStack_Platform-9-Architecture_Guide-en-US/images/fce6394275bd3444892c5d3a91ccf17c/RHEL_OSP_arch_347192_1015_JCS_01_Interface-Overview.png) + + +## 2.3 : Các thành phần cơ bản trong Openstack + +![](https://redhatstackblog.files.wordpress.com/2014/11/openstack-stack.jpg) + + + diff --git a/2.install-pack-stack.md b/2.install-pack-stack.md new file mode 100644 index 0000000..fd1fbf2 --- /dev/null +++ b/2.install-pack-stack.md @@ -0,0 +1,257 @@ + +## Packstack - Openstack + +# 1. Giới thiệu Packstack +Packstack là một bộ command-line sử dụng Puppet ([http://www.puppetlabs.com/](http://www.puppetlabs.com/)) module để triển khai nhanh Openstack thông qua kết nối SSH. Packstack rất thích hợp triển khai cho cả single node và multi node. +Hiện tại Packstack chỉ hỗ trợ `Centos` và `Redhat Enterprise Linux [RHEL]` . Ưu điểm lớn nhất của Packstack là triển khai hạ tầng nhanh chóng , sử dụng để demo , phát triển chức năng, nhưng ưu điểm của packstack là trong suốt với người dùng, việc triển khai hoàn toàn tự động. + + +# 2. Triển khai Packstack + +## 2.1 . Mô hình, phân bổ IP, môi trường triển khai +![](https://i.imgur.com/ogdwTbG.png) + +Môi trường +- OS : Centos 7.5 +- Version : Openstack Queens + +## 2.2 . Yêu cầu phần cứng tối thiểu + +- Controller Node + - 2GB RAM + - 50GB disk avaliable + - 2 NIC + +- Compute Node + - Kiểm tra extension ảo hóa + `grep -E 'svm|vmx' /proc/cpuinfo | grep nx` + Nếu có ouput thì server đã hỗ trợ ảo hóa + - 2GB RAM + - 50GB Disk avaliable + - 2 NIC + + +## 2.3 . Cấu hình IP cho các Compute node + +- Login vào Controller Node , thực hiện lệnh sau dưới root account +- Thiết lập hostname , IP trên tất cả Node +```bash +#!/bin/bash -ex +controller_name="controller" +host1_name="host1" +host2_name="hosts2" +controller=("ens192" "ens224" "192.168.30.130" "192.168.30.1" "192.168.69.130") +host1=("ens192" "ens224" "192.168.30.131" "192.168.30.1" "192.168.69.131") +host2=("ens192" "ens224" "192.168.30.132" "192.168.30.1" "192.168.69.132") +echo "${controller[0]}" +function set_controller(){ +# nmcli d modify ${controller[0]} ipv4.address ${controller[2]} +# nmcli d modify ${controller[0]} ipv4.gateway ${controller[3]} +# nmcli d modify ${controller[0]} ipv4.dns 1.1.1.1 +# nmcli d modify ${controller[0]} ipv4.method manual +# nmcli d modify ${controller[0]} down +# nmcli d modify ${controller[0]} up +# nmcli d modify ${controller[0]} connection.autoconnect yes +echo "Setup IP Management Card" +systemctl start NetworkManager +ip link set ${host1[1]} up +nmcli d modify ${controller[1]} ipv4.address ${controller[4]} +nmcli d modify ${controller[1]} ipv4.method manual +nmcli d modify ${controller[1]} connection.autoconnect yes +systemctl stop NetworkManager +service network restart +echo "Done Set IP controller" +} +function set_host1 { +# echo "Setup IP External Card ${host1_name}" +# ip link set ${host1[1]} up +# nmcli d modify ${host1[0]} ipv4.address ${host1[2]}/24 +# nmcli d modify ${host1[0]} ipv4.gateway ${host1[3]} +# nmcli d modify ${host1[0]} ipv4.dns 1.1.1.1 +# nmcli d modify ${host1[0]} ipv4.method manual +# nmcli d modify ${host1[0]} connection.autoconnect yes +echo "Setup IP Management Card ${host1_name} " +systemctl start NetworkManager +ip addr flush ${host1[1]} +ip link set ${host1[1]} up +nmcli d modify ${host1[1]} ipv4.address ${host1[4]}/24 +nmcli d modify ${host1[1]} ipv4.method manual +nmcli d modify ${host1[1]} connection.autoconnect yes +systemctl disable firewalld +systemctl stop firewalld +systemctl stop NetworkManager +service network restart +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux +} +function set_host2 { +# echo "Setup IP External Card ${host2_name}" +# ip link set ${host2[0]} up +# nmcli d modify ${host2[0]} ipv4.address ${host2[2]}/24 +# nmcli d modify ${host2[0]} ipv4.gateway ${host2[3]} +# nmcli d modify ${host2[0]} ipv4.dns 1.1.1.1 +# nmcli d modify ${host2[0]} ipv4.method manual +# nmcli d modify ${host2[0]} connection.autoconnect yes +echo "Setup IP Management Card ${host2_name}" +ip addr flush ${host2[1]} +ip link set ${host2[1]} up +nmcli d modify ${host2[1]} ipv4.address ${host2[4]}/24 +nmcli d modify ${host2[1]} ipv4.method manual +nmcli d modify ${host2[1]} connection.autoconnect yes +sudo systemctl disable firewalld +sudo systemctl stop firewalld +systemctl stop NetworkManager +service network restart +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux +reboot +} +echo "------------- Setting Controller ------------- " +set_controller +echo "------------- Connect To Host 1 ------------- " +echo "------------- Done ---------------------------" +ssh root@192.168.30.131 -t "$(typeset -f);\ +host1_name="host1" ; host1=("ens192" "ens224" "192.168.30.131" "192.168.30.1" "192.168.69.131"); set_host1" +echo "------------- Done ---------------------------" +echo "------------- Connect To Host 2 ------------- " +ssh root@192.168.30.132 -t "$(typeset -f);\ +host1_name="host1" ; host2=("ens192" "ens224" "192.168.30.132" "192.168.30.1" "192.168.69.132"); set_host2" +echo "------------- Done ---------------------------" +``` + + +### 2.4. Cài đặt Packstack + +Một số lưu ý khi cài đặt +- Sử dụng tài khoản, tài khoản root để thực hiện +- Thực hiện trên Controller Node +- Trong lúc thực hiện, sẽ yêu cầu password của các Compute Node tham giaf +- Quá trình cài đặt sẽ tự động hoàn toàn +- Cài đặt packstack Queens +```bash +yum install -y centos-release-openstack-queens epel-release +yum install -y openstack-packstack python-pip + +echo "------------------Cau hinh tong quan------------------" +packstack --gen-answer-file=/root/queens-answer.txt +sed -i "s/CONFIG_COMPUTE_HOSTS=.*/CONFIG_COMPUTE_HOSTS=192.168.69.131,192.168.69.132/g" /root/queens-answer.txt +sed -i "s/CONFIG_PROVISION_DEMO=.*/CONFIG_PROVISION_DEMO=n/g" /root/queens-answer.txt +sed -i "s/CONFIG_KEYSTONE_ADMIN_PW=.*/CONFIG_KEYSTONE_ADMIN_PW=123@123Aa/g" /root/queens-answer.txt +sed -i "s/CONFIG_DEFAULT_PASSWORD=.*/CONFIG_DEFAULT_PASSWORD=123@123/g" /root/queens-answer.txt +echo "------------------Cau hinh external network-----------" +sed -i "s/CONFIG_NEUTRON_OVS_BRIDGE_IFACES=.*/CONFIG_NEUTRON_OVS_BRIDGE_IFACES=br-ex:ens192/g" /root/queens-answer.txt +sed -i "s/CONFIG_HORIZON_SSL=.*/CONFIG_HORIZON_SSL=y/g" /root/queens-answer.txt +sed -i "s/192.168.30.130/192.168.69.130/g" /root/queens-answer.txt +echo "-----------------------DONE---------------------------" +echo "-----------------------Cai dat------------------------" +packstack --answer-file=/root/queens-answer.txt + +``` + +- Sau khi chạy script, quá trình cài đặt tự động bắt đầu +![](https://i.imgur.com/PQV5gyf.png) +![](https://i.imgur.com/vPwO8NV.png) + + +- Sau khi cài đặt xong, truy cập vào IP MGT của Controller để sử dụng Horizon +![](https://i.imgur.com/q7sj1QW.png) + + + + + + +## 2.5. Làm việc với command-line + +- Sau khi cài đặt thành công packstack, tại thư mục root sẽ có 2 file openrc, cung cấp 2 tài khoản `admin` và `demo`. Để có thể sử dụng tài khoản `admin` để xác thực ta cần thực thi các biến môi trường +``` +[root@controller ~] source ~/keystonerc_admin +[root@controller ~(keystone_admin)]# openstack token issue ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Field | Value | ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| expires | 2018-10-31T05:35:02+0000 | +| id | gAAAAABb2TD2l-Uwo_lwKNce9tny9FkhVUi--Toar88dWJ8LgmjYNF20EbnmQgF9yImqfQt0B6cvfgzw9EapVRkzVbx7DW0LK57jtiFtnT9_G34Lx5Y9oNGE0EcaEdIepBH_j5FQ2xXSnzApCrR1sa0KqR8ikRxpZWaWJnVAsq9Kq9bEns2qb3A | +| project_id | fc2293ba8d44415b8cdbf86d0e70216a | +| user_id | 0dc173d110e4435ab74440adcfdd505f | ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +[root@controller ~(keystone_admin)]# + +``` + +- Upload image lên glance +``` +wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img +openstack image create "cirros" \ + --file cirros-0.3.4-x86_64-disk.img \ + --disk-format qcow2 --container-format bare \ + --public +``` + +- Khởi tạo network external +``` +neutron net-create external_network --provider:network_type flat \ +--provider:physical_network extnet \ +--router:external \ +--shared +``` + +- Khởi tạo subnet cho network external +``` +neutron subnet-create --name ex_subnet --gateway 192.168.30.1 \ +--allocation-pool start=192.168.30.140,end=192.168.30.150 \ +--enable-dhcp=True external_network 192.168.30.0/24 +``` + +- Khởi tại self-servivce nework và subnet +``` +neutron net-create self-net +neutron subnet-create --name self-subnet self-net 10.20.20.0/24 +``` + +- Khởi tạo router +``` +neutron router-create ex_router +neutron router-gateway-set ex_router external_network +neutron router-interface-add ex_router self_subnet + +``` + +- Kiểm tra Port List trên các network vừa tạo +``` +[root@controller ~(keystone_admin)]# neutron port-list +neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead. ++--------------------------------------+------+----------------------------------+-------------------+---------------------------------------------------------------------------------------+ +| id | name | tenant_id | mac_address | fixed_ips | ++--------------------------------------+------+----------------------------------+-------------------+---------------------------------------------------------------------------------------+ +| 03a5b603-ead6-4ace-826e-ff4fa5ee1412 | | fc2293ba8d44415b8cdbf86d0e70216a | fa:16:3e:61:ec:72 | {"subnet_id": "34dc94de-4884-45fb-9732-2705a79fb798", "ip_address": "10.20.20.1"} | +| 9075b501-104d-4215-845c-ba5ce8f2a060 | | | fa:16:3e:bf:4f:dc | {"subnet_id": "449db0ad-6e9f-4b96-9927-09b4006e98d8", "ip_address": "192.168.30.148"} | +| aef9a689-f270-4a0c-9f3c-5e4b9028269b | | fc2293ba8d44415b8cdbf86d0e70216a | fa:16:3e:bd:8d:18 | {"subnet_id": "34dc94de-4884-45fb-9732-2705a79fb798", "ip_address": "10.20.20.2"} | +| d9f6cbee-2307-4b4d-bdcc-a3b440290edb | | fc2293ba8d44415b8cdbf86d0e70216a | fa:16:3e:f0:ed:31 | {"subnet_id": "449db0ad-6e9f-4b96-9927-09b4006e98d8", "ip_address": "192.168.30.140"} | ++--------------------------------------+------+----------------------------------+-------------------+------------------------------------------ + +``` +- Ping đến IP trong port list provider +``` +[root@controller ~(keystone_admin)]# ping 192.168.30.140 +PING 192.168.30.140 (192.168.30.140) 56(84) bytes of data. +64 bytes from 192.168.30.140: icmp_seq=1 ttl=64 time=0.673 ms +64 bytes from 192.168.30.140: icmp_seq=2 ttl=64 time=0.111 ms +64 bytes from 192.168.30.140: icmp_seq=3 ttl=64 time=0.085 ms +64 bytes from 192.168.30.140: icmp_seq=4 ttl=64 time=0.079 ms +64 bytes from 192.168.30.140: icmp_seq=5 ttl=64 time=0.082 ms +64 bytes from 192.168.30.140: icmp_seq=6 ttl=64 time=0.101 ms +64 bytes from 192.168.30.140: icmp_seq=7 ttl=64 time=0.058 ms +64 bytes from 192.168.30.140: icmp_seq=8 ttl=64 time=0.043 ms + +``` +## 2.56. Thao tác với Dashboard + +- Dashboard của Packstack có thể truy cập tại `192.168.30.130/dashboard` +![](https://i.imgur.com/JqqKdBi.png) + +- Tạo máy ảo +![](https://i.imgur.com/VNV0yAX.png) + +![](https://i.imgur.com/2uWbERs.png) +![](https://i.imgur.com/1MZHqqU.png) diff --git a/Advance/1. Key-Rotate-&-Decrypt.md b/Advance/1. Key-Rotate-&-Decrypt.md new file mode 100644 index 0000000..086c99c --- /dev/null +++ b/Advance/1. Key-Rotate-&-Decrypt.md @@ -0,0 +1,96 @@ + + +# Fernet và Rotate trong OPS + + +## 1. Key Rotation Tooling + +- Key Rotate xem xét các key để có một trong 2 mục đích và 1 trong 3 trạng thái . Mỗi key trong key repo có thể dùng để encrypt và decrypt hoặc chỉ có thể chỉ dùng để giải mã ( có thể chủ động hoặc thụ động ) + +- Phân biệt các loại key : + - **Primary key ** : sử dụng để khởi tạo token ( encrypt ) và để validation . Có thể nói đây là active key . Mỗi khi một user cần xác thực hoặc để tương tác với các API , key này sẽ được sử dụng . Chỉ có thể tồn tại một primry key và phải tồn tại trên các node dùng Keystone để xác thực . Primary key luôn có index cao nhất + - **Secondary key ** : sử dụng để validation token . Những key này được chuyển từ primary key, do đó có thể sử dụng để validate token, có thể tồn tại sau khi một primary key mới được khởi tạo. Có thể có nhiều primary key, tùy vào `max_active_key ` đểxác định số secondary key có thể tồn tại cùng 1 thời điểm + - **Staged key ** : Những key này sẽ có index nhỏ nhất ( 0 ) . Khi key repo được rotate, những key này sẽ được chuyển nhiệm vụ thành primary key với chỉ số index cao nhất . Những key này cho phép sao chép giữa các node trong cluster chức khi nó thành primary key . Key này cho phép keystone tránh được khi xác thực mà không có encrypt key . + + + +- Quá trình rotate key repo với **max_active_keys** = 4 + - B1 : Sau khi thiết lập một key repo mới sẽ có 2 key . Key file có index cao hơn sẽ là primaray key ( 1) , còn lại sẽ là staged key ( 0 ) + - **_0_** (**_staged_**_: the next primary key)_ + - **1** (**primary**: token generation & validation) + + - B2 : Khi rotate ( 0 ) sẽ lên làm primary key ( 2 ) mới , trong khi đó primaray key ( 1 ) sẽ về làm secondary ( 1 ) mới + - **_0_** (**_staged_**_: the next primary key)_ + - **1** (secondary: token validation) + - **2** (**primary**: token generation & validation) + - B3 : Staged key ( 0 ) sẽ trở thành primary key ( 3 ) , primary key cũ ( 3 ) sẽ trở thành seconday key ( 2 ) , seconday cũ ( 1 ) vẫn là khóa phụ + - **_0_** (**_staged_**_: the next primary key)_ : + - **1** (secondary: token validation) : + - **2** (secondary: token validation)- : + - **3** (**primary**: token generation & validation) + - B4 : Lần rotate tiếp theo , số key đã đến ngưỡng **max_active_keys**. Secondary key cũ nhất ( 1 ) sẽ bị xóa . Staged key ( 0 ) sẽ thành primary key ( 3 ) . Primary key ( 3 ) cũ sẽ thành secondary key ( 2 ) + - **_0_** (**_staged_**_: the next primary key)_ + - 1 (deleted) + - **2** (secondary: token validation) + - **3** (secondary: token validation) + -**4** (**primary**: token generation & validation + +- Công thưc tính max_active_key +``` +fernet-keys = ( token-validity(hours) / rotation-time(hours) ) + 2 +``` + + +- Rotate key mỗi 30 phút +``` +yum -y install cronie-noanacron +service crond start +cat << EOF >> /etc/crontab +30 * * * * root keystone-manage fernet_rotate --keystone-user keystone --keystone-group keystone +EOF +``` + + +- Cron Tab MAP +``` + + Example of job definition: + .---------------- minute (0 - 59) + | .------------- hour (0 - 23) + | | .---------- day of month (1 - 31) + | | | .------- month (1 - 12) OR jan,feb,mar,apr ... + | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat + | | | | |# * * * * * user-name command to be executed + +``` + + +## 2. Decrypt Keystone Token + +- Cài đặt python cryptography +``` +pip install ryptography +``` + +- Code Decrypt + +```python +from cryptography.fernet import Fernet +import sys +import binascii +import base64 + +cipher_suite = Fernet("j_Hhlxn8VmJDTjdAweSVfrS7A9e8NPvxhGrENrRW2XQ=") + +token = "gAAAAABb7jmviEf4K_5mnvfJ47p-_xC3XFqEehjLqLEhMRQ159YW0eex9xH6H7XKCCDOV-V1qoUxyMBfqVy2P0AOept_vnLZgHdbqmjO0iPu3YAF4QOnc73cR2jzjcmN9RIi7JJzi93e8y0-7i9DfDnjtuTLEr7cgxTuRBW1d966gg0GGFIPlZY" + +plain_text = cipher_suite.decrypt(token) + +print "Plain text: "+plain_text +``` +## Đang bị lỗi +## 3. Tham khảo thêm + +[1 ] : https://docs.openstack.org/newton/admin-guide/identity-fernet-token-faq.html +[2] : https://redhatstackblog.redhat.com/2017/12/20/using-ansible-for-fernet-key-rotation-on-red-hat-openstack-platform-11/ +[3] diff --git a/Advance/10. Limit-CPU-Resource.md b/Advance/10. Limit-CPU-Resource.md new file mode 100644 index 0000000..efbe7b5 --- /dev/null +++ b/Advance/10. Limit-CPU-Resource.md @@ -0,0 +1,55 @@ + + +### 1. Stress CPU và CGroup + +- Strees CPU trên máy ảo +``` +yum install epel-release stress +stress --cpu 1 --timeout 180 +``` + +- Kiểm tra trên compute node. Process QEMU đang chiếm 100% của 1 CPU +![](https://i.imgur.com/a2u2pJm.png) + +- Cài đặt Cgroup trên Compute node +``` +yum install install libcgroup libcgroup-tools +systemctl start cgconfig +systemctl enable cgconfig +``` + +- Cgroup sẽ quản lý các process theo các control group. Theo dạng phân cấp từ . ( root ) slice xuống các slice con, nhằm mục đích quản lý các process cùng một mục group process . + - System Slice : quản lý các system service + - Machine Slice : quản lý các virtual machie + - User slice : quản lý các user session + - Để xem cấu trúc phân cấp trong Cgroup : systemd-cgls + +- Cấu hình Cgroup limit %CPU của các service trong Machie Slice +``` +systemctl set-property machine.slice CPUQuota=80% +systemctl daemon-reload +``` + +- Stress máy ảo và kiểm tra lại trên Compute Node +![](https://i.imgur.com/BHy8brS.png) + + +### 2. Stress CPU và Flavor property + +- CPU period : chỉ định thời gian thực ( micro giây ) cho các process QEMU +- CPU Quota : chỉ định băng thông tối đa trên mỗi `cpu-period` + + +- Cấu hình flavor : giới hạn instance sử dụng 80% CPU vật lý +``` +openstack flavor set ssd.small \ + --property quota:cpu_quota=16000 \ + --property quota:cpu_period=20000 +``` + + +- Stress trên máy ảo +![](https://i.imgur.com/cvNb6FH.png) + +- Kiểm tra trên Compute Node +![](https://i.imgur.com/94LQ0NQ.png) diff --git a/Advance/11. Metadata.md b/Advance/11. Metadata.md new file mode 100644 index 0000000..95e8449 --- /dev/null +++ b/Advance/11. Metadata.md @@ -0,0 +1,102 @@ + + + +## Tìm hiểu Metadata Service + +## 1. Metadata Service là gì ? + +- Openstack Compute sử dụng metadata service để gửi một thông tin bổ sung tới các instance thông qua địa chỉ link-local adress +- Link-local address là một địa chỉ Unicast sử dụng để kết nối tới các host trong cùng một network hoặc segment. Link local IPv4 được chỉ định trong network 169.254.0.0/16 +- Để nhận được cấu hình từ Metadata, các instance cần gửi một HTTP Request tới link-local IP adress. Sau đó một metadata agent sẽ xử lý request , thường sẽ được đảm nhiệm bởi một NovaService +- Các instance có thể nhận được các thông tin sau : + - Public IP + - Public Hostname + - Ramdom Seed + - SSH Public Key + - Cloud_init + - User-data cho quá trình Nova-boot + - Định tuyến tĩnh + +- Các instance sẽ gửi một HTTP Request đến link-local address : 168.254.169.254. Sau đó service lắng nghe sẽ thêm vào request các HTTP Request và chuyển tiếp request đến nova service. + - Các Header bao gồm : + - X-instance-ID : UUID củ instance + - X-instance-ID-Signature : một ID mã hóa của instance + - X-tenant-ID : UUID của instance + - X-forwarder-For : địa chỉ IP của instance. + + +## 2. Các thành phần của Metadata + +![](https://camo.githubusercontent.com/f8a09d96edd1769cbdc5a528e97dc28ec15ec121/687474703a2f2f692e696d6775722e636f6d2f504f37446157722e706e67) + +- **Nova-api-metadata** : chịu trách nhiệm cung cấp metadata cho các instance. Các instance gửi các HTTP Request . Nova-api-meta chạy trên nova-node và sẽ lắng nghe trên port : 8775 + +- **Neuton-metadata-agent** : Các instance sẽ không được phép gửi các HTTP request trực tiếp đến nova-api-metata . Thay vì đó sẽ sử dụng neutron-data-agent chạy trên neutron node để nhận các request từ các instance. Sau đó neutron-metata-agent sẽ forward request đến neutron-api-metadata. Neutron-metadata-agent hoạt động như một proxy trong trường hợp này. Nhưng các instance vẫn không thể liên hệ được tới **neutron-metadata-agent** do agent này trong ở trong **OpenStack internal management network** . Tuy nhiên có `dhcp agent` và `l3 agent` để tạo ra một proxy để thiết lập kết nối này. + +- **Neutron-ns-metadata-proxy** : được khởi tạo bởi `dhcp-agent` hoặc `l3-agent` ( trên network node ) + - Trong trường hợp nếu `DHCP Agent` được khởi tạo thì proxy sẽ được chạy trên namspace **dhcp-agent**. + - Trong trường hợp nếu `l3-agent` được tạo thì proxy sẽ chạy trên namespace router + - `Neutron-ns-metadata-proxy` kết nối trực tếp đến `neutron-metadata-agent` thông qua unix domain socket. + - `Neutron-ns-metadata-proxy` nếu chạy trên **namespace dhcp-agent** sẽ lắng nghe trên port 80. + -`Neutron-ns-metadata-proxy` nếu chạy trên **namespace của neutron router** sẽ lắng nghe trên port 9697. + + +## 3. Luồng đi của metadata trong OPS + +### 3.1 . Instance gửi request metadata +- B1 : Instance gửi HTTP request tới **neutron-ms-metadata-proxy** thông qua project network +- B2 : **Neutron-ms-metata-proxy** sẽ gửi request tới **neutron-metata-agent** thông qua unix domain socket +- B3 : **Neutron-metadata-agent** sẽ gửi request tới **nova-api-metata** + +- Khi một máy ảo gửi một request metadata, request sẽ đến router (vì nó là default gateway). Lúc này tại router namspace sẽ có một iptables rule để redirect traffic tới đích là một metadata server với local port là _9697_. Trong request sẽ có các thông tin sau : IP của máy ảo đã gửi request, Router ID của cái router đã được kết nối tới mạng mà máy ảo đang sử dụng. Sau khi có được các thông tin như trên metadata proxy sẽ thêm các thông tin ( IP của VM và Router ID) vào trong HTTP Header và forward request tới metadata agent. Metadata agent sẽ sử dụng router ID để liệt kê ra tất cả các network đã kết nối tới router và xác định network nào là network mà máy ảo gửi request đang sử dụng. Tại sao lại có bước này, đơn giản bởi vì với công nghệ network namespace mà openstack sử dụng thì các tenant network là hoàn toàn isolate, ta có thể tạo ra các Instances có IP hoàn toàn giống nhau ở các network khác nhau, nên phải ta phải có cơ chế để biết chính xác nguồn gửi request ( Nó là VM nào thuộc network nào). + +Tiếp theo, matadata agent sẽ query tới neutron server để lấy instance ID của VM bằng cách sử dụng IP và Network ID để lọc. Cuối cùng nó sẽ thêm instance ID vào HTTP request và forward request tới NOVA. + +### 3.2. Metadata sử dụng router namespace + + + + + +- Yêu cầu một L3-Agent để khởi tạo metadata service , có nghĩa là cần khởi tạo một project network . Trong router namespace, metadata proxy để xử lý các metadata request , iptable rules sẽ định tuyến để chuyển tiếp các request tới metadata proxy. +- **neutron-ns-metadata-proxy** : sẽ chạy trên router namspache và nghe trên cổng 9697 +- IPtable sẽ chuyển tiếp các metadata request tới **http://169.254.169.254:80** vào cổng `9697` +``` +[root@controller ~]# ip netns exec qrouter-d8faa3e7-ec12-45cc-8a33-a215356adbd0 iptables-save | grep REDIRECT +-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697 +``` + + +### 3.2 Metadata sử dụng DHCP Namespace + + + + + +- Openstack có thể cấu hình sử dụng Metadata proxy trên DHCP namespace. , vì vậy metadata service có thể hoạt động trong trên một tenant project và không cần kết nối tới router. + +- Kiểm tra trên một dhcp namespace , sẽ thấy metadata server IP : `169.254.169.254` +``` +[root@controller ~]# ip netns exec qdhcp-91027e46-6e22-4d80-a9ee-da8bbe133c80 ip a +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +47: tap0005380b-07: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 + link/ether fa:16:3e:9d:35:1e brd ff:ff:ff:ff:ff:ff + inet 192.168.30.140/24 brd 192.168.30.255 scope global tap0005380b-07 + valid_lft forever preferred_lft forever + inet 169.254.169.254/16 brd 169.254.255.255 scope global tap0005380b-07 + valid_lft forever preferred_lft forever + inet6 fe80::f816:3eff:fe9d:351e/64 scope link + valid_lft forever preferred_lft forever +``` + + + + +- ** Metadata-proxy** chạy trên namespace này sẽ nghe trên cổng 80, và metadata request cũng được namespace này lắng nghe trên cổng 80. Khi cấp DHCP , thì DHCP server đã khởi tạo một static route tới địa chỉ `169.254.169.254`. Các instance là các dhclient sẽ sẽ nhận được bảng định tuyến này., vì vậy các metadata request sẽ được route tới dhcp-namespace. Meta-proxy sẽ lắng nghe các request mà các instance gửi đến. + + diff --git a/Advance/12. Cloud-init.md b/Advance/12. Cloud-init.md new file mode 100644 index 0000000..3c10e30 --- /dev/null +++ b/Advance/12. Cloud-init.md @@ -0,0 +1,50 @@ + +## Tìm hiểu Cloud INIT + + +## 1. Cloud init là gì ? + +- Cloud init mà một packet tập hợp các python script và các tiện ích đi kèm . Cloud init thường được sử dụng cho môi trường ảo hóa, mục đích nhằm thiết lập các kịch bản tự động để cấu hình bước đầu cho máy ảo bao gồm network, SSH key, timezone , mật khẩu, khởi tạo người dùng và nhóm người dùngvà các thiết lập nâng cao khác. +- Cloud init là một service được khởi động sớm trong quá trình boot , cho phép nhận các userdata từ mạng ngoài và thực hiện các hành động tương ứng +- Để nhận được các user data , các image của máy ảo phải cấu hình cloud initđể nhận các userdata từ metadata service khi khởi động và thực hiện các hành động dựa vào userdata. +- Hiện nay Cloud init đã được cài đặt trên các bản Image Cloud : Ubuntu, Ferodat, Debian, RHEL, CentOS +- Cloud-init không phải là một công nghệ của OpenStack, mà nó là một gói phần mềm được thiết kế để hỗ trợ nhiều cloud providers, để các VM image có thể được sử dụng trong các cloud khác nhau mà không cần sửa đổi. Cloud-init là một dự án mã nguồn mở và source code có sẵn trên Launchpad.( [http://launchpad.net/cloud-init](http://launchpad.net/cloud-init) ) +- Hiện nay Cloud init đang hỗ trợ các định dạng user data gồm : + +|Type |Định dạng | Miêu tả | +|------|---------|-----------| +|Cloud Config File| Bắt đầu bằng `#cloud-config` hoặc `Content-Type: text/cloud-config` | Sẽ chứa các cloud-config data | +| Shell Script | `#!` hoặc `Content-Type: text/x-shellscript` | Script sẽ được thực thi giống như file `rc.local` trong lầ n boot đầu tiên | +| Include File | `#include` hoặc `Content-Type: text/x-include-url` | Một file chứa các URL . Mỗi URL sẽ được đọc nội dung trong file và sẽ thực thi theo một quy tắc | +| Gzip Compressed Content | | Cách file gzip sẽ được giải nén để thực thi | +| Mime Multi Part archive| | Sử dụng nhiều loại dữ liệu , đồng thời cloud-config và shell script | +| **Upstart Job** | `#upstart-job` hoặc `Content-Type: text/upstart-job`| | +|**Cloud Boothook**|`#cloud-boothook` hoặc `Content-Type: text/cloud-boothook`|| +|**Part Handler**|`#part-handler` hoặc `Content-Type: text/part-handler`|| + + +## 2. Metadata trong Cloud INIT + +- Instance metadata đảm nhiệm tập hợp các userdata mà cloud-init dùng để cấu hình các instance. +- Thư mục của cloud-init được tại `/var/lib/cloud` +- Để xem userdata đượi gửi : `/var/lib/cloud/instance/user-data.txt` +``` +[root@cent-cloudinit instance]# cat /var/lib/cloud/instance/user-data.txt +#cloud-config +user: root +password: password123 +chpasswd: {expire: False} +ssh_pwauth: True + +``` + + +- Cloud ini trong Openstack : + - Cloud-init service sẽ nhận các metada từ : http://169.254.169.254/latest/meta-data và http://169.254.169.254/latest/user-data, sau đó dùng các python script để thực hiện các công việc trong metadata dựa vào format userdata + - Nova-API sẽ đảm nhiệm gửi các Metadata về các instance + +![](https://camo.githubusercontent.com/e77e6d313a1255e1aed5600f666ec29b73bc415a/687474703a2f2f692e696d6775722e636f6d2f456367437934412e706e67) + + + +Tham khảo thêm quá trình Medata : https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/11.%20Metadata.md diff --git a/Advance/13. Cloud-init-Script.md b/Advance/13. Cloud-init-Script.md new file mode 100644 index 0000000..86df36b --- /dev/null +++ b/Advance/13. Cloud-init-Script.md @@ -0,0 +1,336 @@ + +## LAB Cloud INIT : Gửi thông tin máy ảo về Cloud + +## 1. Cấu hình Slack + +- Khởi tạo APP trên Slack API + +![](https://i.imgur.com/d9pYvd0.png) + + +- Cài đặt APP vào Workspace tại `# Basic Information` + +![](https://i.imgur.com/tg7Od71.png) + +- Chọn Channel nhận thông báo + +![](https://i.imgur.com/JGflH8T.png) + +- Bật chức năng Webhook + +![](https://i.imgur.com/aX9f4St.png) + +- Tham khảo cấu trúc Request và sử dụng Token + +![](https://i.imgur.com/nrjLeaX.png) + +- Kiểm thử Request + +![](https://i.imgur.com/13dekTU.png) +![](https://i.imgur.com/8BULOXT.png) + + +## 2. Script khởi tạo máy ảo + +```bash + +function check_pre() { + + + +## Notifi slack using curl - only for testing env + + + +curl --retry-max-time 5 -X POST -H 'Content-type: application/json' --data '{"text": "- Virutal Machine create at : '"$(date -R )"' \n - IP su dung : '"${PUBLIC_IPV4} "' - Mật khẩu : '"${list}"' " }' https://hooks.slack.com/services/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 + + + +if [ -f "/etc/redhat-release" ]; + +then + + + +echo "------------------Centos - Redhat OS------------------" + +FS='-' read -ra packs <<< "$2" #Convert string to array + + + +echo "root:${list}" | chpasswd + +#Print all packages + +for pack in "${packs[@]}"; do + +$pack"_centos" + +done + + + +else + + + +echo "------------------Ubuntu OS------------------" + + + +FS='-' read -ra packs <<< "$2" #Convert string to array + +echo "root:${list}" | chpasswd + + + +#Print all packages + +for pack in "${packs[@]}"; do + +$pack"_ubuntu" + +done + +echo $list + +fi + + + +} + + + +function nginx_ubuntu() { + + + +export DEBIAN_FRONTEND=noninteractive + +export HOST=$(curl -s http://169.254.169.254/latest/meta-data/hostname) + +export PUBLIC_IPV4=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4) + + + +# Install Nginx + +apt-get -y install nginx + + + +# Write hostname and IP address to index.html + +mkdir -p /var/www/html + +sed -i -e "s|/usr/share/nginx/html|/var/www/html|g" /etc/nginx/sites-available/default + +echo -e "HOSTNAME: $HOST
IP PUBLIC: $PUBLIC_IPV4" \ + +> /var/www/html/index.html + +service nginx restart + + + +} + + + +function nginx_centos() { + +## Get metadata info + +export HOST=$(curl -s http://169.254.169.254/latest/meta-data/hostname) + +export PUBLIC_IPV4=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4) + + + +# Install Nginx + +yum install -y epel-release nginx + +systemctl enable nginx +service nginx start + + + +} + + + +function nodejs_centos() { + +curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash - + +yum install -y nodejs + + + +} + + + +function nodejs_ubuntu() { + +curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash - + +apt-get install -y nodejs + +} + + + +function wordpress_centos() { + +## call install nginx + +nginx_centos + + + +## install package + + +yum install -y yum-utils +yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm +yum-config-manager --enable remi-php72 +yum install -y unzip wget php-cli php-fpm php-mysql php-json php-opcache php-mbstring php-xml php-gd php-curl mariadb-server + +sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php.ini + +sed -i -e "s|user = apache|user = nginx|" /etc/php-fpm.d/www.conf +sed -i -e "s|group = apache|group = nginx|" /etc/php-fpm.d/www.conf + +semanage permissive -a httpd_t + + +systemctl enable php-fpm.service +systemctl start php-fpm.service + + +wget https://wordpress.org/latest.zip -O /tmp/wordpress.zip + +unzip /tmp/wordpress.zip -d /tmp/ + +cd /tmp/wordpress + +cp wp-config-sample.php wp-config.php + + + + + +systemctl start mariadb + +systemctl enable mariadb + + + +MYSQLPW=`openssl rand -base64 14` + +WPDB=`openssl rand -base64 14` + +echo -e "Mat khau ROOT MYSQL : ${MYSQLPW}\n Mat khau MYSQL WORDPRESS : ${WPDB}" > /root/passwd.txt + +sed -i -e "s/database_name_here/wordpress/" /tmp/wordpress/wp-config.php + +sed -i -e "s/username_here/admin/" /tmp/wordpress/wp-config.php + +sed -i -e "s/password_here/$WPDB/" /tmp/wordpress/wp-config.php + + +/usr/bin/mysqladmin -u root -h localhost password $MYSQLPW + +mysql -u root --password=$MYSQLPW < /etc/nginx/nginx.conf + + +user www-data; +pid /run/nginx.pid; +worker_processes auto; +worker_rlimit_nofile 65535; + +events { + multi_accept on; + worker_connections 65535; +} + +http { + charset utf-8; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + server_tokens off; + log_not_found off; + types_hash_max_size 2048; + client_max_body_size 16M; + + # MIME + include mime.types; + default_type application/octet-stream; + + # logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log warn; + + # SSL + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:50m; + ssl_session_tickets off; + + # modern configuration + ssl_protocols TLSv1.2; + ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256; + ssl_prefer_server_ciphers on; + + # OCSP Stapling + ssl_stapling on; + ssl_stapling_verify on; + resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s; + resolver_timeout 2s; + + # load configs + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} + +EOF + + + +} + + +list=(`openssl rand -base64 14` "nginx") + +check_pre ${list[@]} + +echo $list + + +``` diff --git a/Advance/14. QOS.md b/Advance/14. QOS.md new file mode 100644 index 0000000..543a84a --- /dev/null +++ b/Advance/14. QOS.md @@ -0,0 +1,100 @@ + +## Quality of Service (QoS) + +## 1. Introduction +- QoS được hiểu đảm bảo các yêu cầu mạng như băng thông, độ trễ , tốc độ cấp ứng để đáp ứng `Service Level Agreement (SLA)` giữa nhà cung cấp mà người dùng +- Cụ thể hơn, QoS sẽ thể hiện rõ tác dụng ở những vị trí thường xảy ra hiện tượng bottleneck(hay thường gọi nôm nà là thắt nút cổ chai), đồng thời quyết định phần traffic nào quan trọng hơn các phần còn lại, dựa trên quy luật mà người sử dụng thiết lập có liên quan tới nhiều khía cạnh tùy vào từng dịch vụ +- Trong môi trường Network : Network Quality of Service là một công cụ tổng thể được dùng để bảo vệ, ưu tiên một số traffic quan trọng hoặc các traffic đòi hỏi xử lý nhanh về thời gian. QoS sẽ mô tả cách thức packet được chuyển mạch như thế nào (yếu tố how). Nếu không có QuoS, các router hoặc switch chỉ đơn thuần quyết định là một packet có được fw hay không. (yếu tố if) . + - Khi một packets đi từ host này đến host kia, một gói tin (packet) có thể gặp các vấn đề: + - Delay: do routers xử lý tìm kiếm trong bảng routing table, thời gian packet truyền trên đường truyền. + - Jitter: các packets không đến đúng như thời gian dự đị nh. Các dữ liệu dạng audio sẽ bị ảnh hưởng nhiều b ởi vấn đề này. + - Loss: mất packets + +- Trong môi trường Storage : Storage Quality of Service cho phép các người quản trị có thể monitor cũng như quản lý và thiết lập rule ưu tiên theo từng loại hình access và resource use trong một Storage Cluser .Các policy giúp việc giới hạn I/O storage và các Vitual Machine đảm bảo không vượt quá ngưỡng cho phép. + +### 2. QOS trong Neutron + +- Trong Neutron hiện đang hỗ trợ các Rule QOS sau : + - banwitth_limit : hỗ trợ giới hạn băng thông tối đa trên từng network, port và IP floating + - dhcp_marking : hỗ trợ giới hạn băng thông dựa trên DSCP value. - Với QoS. Marking là 1 task nhỏ trong Classtifycation, (và tất nhiên marking lúc này là DSCP cho Difserv). Classtifycation có 2 task là identify gói tin và marking gói tin. sau đó đẩy vào các queuing. dùng scheduling để quyết định gói nào VIP ra trước, gói nào dân đen thì "chờ đi mày". ) + - minimum_bandwidth : giới hạn băng thông tối đa dựa lên kiểu kết nối . + +- Bảng dưới đây hiển thị QOS support rule trên từng Network Back-end +![](https://i.imgur.com/sHUxCUB.png) + + +### 2.2 Cấu hình QOS trên Compute Node + +- Warning : cẩn thận kiểm tra tập tin cấu hình trước khi tao tác + +- Cấu hình tùy chọn extension sử dụng `QOS` trên section `agent` Layer 2 +``` +yum install -y crudini +cp -p /etc/neutron/plugins/ml2/openvswitch_agent.ini /etc/neutron/plugins/ml2/openvswitch_agent.ini.bak +crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini agent extensions qos +``` + +- Khởi động lại Agent +``` +systemctl restart neutron-openvswitch-agent.service +``` + +### 2.2 . Cấu hình QOS trên Network Node ( Controller Node ) + +- Warning : cẩn thận kiểm tra tập tin cấu hình trước khi tao tác + +- Cấu hình QOS service +``` +cp -p /etc/neutron/neutron.conf /etc/neutron/neutron.conf.bak +yum install -y crudini +crudini --set /etc/neutron/neutron.conf DEFAULT service_plugins \ neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,neutron.services.metering.metering_plugin.MeteringPlugin,neutron.services.qos.qos_plugin.QoSPlugin +``` + +- Cấu hình QOS extension cho driver layer 2 +``` +cp -p /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugins/ml2/ml2_conf.ini.bak +crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security,qos + +``` + +- Cấu hình QOS extension cho agent layer 2 +``` +cp -p /etc/neutron/plugins/ml2/openvswitch_agent.ini /etc/neutron/plugins/ml2/openvswitch_agent.ini.bak + crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini agent extensions qos +``` + +- Cấu hình Limit trên Gateway Router ( Layer 3 - vì giới hạn tốc độ không làm việc trên các cổng internal Open vSwitch ) +``` +cp -p /etc/neutron/l3_agent.ini /etc/neutron/l3_agent.ini.bak +crudini --set /etc/neutron/l3_agent.ini DEFAULT ovs_use_veth True +``` + + +- Khởi động lại dịch vụ + +``` +systemctl restart neutron-openvswitch-agent.service neutron-l3-agent.service +``` + + +- Mặc định , chỉ Admin mới có thể tạo ra các QOS policy ,có thể cấu hình để cho các tài khoản thường có thể tạo QOS +``` +cat < /etc/neutron/policy.json +"get_policy": "rule:regular_user", +"create_policy": "rule:regular_user", +"update_policy": "rule:regular_user", +"delete_policy": "rule:regular_auser", +"get_rule_type": "rule:regular_user", +EOF +``` + +- Cho phép User thường khởi tạo bandwidth limit rule +``` +cat <> /etc/neutron/policy.json +"get_policy_bandwidth_limit_rule": "rule:regular_user", +"create_policy_bandwidth_limit_rule": "rule:regular_user", +"delete_policy_bandwidth_limit_rule": "rule:regular_user", +"update_policy_bandwidth_limit_rule": "rule:regular_user", +EOF +``` + diff --git a/Advance/2.RabbitMQ-&-API-Endpoint.md b/Advance/2.RabbitMQ-&-API-Endpoint.md new file mode 100644 index 0000000..d8069a2 --- /dev/null +++ b/Advance/2.RabbitMQ-&-API-Endpoint.md @@ -0,0 +1,19 @@ + +## RabbitMQ và API trong Nova OPS + + +## 1. RabbitMQ và API + +- AMQP được chọn đảm nhiệm quản lý message trong Openstack Cloud . Rabbitmq sử dụng AMQP broker cho dịch vụ message queue của mình . Rabbitmq nắm nhiệm vụ ngồi giữa bất 2 compoment trong nova cho phép chúng liên lạc với nhau mà không cần xác thực. +- Trong OPS tận dụng publish/subscribe để quản lý hàng chờ : +![](https://i.imgur.com/Y9ghikN.png) + +- Cung cấp khả năng tách biệt các message giữa nhiều _producer_ và _consumer_ +- Đồng bộ toàn phần giữa producer và consumer. Trong rabbit mq cung cấp khả năng one-way messaging. Consumer gửi một request kèm theo một message . Client sẽ không chờ reply từ server mà vẫn sẽ tiếp tục xử lý . Request sẽ được gửi đến hàng chờ nơi producer sẽ message . Yêu cầu sẽ không được xử lý ngay lập tức nhưng vẫn sẽ ở trong hàng chờ cho đến khi message được gửi đến server . Khi message đã được chuyển vào hàng chờ thì , consumer sẽ không được nhận các thông báo về state bên prodcuer. + +- Trong khi đó khi một request được gửi đến API , các HTTP request gửi đến yêu cầu được reply từ server.. Giữa Client và Server cần thiết lập kết nối trước khi truyền tải . Đối với các Request API sẽ yêu cầu các service trả về response ngay lập tức, nhưng với rabbitmq sẽ được đưa vào hàng chờ cho đến khi producer thực hiện task theo một message , cung cấp khả năng chịu khi một compoment bị lỗi tại 1 thời điểm, không bị mất mát các tassk được yêu cầu từ API + + + +- Connection neutron-linux-bridge-agent từ compute node tớ controller node +![](https://i.imgur.com/IzVtmx4.png) diff --git a/Advance/3. Log.md b/Advance/3. Log.md new file mode 100644 index 0000000..bc9653c --- /dev/null +++ b/Advance/3. Log.md @@ -0,0 +1,61 @@ + +## Log trong OPS + + +## 1. Thư mục log mặc định + +Trên Controller Node + +- **Compute nova-*** +_/var/log/nova_ + +- **Image Service glance-*** +_/var/log/glance_ + +- **Block Storage cinder-*** +_/var/log/cinder_ + +- **Identity service keystone-*** +_/var/log/keystone_ + +- **Networking neutron-*** +_/var/log/neutron_ + +- **Dashboard horizon** +_/var/log/apache2 hoặc /var/log/httpd_ + +- **Orchestration service heat** +_/var/log/heat_ + +- **Telemetry service ceilometer** +_/var/log/ceilometer_ + + +Trên Compute Node : + +- **Nova Compute ** +_/var/log/nova/nova-compute.log_ + +- **Linux Bridge Agent** +_/var/log/neutron/linuxbridge-agent.log_ + +- **Compute nodes libvirt** +_/var/log/libvirt/libvirtd.log_ + +- _**Compute nodes Console (boot upmessages) for VM instances:**_/var/lib/nova/instances/instance-/console.log_ + +Trên Block Storage Node ; +- **Block Storage nodes cinder-volume** +_/var/log/cinder/cinder-volume.log_ + + +## 2. Cấu hình Syslog + +- Để cấu hình các message log sẽ được gửi đến syslog cấu hình trên từng service + +``` +[DEFAULT] +debug = False +use_syslog = True +syslog_log_facility = LOG_LOCAL0 +``` diff --git a/Advance/4. Setup-noVNC.md b/Advance/4. Setup-noVNC.md new file mode 100644 index 0000000..5513b77 --- /dev/null +++ b/Advance/4. Setup-noVNC.md @@ -0,0 +1,122 @@ + + + +# noVNC trong OPS + + + + +- Để cung cấp cho một giao diện điều khiển hoặc truy cập từ xa vào máy ảo , trong OPS cung cấp hỗ trợ noVNC hoặc SPICE HTML 5. + +## 1. noVNC & nova-console-auth + + - Các Client tham gia vào noVNC proxy đều sử dụng một dịch vụ để quản lý các token tên là : nova-consoleauth. Để proxy hoạt động cần có nova-consoleauth . Nhiều proxy có sử dụng chung nova-consoleauth để quản lý + +- Workflow +![](https://docs.openstack.org/nova/pike/_images/SCH_5009_V00_NUAC-VNC_OpenStack.png) + + +- B1 . Một user gửi một request qua API , và nhận được một access_url để truy cập VNC . Ex : https://{ip}:port/?token=xyz +- B2 . User truy cập vào URL thông qua brower +- B3 . Brower kết nối nối tơi proxy. +- B4 . Proxy trao đổi với nova-console-auth để tách token và xác thực token cho người dùng, và map token tới compute host và port của từng instance trên VNC Server + - Trên compute host có một địa chỉ IP mà proxy có thể kết nối tới , option `vncserver_proxyclient_address` dùng để cấu hình IP này . VNC proxy sẽ hoạt động giống như một bridge giữa public network và private network. +- B5. Proxy thiết lập kết nối tới VNC Server và giữ nguyên kết nối khi hết session. + +- LOG info console-auth + + +_INFO nova.consoleauth.manager [req-8ca21e6d-875d-4017-9aad-365f888dac16 6ca03d3c55444c10aa22f481f2e13381 9373ec3c823343de87ae613b972aa4d3 - default default] Received Token: 7b08b51a-78f3-4ff5-a84e-6cc668f78a08, {'instance_uuid': u'861da5b8-284d-463f-8b48-fb2050acc366', 'access_url': u'http://192.168.30.130:6080/vnc_auto.html?token=7b08b51a-78f3-4ff5-a84e-6cc668f78a08', 'token': u'7b08b51a-78f3-4ff5-a84e-6cc668f78a08', 'last_activity_at': 1542350179.299853, 'internal_access_path': None, 'console_type': u'novnc', 'host': u'192.168.69.131', 'port': u'5900'}_ + + + + +## 2. Cấu hình noVNC proxy riêng + + +### 2.1 . Các option cấu hình trong section VNC + +|Configuration option=Default value| Descrtion | +|-|-| +| novncproxy_base_url=http://127.0.0.1:6080/vnc_auto.html| Địa chỉ của noVNC Web Proxy Client | +|vnc_enabled=True| bật các chức năng liên quan VNC| +| vnc_keymap=en-us| keymap cho VNC| +|server_listen=127.0.0.1| địa chỉ vncserver instance lắng nghe request | +|server_proxyclient_address=127.0.0.1| địa chỉ các proxy client (nova-xvpvncproxy - Web-based Management) có thể kết nối |. + +### 2.2 . Cài đặt, cấu hình + +- Cài đặt package trên VNC Node +``` +yum install centos-release-openstack-queens +yum install openstack-nova-novncproxy crudini + +``` + +- Cấu hình file nova cho VNC Node +``` +crudini /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:rabbitmq_123@controller + +``` + +- Cấu hình file host cho VNC Node +``` +echo "192.168.30.130 controller" > /etc/hosts +``` + +- Cấu hình VNC section cho noVNC Node tại `/etc/nova/nova.conf` + +``` +[vnc] +enabled = true +server_proxyclient_address = 192.168.69.132 + + +``` + +- Cấu hình VNC Section cho Compute Node tại `/etc/nova/nova.conf` +``` +[vnc] +enabled = True +server_listen = 0.0.0.0 +server_proxyclient_address = 192.168.69.131 +novncproxy_base_url = http://192.168.30.132:6080/vnc_auto.html + +``` + +### 2.3 . Khởi động dịch vụ + + + +- Trên Compute node +``` +systemctl status openstack-nova-api.service \ + +openstack-nova-consoleauth.service openstack-nova-scheduler.service \ + +openstack-nova-conductor.service openstack-nova-novncproxy.service +``` + +- Trên Compute Node +``` +systemctl restart openstack-nova-compute + +systemctl enable openstack-nova-compute + +``` + +- Trên VNC Node +``` +systemctl restart openstack-nova-novncproxy +systemctl enable openstack-nova-novncproxy + +``` + +- Log trên VNC Node + +![](https://i.imgur.com/FrQWdHQ.png) + + +- LOG trên nova-consoleauth + +![](https://i.imgur.com/v5Gvo3n.png) diff --git a/Advance/5. Nova-Compute-Serice-&-RabbitMQ.md b/Advance/5. Nova-Compute-Serice-&-RabbitMQ.md new file mode 100644 index 0000000..14c96db --- /dev/null +++ b/Advance/5. Nova-Compute-Serice-&-RabbitMQ.md @@ -0,0 +1,107 @@ + +# + + +## 1. Stop Service nova-compute trên compute + + +## 1.2 . Tắt service +- Trên compute node + + +```bash + +root@compute1 nova]# systemctl stop openstack-nova-compute +[root@compute1 novsystemctl status openstack-nova-compute +● openstack-nova-compute.service - OpenStack Nova Compute Server + Loaded: loaded (/usr/lib/systemd/system/openstack-nova-compute.service; enabled; vendor preset: disabled) + Active: inactive (dead) since Fri 2018-11-16 05:51:20 EST; 5s ago + Process: 101172 ExecStart=/usr/bin/nova-compute (code=exited, status=0/SUCCESS) + Main PID: 101172 (code=exited, status=0/SUCCESS) + +Nov 16 05:18:12 compute1 systemd[1]: Starting OpenStack Nova Compute Server... +Nov 16 05:18:14 compute1 nova-compute[101172]: /usr/lib/python2.7/site-packages/oslo_db/sqlalchemy/enginefacade.py:332: NotSupportedWa...pported +Nov 16 05:18:14 compute1 nova-compute[101172]: exception.NotSupportedWarning +Nov 16 05:18:17 compute1 systemd[1]: Started OpenStack Nova Compute Server. +Nov 16 05:18:17 compute1 sudo[101228]: nova : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/nova-rootwrap /etc/nova/rootwrap.con...sep.sock +Nov 16 05:19:47 compute1 sudo[101294]: nova : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/nova-rootwrap /etc/nova/rootwrap.con...sep.sock +Nov 16 05:51:05 compute1 systemd[1]: Stopping OpenStack Nova Compute Server... +Nov 16 05:51:20 compute1 systemd[1]: Stopped OpenStack Nova Compute Server. +Hint: Some lines were ellipsized, use -l to show in full. + +``` + + +**Trên Compute Node** + +- Liệt kê server list +``` +[root@controller ~]# openstack server list ++--------------------------------------+--------+--------+-----------------------+--------+--------+ +| ID | Name | Status | Networks | Image | Flavor | ++--------------------------------------+--------+--------+-----------------------+--------+--------+ +| 57f3deea-b4e9-4cd8-8814-5a0e5962ff4e | centos | ACTIVE | net_ex=192.168.30.141 | centos | centos | +| 88f1b003-2afe-43b7-8f51-2b719aca1251 | test | ACTIVE | net_ex=192.168.30.148 | cirros | | ++--------------------------------------+--------+--------+-----------------------+--------+--------+ + + +``` + +- Mặc dù đã command stop instance nhưng vẫn có thể ssh vào instance, instance vẫn đi ra internet bình thường + +![](https://i.imgur.com/GeZBHLA.png) + + + +- Kiểm tra hàng chờ trên RabbitMQ +Tại `# Queue **compute.compute1**` ta thấy + +![](https://i.imgur.com/51pACi2.png) + +Nội dung payload sẽ bao gồm `method\": \"stop_instance` + +``` +{"oslo.message": "{\"_context_domain\": null, \"_context_request_id\": \"req-0ba543f8-8bbc-4f6e-a136-2ff8fbbf5bf9\", \"_context_global_request_id\": null, \"_context_quota_class\": null, \"_context_service_catalog\": [{\"endpoints\": [{\"adminURL\": \"http://controller:9696\", \"region\": \"RegionOne\", \"internalURL\": \"http://controller:9696\", \"publicURL\": \"http://controller:9696\"}], \"type\": \"network\", \"name\": \"neutron\"}, {\"endpoints\": [{\"adminURL\": \"http://controller:9292\", \"region\": \"RegionOne\", \"internalURL\": \"http://controller:9292\", \"publicURL\": \"http://controller:9292\"}], \"type\": \"image\", \"name\": \"glance\"}, {\"endpoints\": [{\"adminURL\": \"http://controller:8778\", \"region\": \"RegionOne\", \"internalURL\": \"http://controller:8778\", \"publicURL\": \"http://controller:8778\"}], \"type\": \"placement\", \"name\": \"placement\"}], \"_context_auth_token\": \"gAAAAABb7qIbfChibJt6nwaoirvg0CmC4tWbjCdvSZcZz2sgZ3KldgUalt-Q0WR_U-VGZGFV6AvRp7m0Ulk5LzxZQhtBirYS-oDHGUmsqFdVAjN6XG16zm-xXGihIUreCHDq_iS4UMRL_23_SJyhb15W7DQL-NkOfaR241H87Wi1VXuIXQR6tlg\", \"_context_resource_uuid\": null, \"_context_user\": \"6ca03d3c55444c10aa22f481f2e13381\", \"_context_user_id\": \"6ca03d3c55444c10aa22f481f2e13381\", \"_context_show_deleted\": false, \"_context_is_admin\": true, \"version\": \"5.0\", \"_context_project_domain\": \"default\", \"_context_timestamp\": \"2018-11-16T10:55:25.379534\", \"method\": \"stop_instance\", \"_context_project\": \"9373ec3c823343de87ae613b972aa4d3\", \"_context_remote_address\": \"192.168.69.130\", \"_context_roles\": [\"admin\"], \"args\": {\"instance\": {\"nova_object.version\": \"2.3\", \"nova_object.name\": \"Instance\", \"nova_object.data\": {\"vm_state\": \"active\", \"availability_zone\": \"nova\", \"terminated_at\": null, \"ephemeral_gb\": 0, \"instance_type_id\": 4, \"updated_at\": \"2018-11-16T10:44:19Z\", \"cleaned\": false, \"vm_mode\": null, \"deleted_at\": null, \"reservation_id\": \"r-s1q61ghb\", \"id\": 13, \"disable_terminate\": false, \"root_device_name\": \"/dev/vda\", \"user_id\": \"6ca03d3c55444c10aa22f481f2e13381\", \"uuid\": \"57f3deea-b4e9-4cd8-8814-5a0e5962ff4e\", \"default_swap_device\": null, \"hostname\": \"centos\", \"launched_on\": \"compute1\", \"display_description\": null, \"key_data\": null, \"kernel_id\": \"\", \"power_state\": 1, \"default_ephemeral_device\": null, \"progress\": 0, \"project_id\": \"9373ec3c823343de87ae613b972aa4d3\", \"launched_at\": \"2018-11-16T10:44:19Z\", \"config_drive\": \"\", \"node\": \"compute1\", \"ramdisk_id\": \"\", \"access_ip_v6\": null, \"access_ip_v4\": null, \"deleted\": false, \"key_name\": null, \"user_data\": \"I2Nsb3VkLWNvbmZpZwp1c2VyOiByb290CnBhc3N3b3JkOiBodW5nMTkwMzkhCmNocGFzc3dkOiB7ZXhwaXJlOiBGYWxzZX0Kc3NoX3B3YXV0aDogVHJ1ZQ==\", \"host\": \"compute1\", \"root_gb\": 10, \"display_name\": \"centos\", \"system_metadata\": {\"image_disk_format\": \"qcow2\", \"boot_roles\": \"admin\", \"owner_user_name\": \"admin\", \"owner_project_name\": \"admin\", \"image_container_format\": \"bare\", \"image_min_ram\": \"0\", \"image_min_disk\": \"10\", \"image_base_image_ref\": \"fc5c8ce8-9dac-4f8e-ae4a-5212dc145b81\"}, \"task_state\": \"powering-off\", \"shutdown_terminate\": false, \"cell_name\": null, \"ephemeral_key_uuid\": null, \"locked\": false, \"created_at\": \"2018-11-16T10:44:09Z\", \"locked_by\": null, \"launch_index\": 0, \"memory_mb\": 1025, \"vcpus\": 1, \"image_ref\": \"fc5c8ce8-9dac-4f8e-ae4a-5212dc145b81\", \"architecture\": null, \"auto_disk_config\": true, \"os_type\": null, \"metadata\": {}}, \"nova_object.namespace\": \"nova\"}, \"clean_shutdown\": true}, \"_unique_id\": \"37aa7e9c94f5438f979fa11ac20b0223\", \"_context_is_admin_project\": true, \"_context_project_name\": \"admin\", \"_context_read_deleted\": \"no\", \"_context_user_identity\": \"6ca03d3c55444c10aa22f481f2e13381 9373ec3c823343de87ae613b972aa4d3 - default default\", \"_context_tenant\": \"9373ec3c823343de87ae613b972aa4d3\", \"_context_instance_lock_checked\": false, \"_context_project_id\": \"9373ec3c823343de87ae613b972aa4d3\", \"_context_read_only\": false, \"_context_user_domain\": \"default\", \"_context_user_name\": \"admin\"}", "oslo.version": "2.0"} +``` + + +## 1.2 . Bật Service + +- Trên Compute Node +``` +[root@compute1 nova]# systemctl start openstack-nova-compute +[root@compute1 nova]# systemctl status openstack-nova-compute +● openstack-nova-compute.service - OpenStack Nova Compute Server + Loaded: loaded (/usr/lib/systemd/system/openstack-nova-compute.service; enabled; vendor preset: disabled) + Active: active (running) since Fri 2018-11-16 06:08:45 EST; 3s ago + Main PID: 103095 (nova-compute) + Tasks: 23 + CGroup: /system.slice/openstack-nova-compute.service + ├─103095 /usr/bin/python2 /usr/bin/nova-compute + └─103152 /usr/bin/python2 /bin/privsep-helper --config-file /usr/share/nova/nova-dist.conf --config-file /etc/nova/nova.conf --pri... + +Nov 16 06:08:40 compute1 systemd[1]: Starting OpenStack Nova Compute Server... +Nov 16 06:08:42 compute1 nova-compute[103095]: /usr/lib/python2.7/site-packages/oslo_db/sqlalchemy/enginefacade.py:332: NotSupportedWa...pported +Nov 16 06:08:42 compute1 nova-compute[103095]: exception.NotSupportedWarning +Nov 16 06:08:45 compute1 systemd[1]: Started OpenStack Nova Compute Server. +Nov 16 06:08:45 compute1 sudo[103137]: nova : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/nova-rootwrap /etc/nova/rootwrap.con...sep.sock +Hint: Some lines were ellipsized, use -l to show in full. + +``` + + +- Trên Controller Node kiểm tra lại state của instance +``` +[root@controller nova]# openstack server list ++--------------------------------------+--------+---------+-----------------------+--------+--------+ +| ID | Name | Status | Networks | Image | Flavor | ++--------------------------------------+--------+---------+-----------------------+--------+--------+ +| 57f3deea-b4e9-4cd8-8814-5a0e5962ff4e | centos | SHUTOFF | net_ex=192.168.30.141 | centos | centos | +| 88f1b003-2afe-43b7-8f51-2b719aca1251 | test | ACTIVE | net_ex=192.168.30.148 | cirros | | ++--------------------------------------+--------+---------+-----------------------+--------+--------+ + +``` + +- Kiểm tra hàng chờ + +![](https://i.imgur.com/ALKXsRr.png) diff --git a/Advance/6. Placement-API-&-Nova-Conductor.md b/Advance/6. Placement-API-&-Nova-Conductor.md new file mode 100644 index 0000000..5337f74 --- /dev/null +++ b/Advance/6. Placement-API-&-Nova-Conductor.md @@ -0,0 +1,163 @@ + + + +## Tìm hiểu Nova-Placment và Nova-Conductor + + +## 1. Placement Service + + +### 1.1 . Khái niệm Placement +- Từ bản realase [Newton](https://releases.openstack.org/newton/index.html) , NOVA đã được đưa ra thêm một API có tên placment API . +- Placment rách tiệt ra một REST API và data model sử dụng cho việc theo dõi các tài nguyên đã sử dụng và chưa được sử dụng giữa các loại tài nguyên khác nhau . Ví dụ, một resource provider có thể là một compute node, storage pool hoặc là một dải IP . Placement service sẽ theo dõi tài nguyên dư thừa và tài nguyên đã được sử dụng trên mỗi resource provider. Ví dụ , khi một instance được tạo trên compute node, sẽ sử dụng tài nguyên RAM, CPU từ compute node resource provider , disk từ một external storage resource provider. ( resource provider ) +- Mỗi loại tài nguyên được placment theo dõi dưới hạng các class . Mỗi resource class sẽ được placement service sẽ được phân loại theo chuẩn khác nhau : `DISK_GB, MEMORY_MB, and VCPU` ( resource clasess ) +- Trên mỗi resource provider cũng có thể bao gồm nhiều tập hợp các đặc điểm mô tả từng khía cạnh của resource provider . Ví dụ available disk có thể không chỉ HDD mà còn có thể là SSD ( Traits ) + + +### 1.2. Lý do phát triển Placment API + +- Trong môi trường phát triển Cloud, có rất nhiều tài resource được sử dụng bởi người dùng. Một số tài nguyên được cung cấp bởi compute node có thể là RAM, CPU, PCI device hoặc local disk. Những loại tài nguyên khác , không được cung cấp bởi compute node, thay vì đó được cung cấp bởi các external provider resource khác. có thể là shared storage , IP pool . +- Nhưng vì từ các phiên bản trước Newton thì Nova chỉ xem xét các resource được cung cấp bởi compute node. Việc theo dõi tài nguyên giả định rằng compute node là một resource provider, sau đó sẽ report một số tài nguyên nhất định . Nova tính toán tài nguyên đã được sử dụng và chưa sử dụng trên bằng cách cộng các nguồn resoure từ các compute trong database . Việc này sẽ gây tính toán tài nguyên không chính xác . + + +### 1.3. Placement API + + +- Liệt kê các Resource Provider + +``` +[root@controller nova]# curl -s -H "X-Auth-Token: gAAAAABb8hf0piihsQbrCWLkvbR9PNmcXtnCDFnJeW4i4tjO3SCvR1DqMV5l_39nEkGH5PurtqHMO7FYmZ0p-CJrRzSLBUebuF3f2UDRGtwNw3KU_D57XMeXTk3c8DvWmNAit06LpemksHpAr16ostz6YD-YxBSs4iN2XYH-LWwSqsZia-JUp9Q" http://controller:8778/resource_providers/f69146d0-e1f2-4f1d-951d-bf9ccd06b2fb/inventories| python -mjson.tool +{ + "inventories": { + "DISK_GB": { + "allocation_ratio": 1.0, + "max_unit": 35, + "min_unit": 1, + "reserved": 0, + "step_size": 1, + "total": 35 + }, + "MEMORY_MB": { + "allocation_ratio": 1.5, + "max_unit": 4095, + "min_unit": 1, + "reserved": 512, + "step_size": 1, + "total": 4095 + }, + "VCPU": { + "allocation_ratio": 16.0, + "max_unit": 2, + "min_unit": 1, + "reserved": 0, + "step_size": 1, + "total": 2 + } + }, + "resource_provider_generation": 14 +} + +``` + +- Báo cáo các resource đang dư thừa trong provider `compute1` +``` +[root@controller nova]# curl -s -H "X-Auth-Token: gAAAAABb8hf0piihsQbrCWLkvbR9PNmcXtnCDFnJeW4i4tjO3SCvR1DqMV5l_39nEkGH5PurtqHMO7FYmZ0p-CJrRzSLBUebuF3f2UDRGtwNw3KU_D57XMeXTk3c8DvWmNAit06LpemksHpAr16ostz6YD-YxBSs4iN2XYH-LWwSqsZia-JUp9Q" \ +> http://controller:8778/resource_providers/f69146d0-e1f2-4f1d-951d-bf9ccd06b2fb/inventories| python -mjson.tool +{ + "inventories": { + "DISK_GB": { + "allocation_ratio": 1.0, + "max_unit": 35, + "min_unit": 1, + "reserved": 0, + "step_size": 1, + "total": 35 + }, + "MEMORY_MB": { + "allocation_ratio": 1.5, + "max_unit": 4095, + "min_unit": 1, + "reserved": 512, + "step_size": 1, + "total": 4095 + }, + "VCPU": { + "allocation_ratio": 16.0, + "max_unit": 2, + "min_unit": 1, + "reserved": 0, + "step_size": 1, + "total": 2 + } + }, + "resource_provider_generation": 14 +} +``` + + +## 2. Nova-Conductor + + +### 2.1 . Khái niệm Nova-Conductor + +- Nova-conductor là một service mới trong Nova được xuất hiện lần đâu trong bản Openstack Grizzly. +- Nova-conductor là một RPC Server . Trong nova-conductor sẽ có hàng loạt API, nhiệm vụ chính sẽ là là một proxy line tới database và tới các RPC Server khác như nova-api và nova-network. RPC Client sẽ nằm trong nova-compute . Ví dụ khi muốn update state của một VM trên nova-compute , thay thì kết nối trực tiếp đến DB thì nova-compute sẽ call đến nova-conductor, nova conductor sẽ thực hiện kết nối đến DB và update state VM + +![](https://image.slidesharecdn.com/austinsummit-oslo-160427202022/95/troubleshooting-common-oslomessaging-and-rabbitmq-issues-6-638.jpg?cb=1461788550) + +### 2.2. Các lợi ích và hạn chế Nova-conductor + +#### 2.2.1 . Bảo mật + +- Lợi ích : + - Vạch định quyền hành của một compute node khi chạy node-compute service .Trước bản Grizzly, tất cả các compute-node có nova-compute service sẽ có quyền truy cập trực tiếp vào database, khi một compute-node bị tấn công thì attacker sẽ có hoàn toàn quyền để xâm nhập vào DB . Với nova-conductor sự ảnh hưởng của các node tới DB sẽ được kiểm soát thay vì đó sẽ sử dụng conductor API để làm việc với DB + +- Hạn chế : + - Mặc dù conductor API sẽ hạn chế các quyền hạn đến database của nova-compute nhưng các service khác vẫn có quyền truy cập trực tiếp vào DB . Với một môi trường network multi-host, thì nova-compute, nova-api- metadata, nova-network sẽ đều chạy trên các compute node , trong trường hợp này thì các service nova-api-metadata and nova-network vẫn tham chiếu trực tiếp đến DB + +![](https://docs.openstack.org/security-guide/_images/novaconductor.png) + +#### 2.2.2 . Dễ dàng nâng cấp + +- Lợi ích : + - Nova-conductor đứng giữa nova-compute và database. Nếu DB schema update thì sẽ không upgrade trên nova-compute trên cùng một thời điểm, thay vif đó nova-conductor sẽ sử dụng những API tương thích để làm việc với DB . + + +## 3. Nova Cell Layout + +- Trong Nova system sẽ bao gồm các copoment sau : + - nova-api : cung cấp REST API cho người dùng + - nova-scheduler and placement services : đảm nhiệm theo dõi các tài nguyên và xác định compute host nơi mà instance sẽ chạy + - API Database : giúp nova-api, nova-scheduler theo dõi trạng thái của các instance + - nova-conductor : làm việc với DB, giúp các compute node làm việc với database. + - nova-compute ; quản lý virt drvier và hypervisor host + - cell database : được sử dụng bởi API, conductor, compute service . đảm nhiệm chứa phần lớn thông tin của các instance + - cell0 database : giống như cell database nhưng chỉ chứa thông tin về các instance bị lỗi trong quá trình scheduled + - message queue : cho phép giao tiếp giữa các compoment thông qua RPC + +- Trong các môi trường deploy OPS sẽ bao gồm ít nhất các compoment trên . Mội môi trường deployment nhỏ có thể chỉ bao gồm một message queue và một DB server , API DB và một cell, cell0 database. +- Mục đích chính của cell trong nova là cho phép môi trường phát triển lớn . Chỉ sử dụng một API cho tất nhưng sẽ làm việc được tới nhiều cell ( xác định thông tin của các instance trên các node ) . Khi sử dụng cell database, các compute host sẽ được sắp xếp vào nhóm tên là cells. Cells được xem như một cái cây. Top-cell level sẽ là host bao gồm nova-api service. sẽ không bao gồm các nova-compute service. Để mở rộng mô hình thì trên các child-level sẽ bao gồm các nova-* service ngoại trừ nova-api. Khi sử dụng cell database, các compute host sẽ được sắp xếp vào nhóm tên là cells. Cells được xem như một cái cây. Top-cell level sẽ là host bao gồm nova-api service. sẽ không bao gồm các nova-compute service. Để mở rộng mô hình thì trên các child-level sẽ bao gồm các nova-* service ngoại trừ nova-api. + + +- +```mysql +nova_api database + +MariaDB [nova_api]> select * from cell_mappings + -> ; ++---------------------+------------+----+--------------------------------------+-------+--------------------------------------------+-----------------------------------------------------+ +| created_at | updated_at | id | uuid | name | transport_url | database_connection | ++---------------------+------------+----+--------------------------------------+-------+--------------------------------------------+-----------------------------------------------------+ +| 2018-10-19 09:07:52 | NULL | 1 | 00000000-0000-0000-0000-000000000000 | cell0 | none:/// | mysql+pymysql://nova:nova_123@controller/nova_cell0 | +| 2018-10-19 09:07:57 | NULL | 2 | fceee63a-5c41-4080-8711-ce19bee8765d | cell1 | rabbit://openstack:rabbitmq_123@controller | mysql+pymysql://nova:nova_123@controller/nova | ++---------------------+------------+----+--------------------------------------+-------+--------------------------------------------+-----------------------------------------------------+ +2 rows in set (0.00 sec) + +``` + +![](http://xcodest.me/images/nova-cell/nova-cell-v2-arch.jpg) + + + +- Trên các nova service đều sử dụng một config file bao gồm `[DEFAULT]/transport_url` và kết nối tới database `[database]/connection` và API kết nối đến database api `[api_database]/connection` + diff --git a/Advance/7.1. Resource-Management-OPS.md b/Advance/7.1. Resource-Management-OPS.md new file mode 100644 index 0000000..0fcbd51 --- /dev/null +++ b/Advance/7.1. Resource-Management-OPS.md @@ -0,0 +1,112 @@ + +# Resource Management trong OPS + + +## 1. CPU Topology + +- Nhờ vào NUMA Techonoly và CPU Pinting trong OPS cung cấp một cách kiểm soát cao cách các instance chạy trên các hypervisor CPU và cấu trúc liên kết của các vCPU trên các instance . + +### 1.1. SMP, NUMA, + +- Symmetric multiprocessing (SMP) : là thiết kế được tìm nhiều trong các muilti-core system. Trong SMP system, có 2 hoặc nhiều CPU và những CPU sẽ kết nối với nhau . Điều này cho phép CPU cung cấp khả năng truy cập như nhau vào tài nguyên hệ thống hoặc input/output +- NUMA (Non-Uniform Memory Access) : một kiểu của SMP ,đây là một kiểu kiến trúc bộ nhớ máy tính nhằm hổ trợ cho hệ thống đa xử lý (multi processing) trong đó bộ nhớ (memory) thể hiện các đặc tính hiệu năng riêng biệt tại những điểm khác nhau trong không gian địa chỉ của CPU. + +## 2. CPU customize topology + +- Chức năng này chỉ hỗ trợ cho libvirt/kvm driver +- Ngoài việc cấu hình lên lịch CPU cho các instance , thì có thể tự cấu hình mô hình CPU cho các instance. Mặc định khi instance NUMA không được chỉ định, cấu trúc liên kết CPU của các instance là : N socket, với một core , 1 luồng => N sẽ là số vCPU dành cho instance . Khi instance NUMA được cấu hình, số socket được cố định thành số NUMA host và tổng các CPU của các instance được chia trên các socket này . +![](https://camo.githubusercontent.com/49085f685aebbaf2090cb5ddecc089753401d881/68747470733a2f2f692e696d6775722e636f6d2f4c684359644e672e706e67) + +- Khởi tạo một flavor mới + +``` +[root@controller nova]# openstack flavor create --disk 10 --project admin --ram 1024 --private large ++----------------------------+--------------------------------------+ +| Field | Value | ++----------------------------+--------------------------------------+ +| OS-FLV-DISABLED:disabled | False | +| OS-FLV-EXT-DATA:ephemeral | 0 | +| disk | 10 | +| id | 0ba339ae-9ac2-4dc1-abca-2e9fa9ac1e15 | +| name | large | +| os-flavor-access:is_public | False | +| properties | | +| ram | 1024 | +| rxtx_factor | 1.0 | +| swap | | +| vcpus | 1 | ++----------------------------+--------------------------------------+ +``` + +- Cấu hình CPU topology + +``` +openstack flavor set large --property hw:cpu_sockets=2 --property hw:cpu_cores=4 --property hw:cpu_threads=2 +``` +Trong đó : + - SOCKET : số CPU socket cho VM , mặc định số này sẽ là số vCPU theo yêu cầu + - CORE : số core trên trừng socket. Mặc định sẽ là 1 + - THEADS : số luồng trên từng core. Mặc định sẽ là 1 + + + +- Kiểm tra flavor + +``` +[root@controller nova]# openstack flavor show 0ba339ae-9ac2-4dc1-abca-2e9fa9ac1e15 ++----------------------------+----------------------------------------------------------+ +| Field | Value | ++----------------------------+----------------------------------------------------------+ +| OS-FLV-DISABLED:disabled | False | +| OS-FLV-EXT-DATA:ephemeral | 0 | +| access_project_ids | 9373ec3c823343de87ae613b972aa4d3 | +| disk | 10 | +| id | 0ba339ae-9ac2-4dc1-abca-2e9fa9ac1e15 | +| name | large | +| os-flavor-access:is_public | False | +| properties | hw:cpu_cores='4', hw:cpu_sockets='2', hw:cpu_threads='8' | +| ram | 1024 | +| rxtx_factor | 1.0 | +| swap | | +| vcpus | 1 | ++----------------------------+----------------------------------------------------------+ + +``` + + +## 3. Cấu hình tỉ lệ overcommitting + +### 3.1 . Khái niệm overcommitting trong KVM + +- Trong KVM hỗ trợ tự động overcommit CPU và Memory . Có nghĩa là các RAM và CPU ảo hóa có thể phân bổ tới các máy ảo nhiều hơn số tài nguyên có trên vật lý . Điều này là hoàn toàn có thể vì hầu như các process sẽ không sử dụng 100% memory đã được phân bổ. +- Các server dưới nền tảng ảo hóa có thể chạy trên một host nhỏ tài nguyên hơn , giúp tiết kiệm tài nguyên hệ thống. +- **OVERCOMMITTING MEMORY** : + - Các máy ảo trong KVM không được phân bổ cho một block RAM, thay vì đó mỗi máy ảo sẽ hoạt động như một process , khi đó Linux Kernel sẽ phân bổ memory khi mà máy ảo yêu cầu. Thêm vào đó sau khi một process hoàn thành công việc, phần RAM của process sẽ được di chuyển vào Swap. Các memory được sử dụng bởi cách máy ảo khi không đưowjc sử dụng nhiều sẽ được đưa vào Swap. + - Overcommitting yêu cầu phân bổ đủ không gian swap trên physical host để chứa các process máy ảo KVM và đủ để chứa các process của các dịch vụ khác . Công thức ration : `(0.5 * RAM) + (overcommit ratio * RAM) = Recommended swap size` + - Overcommiting không hoàn toàn là giải pháp tòan diện đểi giải quyết vấn đề về memory thay vi đó sẽ phân bổ ít RAM hơn trên từng máy ảo . Một máy ảo sẽ chạy chậm hơn khi nó hoạt động trên swap. Thêm vào đó overcommitting sẽ làm cho system hết memory. Điều này dẫn đến kernel sẽ tự động shutdown một số process không liên quan. +- **Overcommitting virtualized CPUs** : + - KVM Hypervisor hỗ trợ overcommitting CPU ảo hóa. CPU ảo hóa cho phép tải quá mức so mới mặc định của các mảy ảo được cho phép. Chú ý khi sử dụng overcommit vCPU, khi load gần 100% thì sẽ bị drop các request hoặc khả năng reponse bị chậm lại + - Các CPU ảo hóa (vCPUs) được overcommitted tốt nhất khi một máy vật lý máy chủ duy nhất có nhiều máy ảo khách mà không dùng chung một vCPU. KVM hỗ trợ ở mức an toàn các máy ảo load dưới 100% theo tỉ lệ 5vCPU ( cho 5 máy ảo ) trên một CPU vật lý. KVM sẽ chuyển phân bổ CPU giữa các máy ảo đảm bảo được cân bằng tải + - Không được overcommit các mảy ảo có số vCPU nhiều hơn số core process . Ví dụ một máy ảo với 4 vCPU không thể chạy trên host 2 core nhưng có thể chạy trên quad core .Kkhuyến nghị : không nên phân bổ quá 1 vCPU trên 1 CPU vật lý + +### 3.2 . Overcommitting trong OPS + + + +- Trong OPS hỗ trợ overcommitting trên các compute node . Trên compute service tỉ lệ overcommit được phân bổ + - CPU allocation ratio: 16:1 - được phân bổ 16 vCPU trên 1 CPU vật lý . + - RAM allocation ratio: 1.5:1 - cho phép phân bổ RAM tới các instance sẽ nhiều hơn 1.5 lần so với memory physical + +- Cấu hình tỉ lệ overcommit trên controller node `/etc/nova/nova.conf` : +``` +[DEFAULT] +cpu_allocation_ratio = 10.1 + +``` + +- Khởi động lại dịch vụ +``` +systemctl restart openstack-nova-api.service \ + openstack-nova-scheduler.service openstack-nova-conductor.service \ + openstack-nova-novncproxy.service +``` diff --git a/Advance/7.2 . Nova-Scheduler-&-Host-Aggreaggregate.md b/Advance/7.2 . Nova-Scheduler-&-Host-Aggreaggregate.md new file mode 100644 index 0000000..2059e1b --- /dev/null +++ b/Advance/7.2 . Nova-Scheduler-&-Host-Aggreaggregate.md @@ -0,0 +1,294 @@ + + + + +# 1. Nova-scheduler + +- Nova sử dụng nova-scheduler service để xác định compute noe thực hiện một request , ví dụ nova-scheduler service xác định host để chạy máy ảo + +# 1. Filter scheduler + +- Filter scheduler được scheduler sử dụng mặc định để lập kế hoạch khởi tạo máy ảo . Trong filter schduler hỗ trợ filtering và weighting để xác định một compute để khởi tạo máy ảo. +- Khi nhận filter scheduler nhận được một request sẽ dùng **Filtering** những host phù hợp để launch máy ảo, những host không phù hợp sẽ bị loại. Host được chấp nhập đủ yêu cầu filtering sẽ được sử dụng thuật toán khác để xác định host cho yêu cầu sử dụng weighting + +### 1.1. **Filtering** + +![](https://docs.openstack.org/nova/queens/_images/filteringWorkflow1.png) + +- Cấu hình **Filtering** trong `nova.conf` + +``` + +[scheduler] +driver = filter_scheduler + +[filter_scheduler] +available_filters = nova.scheduler.filters.all_filters +enabled_filters = RetryFilter, AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter + +``` + +- Danh sách các filter được sử dụng trong filtering + - AllHostsFilter : Không filter, được tạo máy ảo trên bất cứ host nào available. + - ImagePropertiesFilter : filter host dựa vào properties được định nghĩa trên instance’s image. Nó sẽ chọn các host có thể hỗ trợ các thông số cụ thể trên image được sử dụng bởi instance. ImagePropertiesFilter dựa vào kiến trúc, hypervisor type và virtual machine mode được định nghĩa trong instance. Ví dụ, máy ảo yêu cầu host hỗ trợ kiến trúc ARM thì ImagePropertiesFilter sẽ chỉ chọn những host đáp ứng yêu cầu này. + - AvailabilityZoneFilter : filter bằng availability zone. Các host phù hợp với availability zone được ghi trên instance properties sẽ được chọn. Nó sẽ xem availability zone của compute node và availability zone từ phần request. + - ComputeCapabilitiesFilter : Kiểm tra xem host compute service có đủ khả năng đáp ứng các yêu cầu ngoài lề (extra_specs) với instance type không. Nó sẽ chọn các host có thể tạo được instance type cụ thể. extra_specs chứa key/value pairs ví dụ như `free_ram_mb (compared with a number, values like ">= 4096")` + - ComputeFilter : Chọn tất cả các hosts đang được kích hoạt. + - CoreFilter : filter dựa vào mức độ sử dụng CPU core. Nó sẽ chọn host có đủ số lượng CPU core. + - AggregateCoreFilter : filter bằng số lượng CPU core với giá trị `cpu_allocation_ratio` . + - IsolatedHostsFilter : filter dựa vào image_isolated, host_isolated và restrict_isolated_hosts_to_isolated_images flags. + - JsonFilter : Cho phép sử dụng JSON-based grammar để lựa chọn host. + - RamFilter : filter bằng RAM, các hosts có đủ dung lượng RAM sẽ được chọn. + - AggregateRamFilter : filter bằng số lượng RAM với giá trị `ram_allocation_ratio`. `ram_allocation_ratio` ở đây là tỉ lệ RAM ảo với RAM vật lý (mặc định là 1.5) + - DiskFilter : filter bằng dung lượng disk. các hosts có đủ dung lượng disk sẽ được chọn. + - AggregateDiskFilter : filter bằng dung lượng disk với giá trị `disk_allocation_ratio`. + - NumInstancesFilter : filter dựa vào số lượng máy ảo đang chạy trên node compute đó. node nào có quá nhiều máy ảo đang chạy sẽ bị loại. Nếu chỉ số `max_instances_per_host` đươc thiết lập. Những node có số lượng máy ảo đạt ngưỡng `max_instances_per_host` sẽ bị ignored. + - AggregateNumInstancesFilter : filter dựa theo chỉ số `max_instances_per_host`. + - IoOpsFilter : filter dựa theo số lượng I/O operations. + - AggregateIoOpsFilter: filter dựa theo chỉ số `max_io_ops_per_host`. + - SimpleCIDRAffinityFilter : Cho phép các instance trên các node khác nhau có cùng IP block. + - DifferentHostFilter : Cho phép các instances đặt trên các node khác nhau. + - SameHostFilter : Đặt instance trên cùng 1 node. + - RetryFilter : chỉ chọn các host chưa từng được schedule. +[Xem thêm tại đây](https://docs.openstack.org/nova/queens/admin/configuration/schedulers.html#filter-scheduler) + - AggregateInstanceExtraSpecsFilter : xác định host aggragate phù hợp cho máy ảo . +### 1.2. **Weighting** + +![](https://docs.openstack.org/nova/queens/_images/nova-weighting-hosts.png) + +- Sau khi quá trình filtering , scheduler sẽ xác định được các host đủ yêu cầu để đặt máy ảo . Weighting sẽ thực hiện tìm host thích hợp nhất trên các host sau quá trình filtering. + +- Cấu hình host weigher trong `nova.conf` : +``` +[DEFAULT] +scheduler_weight_classes = class +``` + +Trong đó các gồm các class : +- nova.scheduler.weights.ram : RAM trên host còn dư thừa +- nova.scheduler.weights.metrics : chỉ định các metric trên host +- ova.scheduler.weights.all_weighers : sử dụng tất cả các metric trên host + + + +- Cấu hình các option metric + +| Section | Option | Description | +|-------------|-----------|-------------| +| [DEFAULT] | `ram_weight_multiplier` | | +| [DEFAULT] |`scheduler_host_subset_size` | +| [DEFAULT] | `scheduler_weight_classes` | +|[DEFAULT]| `io_ops_weight_multiplier` | +| [DEFAULT] | `soft_affinity_weight_multiplier` | +| [DEFAULT] |`soft_anti_affinity_weight_multiplier`| +| [filter_scheduler] | `build_failure_weight_multiplier` | +| [metrics] | `weight_multiplier` | +| [metrics] | `weight_setting`| +| [metrics] |`required`| +|[metrics] |`weight_of_unavailable`| +![](https://docs.openstack.org/nova/queens/_images/filtering-workflow-2.png) + + + +## 2. Tìm hiểu khái niệm _Host aggregate_ và _Availability zones_ + +### 2.1 : Host aggregate + +- Phương thức tạo tạo ra một nhóm logic để phân vùng các server . Host aggregate trong OPS tập hợp các Compute Node được chỉ định và liên kết với metadata. Một host có thể nằm trong nhiều hơn một host aggregate. Chỉ có người quản trị mới có quyền tạo và thấy được các host aggregates +- Các metadata trong các host aggregate thường được dùng để cung cấp thông tin cho quá trình nova-scheduler để xác định được được host đặt các mảy ảo . Metadata quy định trong một host aggretate sẽ chỉ định host chạy các instance mà có falvor cùng metadata +- Người quản trị sử dụng host aggregate để xử lý cân bằng tải, dự phòng, resource pool ,nhóm các server cùng thuộc tính. Các host aggregate sẽ không được public ra cho các end-user mà thay đó sẽ được gắn vào các flavor. + +- Ví dụ về Host aggregate : có thể tạo một tâp hợp các compute node tùy vào vị trí địa lý : "DC FPT HCM", hoặc các host trên rack 1 sử dụng disk SSD `RACK 1 SSD` + + +### 2.2. Availability zones + +- Là chế độ dành cho các end-user của Host aggregate , trình bày các host aggetes dưới dạng các availability zone. Các end-user không thể xem được host aggrete tạo nên zone , không thể xem được metadata mà chỉ xem được các zone name. +- Availability zone là một medata cụ thể được gắn vào một host aggregate. Việc thêm một medata vào một host aggregate làm các tập hợp này được nhìn thấy từ các end-user , do đó có thể nhờ nova-sheduler làm việc với một host aggregate cụ thể. +- Avalibalitiy zone cho phép các các end-user chọn một host aggregate để chạy máy ảo . Ví dụ sử dụng availability zone , người dùng có thể khởi tạo một máy ảo chạy trên DC FPT ở HCM + +- Các rule giữa aggregates và availability zone + - Một host có thể có thể nhiều host aggregate, nhưng chỉ có thể một avaibility zone + - Mặc định, một host sẽ có một availability zone mặc định nếu không có host aggregate. + + +### 2.3 . Cấu hình Host Aggregate Scheduling + +- Trong file cấu hình `/etc/nova/nova.conf` trên node chạy `nova-scheduler` service + +``` +[filter_scheduler] +enabled_filters=AggregateInstanceExtraSpecsFilter,RetryFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter + +``` + +- Khởi tạo một host aggregate `DC_HCM` + +``` +[root@controller ~]# openstack aggregate create ssd-rack1 --zone rack1 ++-------------------+----------------------------+ +| Field | Value | ++-------------------+----------------------------+ +| availability_zone | rack1 | +| created_at | 2018-11-21T09:02:07.225058 | +| deleted | False | +| deleted_at | None | +| id | 4 | +| name | ssd-rack1 | +| updated_at | None | ++-------------------+----------------------------+ +``` + +- Gắn metadata `SSD=True` vào aggregate +``` +[root@controller ~]# openstack aggregate set --property ssd=true --zone rack1 ssd-rack1 +[root@controller ~]# openstack aggregate show ssd-rack1 ++-------------------+----------------------------+ +| Field | Value | ++-------------------+----------------------------+ +| availability_zone | nova | +| created_at | 2018-11-21T08:03:02.000000 | +| deleted | False | +| deleted_at | None | +| hosts | [] | +| id | 1 | +| name | fast-io | +| properties | ssd='true' | +| updated_at | None | ++-------------------+----------------------------+ + +``` + +- Thêm host vào host aggregate `fast-io` +``` +[root@controller ~]# openstack aggregate add host ssd-rack1 compute1 + ++-------------------+---------------------------------------------------+ +| Field | Value | ++-------------------+---------------------------------------------------+ +| availability_zone | rack1 | +| created_at | 2018-11-21T09:02:07.000000 | +| deleted | False | +| deleted_at | None | +| hosts | [u'compute1'] | +| id | 4 | +| metadata | {u'ssd': u'true', u'availability_zone': u'rack1'} | +| name | ssd-rack1 | +| updated_at | None | ++-------------------+---------------------------------------------------+ + +[root@controller ~]# openstack aggregate show ssd-rack1 ++-------------------+----------------------------+ +| Field | Value | ++-------------------+----------------------------+ +| availability_zone | rack1 | +| created_at | 2018-11-21T09:02:07.000000 | +| deleted | False | +| deleted_at | None | +| hosts | [u'compute1'] | +| id | 4 | +| name | ssd-rack1 | +| properties | ssd='true' | +| updated_at | None | ++-------------------+----------------------------+ + +``` + + +- Khởi tạo một flavor +``` +[root@controller nova]# openstack flavor create --ram 1024 --disk 10 --vcpus 2 ssd.small ++----------------------------+--------------------------------------+ +| Field | Value | ++----------------------------+--------------------------------------+ +| OS-FLV-DISABLED:disabled | False | +| OS-FLV-EXT-DATA:ephemeral | 0 | +| disk | 10 | +| id | 408d8c23-dcb6-4bd0-b86b-9be7eb239ed8 | +| name | ssd.small | +| os-flavor-access:is_public | True | +| properties | | +| ram | 1024 | +| rxtx_factor | 1.0 | +| swap | | +| vcpus | 2 | ++----------------------------+--------------------------------------+ +``` + + +- Chỉ định host aggregate medata +``` +[root@controller nova]# openstack flavor set --property aggregate_instance_extra_specs:ssd=true ssd.small ++----------------------------+-------------------------------------------+ +| Field | Value | ++----------------------------+-------------------------------------------+ +| OS-FLV-DISABLED:disabled | False | +| OS-FLV-EXT-DATA:ephemeral | 0 | +| access_project_ids | None | +| disk | 10 | +| id | 408d8c23-dcb6-4bd0-b86b-9be7eb239ed8 | +| name | ssd.small | +| os-flavor-access:is_public | True | +| properties | aggregate_instance_extra_specs:ssd='true' | +| ram | 1024 | +| rxtx_factor | 1.0 | +| swap | | +| vcpus | 2 | ++----------------------------+-------------------------------------------+ + +``` + + + + + + +- Khởi tạo một máy ảo chạy trên node `compute1` trên zone `rack1` +``` +root@controller ~]# openstack server create --image cirros --flavor large \ +> --availability-zone rack1:compute1 \ +> --network net_ex cirros_compute1 ++-------------------------------------+-----------------------------------------------+ +| Field | Value | ++-------------------------------------+-----------------------------------------------+ +| OS-DCF:diskConfig | MANUAL | +| OS-EXT-AZ:availability_zone | rack1 | +| 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 | fYofnK758TkK | +| config_drive | | +| created | 2018-11-21T09:21:26Z | +| flavor | large (0ba339ae-9ac2-4dc1-abca-2e9fa9ac1e15) | +| hostId | | +| id | 8c6c067c-5a90-4d80-830d-2752e5a1673d | +| image | cirros (8bc5ff78-118b-435a-9611-e6a99d9f6b1c) | +| key_name | None | +| name | cirros_compute1 | +| progress | 0 | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| properties | | +| security_groups | name='default' | +| status | BUILD | +| updated | 2018-11-21T09:21:26Z | +| user_id | 6ca03d3c55444c10aa22f481f2e13381 | +| volumes_attached | | ++-------------------------------------+-----------------------------------------------+ + +``` + + + + +## 3. Tìm hiểu thêm + +- https://docs.openstack.org/nova/queens/admin/configuration/schedulers.html +- https://slack-files.com/TC7HVUK9S-FE8QTT1RS-7015680558 diff --git a/Advance/7.3. Lab-Filter-Scheduler.md b/Advance/7.3. Lab-Filter-Scheduler.md new file mode 100644 index 0000000..475cc77 --- /dev/null +++ b/Advance/7.3. Lab-Filter-Scheduler.md @@ -0,0 +1,124 @@ + + + +## Sheduler Filter + + +## 1. Host Aggregate Filter + +- Host Aggregate cho SSD Rack +``` + +openstack aggregate create ssd-rack1 --zone rack1 +openstack aggregate set --property ssd=true ssd-rack1 +openstack aggregate add host ssd-rack1 compute1 + +``` + +- Host Aggregate cho HDD Rack +``` +openstack aggregate create hdd-rack2 --zone rack2 +openstack aggregate set --property hdd=true hdd-rack2 +openstack aggregate add host hdd-rack2 compute2 + +``` + +- Cấu hình filtering Host Aggregate `/etc/nova/nova.conf` +``` +[scheduler] +driver = filter_scheduler + +[filter_scheduler] +available_filters = nova.scheduler.filters.all_filters +scheduler_default_filters=AggregateInstanceExtraSpecsFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter + +``` + +- Khởi tạo flavor SSD +``` +openstack flavor create --ram 1024 --disk 10 --vcpus 1 ssd.small +openstack flavor set --property aggregate_instance_extra_specs:ssd=true ssd.small +``` + +- Khởi tạo flavort HDD +``` +openstack flavor create --ram 1024 --disk 10 --vcpus 1 hdd.small +openstack flavor set --property aggregate_instance_extra_specs:hdd=true hdd.small + +``` + +- Khởi taọ máy ảo bằng flavor `ssd.small` và `hdd.small` +``` + +openstack server create --image cirros --flavor ssd.small cirros-ssd +openstack server create --image cirros --flavor hdd.small cirros-hdd + +``` + +- Sẽ thấy 2 instance đang chạy trên 2 zone khác nhau +``` +[root@controller nova]# nova show cirros-hdd | grep OS-EXT-AZ | awk '{print$2":"$4}' +OS-EXT-AZ:availability_zone:rack2 +[root@controller nova]# nova show cirros-ssd | grep OS-EXT-AZ | awk '{print$2":"$4}' +OS-EXT-AZ:availability_zone:rack1 + +``` + + +## 2. ComputeCapabilitiesFilter Filter + +- Tạo một flavor mới +``` +root@controller ~]# openstack flavor create --disk 10 --ram 1024 --public linux_small ++----------------------------+--------------------------------------+ +| Field | Value | ++----------------------------+--------------------------------------+ +| OS-FLV-DISABLED:disabled | False | +| OS-FLV-EXT-DATA:ephemeral | 0 | +| disk | 10 | +| id | 2d41c5f8-9ddf-46b6-bef1-ecaab8b1d4e3 | +| name | linux_small | +| os-flavor-access:is_public | True | +| properties | | +| ram | 1024 | +| rxtx_factor | 1.0 | +| swap | | +| vcpus | 1 | ++----------------------------+--------------------------------------+ +``` +- Cấu hình extra_specs cho flavor +``` +openstack flavor set linux_small --property free_ram_mb=">= 1024" +openstack flavor set linux_small --property vcpus_total=">= 1" +[root@controller ~]# openstack flavor show linux_small ++----------------------------+-------------------------------------------+ +| Field | Value | ++----------------------------+-------------------------------------------+ +| OS-FLV-DISABLED:disabled | False | +| OS-FLV-EXT-DATA:ephemeral | 0 | +| access_project_ids | None | +| disk | 10 | +| id | 2d41c5f8-9ddf-46b6-bef1-ecaab8b1d4e3 | +| name | linux_small | +| os-flavor-access:is_public | True | +| properties | free_ram_mb='>= 1024', vcpus_total='>= 1' | +| ram | 1024 | +| rxtx_factor | 1.0 | +| swap | | +| vcpus | 1 | ++----------------------------+-------------------------------------------+ + +``` + +- Khởi tạo máy ảo từ flavort `linux_small` +``` +openstack server create --image centos --flavor linux_small centos_filter + +``` + + + +## 4. Tìm hiểu thêm + +[1] : https://docs.openstack.org/nova/pike/user/filter-scheduler.html + diff --git a/Advance/8. Resize-instance.md b/Advance/8. Resize-instance.md new file mode 100644 index 0000000..7a2677e --- /dev/null +++ b/Advance/8. Resize-instance.md @@ -0,0 +1,79 @@ + +## 1. Resize instance trên 1 Host + +#### 1.1. Note + +- Đối với KVM : nếu chọn một flavor có disk nhỏ hơn thì KVM sẽ bỏ qua quá trình resize disk nếu không hoàn thành .Các tài nguyên khác được thay đổi kích thước cho phù hợp. Resize instance chỉ hỗ trợ local storage. + + +### 1.2. Cấu hình resize instance + + +** ** +- Cấu hình file `nova.conf` trên controller +``` +[DEFAULT] +allow_resize_to_same_host = True +``` + + +- Liệt kê danh sách instance + +``` +[root@controller ~]# openstack server list ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| ID | Name | Status | Networks | Image | Flavor | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| bacf0a20-ab47-4bc4-aa19-c0b77b8b3614 | cirrors | ACTIVE | net_ex=192.168.30.141 | cirros | small | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ + +``` +- Liệt kê danh sách flavor + +``` ++--------------------------------------+-----------+------+------+-----------+-------+-----------+ +| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public | ++--------------------------------------+-----------+------+------+-----------+-------+-----------+ +| 0ba339ae-9ac2-4dc1-abca-2e9fa9ac1e15 | large | 1024 | 10 | 0 | 1 | False | +| 165e8c44-207c-4549-9bb5-12031e7a2090 | small | 1024 | 2 | 0 | 1 | True | +| 39d8a5cf-7585-4e03-88ff-ea3deeff1380 | test_disk | 512 | 15 | 0 | 1 | True | +| 7ef65cbe-4a70-442e-b4e2-d7b62995c208 | server | 2048 | 12 | 0 | 1 | True | ++--------------------------------------+-----------+------+------+-----------+-------+-----------+ + + +``` + +- Resize instance từ flavor `small` sang `large` + +``` +[root@controller ~]# openstack server resize --confirm --flavor large cirrors +[root@controller ~]# openstack server list ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| ID | Name | Status | Networks | Image | Flavor | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| bacf0a20-ab47-4bc4-aa19-c0b77b8b3614 | cirrors | RESIZE | net_ex=192.168.30.141 | cirros | large | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +[root@controller ~]# openstack server list ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| ID | Name | Status | Networks | Image | Flavor | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| bacf0a20-ab47-4bc4-aa19-c0b77b8b3614 | cirrors | RESIZE | net_ex=192.168.30.141 | cirros | large | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +``` + +- Khi sử dụng `nova-resize` thì máy ảo nếu power đang ở trạng thái `power on` sẽ chuyển sang `power off` trước khi thực hiện resize. + + +- Confirm resize instance + +``` +[root@controller ~]# openstack server resize --confirm cirrors +[root@controller ~]# openstack server list ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| ID | Name | Status | Networks | Image | Flavor | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +| bacf0a20-ab47-4bc4-aa19-c0b77b8b3614 | cirrors | ACTIVE | net_ex=192.168.30.141 | cirros | large | ++--------------------------------------+---------+--------+-----------------------+--------+--------+ +``` + + diff --git a/Advance/9. Rescue-instance.md b/Advance/9. Rescue-instance.md new file mode 100644 index 0000000..c51b0e4 --- /dev/null +++ b/Advance/9. Rescue-instance.md @@ -0,0 +1,66 @@ + + + +# 1. Nova-rescue + +- OPS cung cấp chức năng để rescue các instnace trong các trường hợp hỏng hóc, mất mát filesystem, mất SSH key, cấu hình network bị sai hoặc dùng để khôi dục mật khẩu + + +## 1. Cấu hình image cho quá trình recuse + +- Trong quá trình boot thì instance disk và recuse disk có thể trùng UUID , vì thế trong 1 một số trường hợp thì instance đã vào mode rescue nhưng vẫn boot từ local disk + + + +- Liệt kê danh sách image + +``` +[root@controller ~]# openstack image list ++--------------------------------------+--------+--------+ +| ID | Name | Status | ++--------------------------------------+--------+--------+ +| fc5c8ce8-9dac-4f8e-ae4a-5212dc145b81 | centos | active | +| 8bc5ff78-118b-435a-9611-e6a99d9f6b1c | cirros | active | ++--------------------------------------+--------+--------+ + +``` + +- Liệt kê danh sách instance +``` +[root@controller ~]# nova list ++--------------------------------------+---------+--------+------------+-------------+-----------------------+ +| ID | Name | Status | Task State | Power State | Networks | ++--------------------------------------+---------+--------+------------+-------------+-----------------------+ +| a67030b1-31b0-4ca9-8911-5cca45f8b779 | centos | ACTIVE | - | Running | net_ex=192.168.30.143 | +| 0ad7db51-aad6-4058-b87d-45f69a836319 | centos2 | ACTIVE | - | Running | net_ex=192.168.30.144 | ++--------------------------------------+---------+--------+------------+-------------+-----------------------+ +``` + +- Rescue instance `centos2` +``` +[root@controller ~]# nova rescue --image centos centos2 ++-----------+--------------+ +| Property | Value | ++-----------+--------------+ +| adminPass | 3f654N7iy7ss | ++-----------+--------------+ +[root@controller ~]# nova list ++--------------------------------------+---------+--------+------------+-------------+-----------------------+ +| ID | Name | Status | Task State | Power State | Networks | ++--------------------------------------+---------+--------+------------+-------------+-----------------------+ +| a67030b1-31b0-4ca9-8911-5cca45f8b779 | centos | ACTIVE | - | Running | net_ex=192.168.30.143 | +| 0ad7db51-aad6-4058-b87d-45f69a836319 | centos2 | RESCUE | - | Running | net_ex=192.168.30.144 | ++--------------------------------------+---------+--------+------------+-------------+-----------------------+ + +``` + +- Sau đó SSH vào instance ( quá trình có thể timeout 30s ) +``` +[root@controller ~]# ssh root@192.168.30.144 +root@192.168.30.144's password: +Last login: Mon Nov 26 01:43:18 2018 from 192.168.30.130 +[root@centos2 ~]# +``` + +- Mount + diff --git a/Cinder/1. Introduction-cinder.md b/Cinder/1. Introduction-cinder.md new file mode 100644 index 0000000..6b174c9 --- /dev/null +++ b/Cinder/1. Introduction-cinder.md @@ -0,0 +1,56 @@ + +# OpenStack Block Storage - Cinder + +# 1. Tổng quan về Cinder + +## 1.1. Khái niệm Cinder + +- Cinder là code-name cho Openstack Block Storage. Nó được thiết kế với khả năng lưu trữ dữ liệu mà người dùng cuối có thể sử dụng bỏi Project Compute (NOVA). Nó có thể được sử dụng thông qua các reference implementation (LVM) hoặc các plugin driver dành cho lưu trữ. +- Có thể hiểu ngắn gọn về Cinder như sau : Cinder là ảo hóa việc quản lý các thiết bị Block Storage và cung cấp cho người dùng một API đáp ứng được như cầu tự phục vụ cũng như yêu cầu tiêu thụ các tài nguyên đó mà không cần có quá nhiều kiến thức về lưu trữ. + +## 1.2. Các chức năng chính +- Cung cấp và quản lý các tài nguyên lưu trữ dạng persistent block storage (volume) cho các máy ảo +- Các volume này có thể được tách từ máy ảo này và gán lại vào một máy ảo khác, mà dữ liệu được giữ nguyên không bị thay đổi. +- Hiện tại, một volume chỉ có thể được gán (attached) và một máy ảo tại một thời điểm +- Các volume tồn tại độc lập với các máy ảo (tức là khi máy ảo bị xóa thì volume không bị xóa). +- Phân chia tài nguyên lưu trữ thành các khối gọi là Cinder volume. +- Cung cấp các API như là tạo, xóa, backup, restore, tạo snapshot, clone volume và nhiều hơn nữa. Những API này thực hiện bởi các backend lưu trữ mà được cinder hỗ trợ. +- Các kiến trúc plugin drive cho phép nhiều lựa chọn làm backend storage. + +## 1.3. Lợi ích chính +- Cinder cung cấp block storage dưới dạng `block as a service` + - **Component based architecture**: thực hiện một hành động mới dễ dàng + - **Highly available**: tỉ lệ % công việc được chia nhỏ + - **Fault-Tolerant**: các tiến trình được tách riêng biệt + - **Recoverable**: dễ dàng phán đoán, sửa lỗi + - **Open Standards**: cộng đồng API mở + + +# 2. Kiến trúc trong Cinder + +![](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux_OpenStack_Platform/6/html/Component_Overview/images/interfaces_blockStorage.png) + +- openstack-cinder-volume : quản lý vòng đời volume cho các máy ảo theo yêu cầu . Khi có một request từ sheduler , volume service sẽ tạo, chỉnh sửa, xóa các volume theo yêu cầu. Một số các driver sẽ được sử dụng để làm việc với storage provider +- openstack-cinder-api : trả lời và xử lý theo yêu cầu, gửi các tin nhắn vào hàng chờ . Khi có một request gửi đến, các API nhờ indentify service để xác thực , sau đó gửi thông điệp để làm việc với các block storage. +- openstack-cinder-backup : cung cấp khả năng backup các Storage Voluem sang một repo khác +- openstack-cinder-sheduler : gửi các task vào hàng chờ , và xác định volume server. Sheduler sẽ nhận các bản tin từ hàng chờ sau đó xác định block storage host sẽ làm việc . +- Database : lưu thạng trái các volume +- RabbitMQ server : cung cấp hàng chờ tin nhắn AMQP, RabbitMQ làm việc với các các Openstack Copoment khác : hàng chờ, phân phối,, quản lý, bảo mật liên kết2x + + +# 3. Các thành phần trong Cinder +- Back-end storage device : yêu cầu một số back-end storage service. Mặc định Cinder tích hợp và sử dụng với LVM, trên một logical volume group có tên `cinder volume`. Ngoài việc sử dụng LVM, tra có thể sử dụng nhiều drvier khác để làm việc với Cinder như Raid hoặc các driver lưu trữ khác. Những back-end driver này có thể tùy chỉnh block size khi sử dụng KVM-QEMU làm hypersvisor + +- Users and Tenants (Projects) : dịch vụ Block Storage có thể được sử dụng bởi nhiều khách hàng hoặc khách hàng điện toán đám mây khác nhau (những tenant trên một hệ thống shared system), sử dụng gán quyền truy cập theo role. Các role điểu khiển các hành động mà người dùng được phép thực hiện. Trong cấu hình mặc định, hầu hết các hành động không yêu cầu role cụ thể, nhưng điều này có thể được cấu hình bởi quản trị viên hệ thống trong tệp `policy.json`thích hợp để duy trì các quy tắc. Quyền truy cập vào một volume cụ thể của người dùng bị giới hạn bởi tenant (project), nhưng tên người dùng và mật khẩu được chỉ định cho mỗi người dùng. Các cặp khóa key-pairs cho phép truy cập vào một volume được kích hoạt cho mỗi người dùng, nhưng hạn ngạch quotas để kiểm soát tài nguyên sử dụng trên các thiết bị phần cứng có sẵn là cho mỗi tenant. + +- Volume, Snapshots và Backups : + - Volume : gắn các blcok storage đã được phân bổ vào các instance, hoạt động như một storage thứ 2 cho các instance hoặc như root filesystem storage để làm boot disk cho instance. Các volume là các thiết bị lưu trữ dưới dạng Read/Write được gắn vào các compute node sử dụng iSCSI. + - Snapshot : một bản read-only dữ trữ dữ liệu của volume tạo một thời điểm nào đó . Snapshot có thể khởi tạo cho một volume đang ở trạng thái active nếu sử dụng `--force True` + - Backup : bản copy của một volume lưu trữ trên Object Storage ( Swift ) + +# 4. Tham khảo thêm +[1] : https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Openstack/Cinder/docs/Tong_quan_Cinder.md + +[2] : https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux_OpenStack_Platform/6/html/Component_Overview/section-blockStorage.html + +[3] : https://docs.openstack.org/cinder/latest/configuration/block-storage/block-storage-overview.html diff --git a/Cinder/2. Cinder-Disk-Work-Flow.md b/Cinder/2. Cinder-Disk-Work-Flow.md new file mode 100644 index 0000000..25d74ae --- /dev/null +++ b/Cinder/2. Cinder-Disk-Work-Flow.md @@ -0,0 +1,88 @@ + +## Mối quan hệ giữa instance và disk + + +## 1. Boot Source + +- Trong Openstack có nhiều các để khởi tạo ổ đĩa cho máy ảo + - Image : Khởi chạy instance sử dụng image chạy trên ephemeral disk hoặc volume disk + - Instance Shapshoot : khởi chạy instance từ một bản snapshot trên một ephermeral disk hoặc volume disk + - Volume : Khởi chạy instance từ một bootable volume đã tồn tại + - Volume Snapshot : Khởi tạo một volume mới từ volume snapshot và chạy instance mới sử dụng bootable volume mới + + + +## 2. Ephemeral boot disk + +- Ephemeral disk là một disk ảo cho mục đích duy nhất là để boot máy ảo và được coi là disk tạm thời +- Ephemeral disk được sử dụng trong trường hợp không quan tâm trong trường hợp xóa máy ảo và mất quan tâm dữ liệu bên trong . Có thể mount một volume nào đó vào một instance đang boot từ enphemeral disk và đổ dữ liệu vào trong volume đó +- Đặc tính của ephemeral disk : + - Có thể snapshot : có thể nhân đôi bản instance hoặc sử dụng snapshot + - Không sử dụng hết volume quota : Nếu bạn có nhiều instance quota, bạn có thể boot chúng từ ephemeral disk ngay cả khi không có nhiều volume quota + - Ổ đĩa bị xóa khi máy ảo xóa + + +## 3. Volume boot disk + +- Voume là dạng lưu trữ bền vững hơn ephemeral disk và có thể dùng để boot như là một block device, cũng có thể mount được. +- Volume boot disk hữu dụng khi bạn cần dupicate một vm hoặc backup chúng bằng cách snapshot, hoặc nếu bạn muốn dùng phương pháp lưu trữ đáng tin cậy hơn là ephemeral disk. Nếu dùng dạng này, cần có đủ quota cho các vm cần boot. + +Một số đặc tính : +- Có thể snapshot +- Không bị xóa khi xóa máy ảo : Bạn có thể xóa máy ảo nhưng dữ liệu vẫn còn trong volume +- Sử dụng hết volume quota : volume quota sẽ được sử dụng hết khi dùng tùy chọn này. + + +## 4. Một số storage backend + +![](https://i.imgur.com/SVdvkbz.png) + +## 5. Cinder Processes Concept Diagram + +![](http://netapp.github.io/openstack-deploy-ops-guide/icehouse/content/figures/3/a/images/cinder_process_layout.png) + +- Gồm có 4 process liên hệ với nhau trong Cinder service + - cinder-api : WSGI application nhận các Request từ client và router đến các cinder process khác sử dụng AMQP + - cinder-sheduler : xác định backend đích dùng để khởi tạo volume hoặc các tác vụ khac + - cinder-volume : chấp nhận các request từ các cinder process và làm việc với các Cinder Driver . Quá trình này hoạt động đa luồng và thường chỉ có một luồng cho mỗi Cinder Backend + - cinder-backup : làm việc với các backend backup ( SWIFT ) , xử lý các request khi client yêu cầu khởi tạo backup hoặc quản lý các volume + + +## 6. Quá trình Cinder khởi tạo Volume + +![](http://netapp.github.io/openstack-deploy-ops-guide/icehouse/content/figures/3/a/images/cinder_process_layout.png) + + +- B1 : Client xử lý request tạo máy từ Rest API +- B2 : cinder-api kiểm tra các request hợp lệ, sau đó gủi các bản tin đến hàng chờ AMQP +- B3 : Cinder-sheduler : thực hiện đưa các message ra khởi hàng chờ và liệt kê các thông tin trên request để xác định được backend sử dụng +- B4 : Cinder-volume : đọc các message từ cinder-sheduler gửi về hàng chờ, và làm việc với backend driver được yêu cầu +- B5 : Cinder driver tương tác với các storage backend để khởi tạo volume +- B6 : Cinder-volume tập hợp volume metadata và gửi lên AMQP queue +- B8: Cinder-api đọc message trả lời từ queue và trả lời client. +- B9: Cinder client nhận các request thông tin của volume + + +## 7 . Quá trình Cinder Attach Volume + +![](http://netapp.github.io/openstack-deploy-ops-guide/icehouse/content/figures/3/a/images/nova_volume_attach_process.png) + + +- B11.Client yêu cầu attach volume thông Nova Rest API ( client sử dụng python-cinderclient hoặc thông qua dashboard) +- B2.nova-api xác thực yêu cầu xem có hợp lệ hay không? , thông tin user. Một khi được xác thực, gọi Cinder API để lấy thông tin về volume cụ thể. +- B3.cinder-api xác thực yêu cầu xem có hợp lệ hay không?, thông tin user. Một khi được xác thực, post message đến volume manager thông qua AMQP. +- B4.cinder-volume đọc message từ queue, gọi Cinder driver tương ứng đến volume để attached. +- B5.Cinder driver chuẩn bị Cinder volume cho việc attachment ( các bước cụ thể phụ thuộc vào giao thức storage được sử dụng) +- B6.cinder-volume post thông tin trả lời đến cinder-api thông qua AMQP queue. +- B7.cinder-api đọc message trả lời từ cinder-volume từ queue, truyền thông tin kết nối trong RESTful reponse đến Nova caller. +- B8.Nova tạo kết nối đến storage với thông tin trả lại từ Cinder. +- B9.Nova truyền volume device/file đến hypervisor, sau đó attach volume device/file đến guest VM như một thiết bị block thực tế hoặc (phụ thuộc vào giao thức storage). + + +### 8 . Tham khảo thêm + +- https://help.dreamhost.com/hc/en-us/articles/217701757-What-s-the-difference-between-ephemeral-and-volume-boot-disks- +- https://github.com/thaonguyenvan/meditech-thuctap/blob/master/ThaoNV/Tim%20hieu%20OpenStack/docs/cinder/cinder-workflow.md +- http://netapp.github.io/openstack-deploy-ops-guide/icehouse/content/section_cinder-processes.html +- https://docs.openstack.org/project-deploy-guide/openstack-ansible/draft/overview-storage-arch.html +- https://docs.openstack.org/arch-design/design-storage/design-storage-concepts.html diff --git a/Cinder/3. Install-Cinder-LVM.md b/Cinder/3. Install-Cinder-LVM.md new file mode 100644 index 0000000..318e7c6 --- /dev/null +++ b/Cinder/3. Install-Cinder-LVM.md @@ -0,0 +1,204 @@ + + +## Cài đặt Cinder với backend LVM + + +## 1. Trên Controller + +- Biến môi trường + +```bash +echo "export OS_VOLUME_API_VERSION=2" >> ~/admin-openrc +source ~/admin-openrc + + +``` + +- Khởi tạo Database +```bash +mysql -u root --password=123@123Aa < /etc/cinder/cinder.conf +[DEFAULT] +transport_url = rabbit://openstack:rabbitmq_123@controller +auth_strategy = keystone +my_ip = 192.168.69.130 + +[database] +connection = mysql+pymysql://cinder:cinder_123@controller/cinder + +[keystone_authtoken] + +auth_uri = http://controller:5000 +auth_url = http://controller:5000 +memcached_servers = controller:11211 +auth_type = password +project_domain_id = default +user_domain_id = default +project_name = service +username = cinder +password = cinder_123 + +[oslo_concurrency] +lock_path = /var/lib/cinder/tmp + +EOF + +su -s /bin/sh -c "cinder-manage db sync" cinder + +cat <> /etc/nova/nova.conf + +[cinder] +os_region_name = RegionOne +EOF + + +``` + +- Khởi động dịch vụ +```bash +systemctl restart openstack-nova-api.service +systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service +systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service +``` + +- Cấu hình FirewallD + + +``` +firewall-cmd --add-port=3306/tcp --permanent +firewall-cmd --add-port=8776/tcp --permanent +firewall-cmd --reload +``` + +## 2. Trên Storage Node - LVM Backend + +- Cấu hình môi trường +```bash +cat <> /etc/hosts + +192.168.69.130 controller + +192.168.69.131 compute1 + +192.168.69.132 compute + +EOF + +``` + +- Cấu hình NTP +```bash +yum install -y chronyc +sed -i -e "s/server.*/server controller iburst/g" /etc/chrony.conf +systemctl enable chronyd.service +systemctl start chronyd.service + +``` + + +- Cài đặt LVM +``` +yum install -y lvm2 device-mapper-persistent-data +systemctl enable lvm2-lvmetad.service +systemctl start lvm2-lvmetad.service +``` + +- Khởi tạo LVM +```bash +echo '2048,,8e;' | sfdisk /dev/sdb +pvcreate /dev/sdb1 +vgcreate cinder-volumes /dev/sdb1 + +``` + + +- Cài đặt và cấu hình Cinder +```bash +yum install -y centos-release-openstack-queens +yum install -y openstack-cinder targetcli python-keystone +cp -p /etc/cinder/cinder.conf /etc/cinder/cinder.conf.bak +cat < /etc/cinder/cinder.conf + +[DEFAULT] +transport_url = rabbit://openstack:rabbitmq_123@controller +auth_strategy = keystone +my_ip = 192.168.69.133 +enabled_backends = lvm +glance_api_servers = http://controller:9292 + +[database] +connection = mysql+pymysql://cinder:cinder_123@controller/cinder + + +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:5000 +memcached_servers = controller:11211 +auth_type = password +project_domain_id = default +user_domain_id = default +project_name = service +username = cinder +password = cinder_123 + +[lvm] +volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver +volume_group = cinder-volumes +iscsi_protocol = iscsi +iscsi_helper = lioadm + +[oslo_concurrency] +lock_path = /var/lib/cinder/tmp + +EOF +``` + +- Cấu hình FirewallD + +``` +firewall-cmd --add-service=iscsi-target --permanent +firewall-cmd --reload + +``` + +- Cấu hình LVM Filter +``` + +``` + +- Khởi động dịch vụ +```bash +systemctl enable openstack-cinder-volume.service target.service +systemctl start openstack-cinder-volume.service target.service +``` + + diff --git a/Cinder/4. Basic-Command.md b/Cinder/4. Basic-Command.md new file mode 100644 index 0000000..dc39e04 --- /dev/null +++ b/Cinder/4. Basic-Command.md @@ -0,0 +1,168 @@ +## Làm việc với Cinder + + +## 1. Tạo, xóa, liệt kê, show volume +- Tạo một volume no-source + + ```bash +[root@controller ~]# openstack volume create --size 10 testcreate ++---------------------+--------------------------------------+ +| Field | Value | ++---------------------+--------------------------------------+ +| attachments | [] | +| availability_zone | nova | +| bootable | false | +| consistencygroup_id | None | +| created_at | 2018-12-19T08:01:38.000000 | +| description | None | +| encrypted | False | +| id | 37179e4e-7f0b-40a4-9c35-0ccf5cfdec6e | +| migration_status | None | +| multiattach | False | +| name | testcreate | +| properties | | +| replication_status | None | +| size | 10 | +| snapshot_id | None | +| source_volid | None | +| status | creating | +| type | None | +| updated_at | None | +| user_id | 6ca03d3c55444c10aa22f481f2e13381 | +``` + +- Tạo volume từ image +```bash +[root@controller ~]# openstack image list ++--------------------------------------+------------+--------+ +| ID | Name | Status | ++--------------------------------------+------------+--------+ +| fc5c8ce8-9dac-4f8e-ae4a-5212dc145b81 | centos | active | +| 8bc5ff78-118b-435a-9611-e6a99d9f6b1c | cirros | active | +| 9a3cf56e-8730-49f4-a74f-3b76503c2c03 | not-edit | active | +| 6a443ca4-a96f-4dbb-a898-38922292ab06 | test-cloud | active | +| 50bb3b13-7474-4559-9dce-03b4cb574234 | ubuntu-16 | active | ++--------------------------------------+------------+--------+ +[root@controller ~]# openstack volume create --size 10 --image centos testimage ++---------------------+--------------------------------------+ +| Field | Value | ++---------------------+--------------------------------------+ +| attachments | [] | +| availability_zone | nova | +| bootable | false | +| consistencygroup_id | None | +| created_at | 2018-12-19T08:03:09.000000 | +| description | None | +| encrypted | False | +| id | ea0467c7-3844-4d51-8ce7-71afff383c3c | +| migration_status | None | +| multiattach | False | +| name | testimage | +| properties | | +| replication_status | None | +| size | 10 | +| snapshot_id | None | +| source_volid | None | +| status | creating | +| type | None | +| updated_at | None | +| user_id | 6ca03d3c55444c10aa22f481f2e13381 | ++---------------------+--------------------------------------+ + +``` + +- Tạo một volume từ volume khác + +```bash +[root@controller ~]# openstack volume create --size 20 --source testimage dup_testimage ++---------------------+--------------------------------------+ +| Field | Value | ++---------------------+--------------------------------------+ +| attachments | [] | +| availability_zone | nova | +| bootable | true | +| consistencygroup_id | None | +| created_at | 2018-12-19T08:06:59.000000 | +| description | None | +| encrypted | False | +| id | 1f502752-3764-4604-8b9d-fcc595dc9cfa | +| migration_status | None | +| multiattach | False | +| name | dup_testimage | +| properties | | +| replication_status | None | +| size | 20 | +| snapshot_id | None | +| source_volid | ea0467c7-3844-4d51-8ce7-71afff383c3c | +| status | creating | +| type | None | +| updated_at | None | +| user_id | 6ca03d3c55444c10aa22f481f2e13381 | + + + ``` + + +- Xóa volume + +```bash +openstack volume delete +``` + +- Liệt kê các volume + +```bash +openstack volume list +``` + +- show volume + ```bash + openstack volume show + ``` + +## 2. Snapshot volume +- Tạo snapshot + +```sh +[root@controller ~]# openstack volume snapshot create --volume dup_testimage snap_test ++-------------+--------------------------------------+ +| Field | Value | ++-------------+--------------------------------------+ +| created_at | 2018-12-19T08:26:31.246334 | +| description | None | +| id | 039383eb-a7c2-4b6d-9121-eb6fdea0b19d | +| name | snap_test | +| properties | | +| size | 20 | +| status | creating | +| updated_at | None | +| volume_id | 1f502752-3764-4604-8b9d-fcc595dc9cfa | ++-------------+--------------------------------------+ + +``` + +- List ra danh sách các snapshot của volume +```sh +openstack volume snapshot list +``` + +- Xóa snapshot + +```sh + openstack volume snapshot delete + ``` + +## 3. Attach và detach volume cho máy ảo + +- Attach volume + +```sh + openstack server add volume < VM> --device +``` + + +- Detach volume + + ```sh + openstack server remove volume + ``` diff --git a/Cinder/5. Install-Multi-Backend.md b/Cinder/5. Install-Multi-Backend.md new file mode 100644 index 0000000..3abb0d9 --- /dev/null +++ b/Cinder/5. Install-Multi-Backend.md @@ -0,0 +1,169 @@ + +## Cấu hình Multi Backend - LVM & NFS + + +## 1. Introduction + +- Khi cấu hình Multi-storage backend , mỗi backend storage khởi tạo sẽ có một service `cinder-volume` riêng - Trong multi-storage backend , mỗi backend sẽ có một tên riêng ( volume_backend_name ) . Nhiều backend có thể có cùng một tên . Dựa vào backend name để scheduler có thể xác định được backend mà volume sẽ được tạo . +- Tên của backend sẽ là thông tin kỹ thuật đặc trưng ( extra-specification ) của một volume type ( `volume_backend_name=LVM`) . Khi một volume khởi tạo , cinder-sheduler sẽ chọn backend dựa vào thông số này trên volume type bởi người dùng. + +- Để khởi tạo được môi trường back-end sẽ sử dụng option `enabled_backends` . Mỗi backend sẽ là một group trong tập tin cấu hình cinder và không liên quan đến `volume_backend_name` + +## 2. Cấu hình trên NFS Node + +- Cài đặt và cấu hình NFS +``` +yum install -y install nfs-utils +mkdir /var/lib/nfs-share +echo "/var/lib/nfs-share 192.168.69.0/24(rw,no_root_squash)" > /etc/exports +systemctl restart rpcbind nfs-server +systemctl enable rpcbind nfs-server +``` + + +- Cấu hình Firewalld +``` +firewall-cmd --add-service=nfs --permanent +firewall-cmd --reload +``` + +## 3. Cấu hình Storage Node + +- Cấu hình LVM ở bài trước : https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Cinder/3.%20Install-Cinder-LVM.md + + +- Cấu hình môi trường +```bash + +cat <> /etc/hosts +192.168.69.130 controller +192.168.69.131 compute1 +192.168.69.132 compute +192.168.69.133 cinder + +EOF + +- Cấu hình NTP +```bash +yum update -y +yum install -y chronyc +sed -i -e "s/server.*/server controller iburst/g" /etc/chrony.conf +systemctl enable chronyd.service +systemctl start chronyd.service + +``` + +- Cài đặt, cấu hình Cinder +```bash +yum install -y centos-release-openstack-queens python-openstackclient openstack-selinux +yum install -y openstack-cinder targetcli python-keystone + +yum install -y centos-release-openstack-queens python-openstackclient openstack-selinux +yum install -y openstack-cinder targetcli python-keystone +cp -p /etc/cinder/cinder.conf /etc/cinder/cinder.conf.bak +cat < /etc/cinder/cinder.conf +[DEFAULT] +transport_url = rabbit://openstack:rabbitmq_123@controller +auth_strategy = keystone +my_ip = 192.168.69.134 +enabled_backends = lvm,nfs +glance_api_servers = http://controller:9292 +[database] +connection = mysql+pymysql://cinder:cinder_123@controller/cinder +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:5000 +memcached_servers = controller:11211 +auth_type = password +project_domain_id = default +user_domain_id = default +project_name = service +username = cinder +password = cinder_123 + +[lvm] +volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver +volume_group = cinder-volumes +iscsi_protocol = iscsi +iscsi_helper = lioadm +volume_backend_name = lvmdriver-1 + + + +[nfs] +volume_driver = cinder.volume.drivers.nfs.NfsDriver +nfs_shares_config = /etc/cinder/nfs_shares +nfs_mount_point_base = $state_path/mnt_nfs +volume_backend_name = nfsdriver-1 +nfs_snapshot_support = True + +[oslo_concurrency] +lock_path = /var/lib/cinder/tmp +EOF + +``` + + +- Cài đặt, cấu hình NFS Client +```bash +yum -y install nfs-utils +systemctl enable rpcbind +systemctl start rpcbind +cat < /etc/cinder/nfs_shares +192.168.69.134:/var/lib/nfs-share +EOF + +chmod 640 /etc/cinder/nfs_shares +chgrp cinder /etc/cinder/nfs_shares +systemctl restart openstack-cinder-volume +chown -R cinder. /var/lib/cinder/mnt_nfs/ +``` + + + + + + + + +- Khởi động dịch vụ +```bash +systemctl enable openstack-cinder-volume.service target.service +systemctl start openstack-cinder-volume.service target.service +``` + + +## 4. Trên Controller + +- Khởi tạo type Volume +```bash + +openstack volume type create lvm +openstack volume type set lvm --property volume_backend_name=lvmdriver-1 + +openstack volume type create nfs + +openstack volume type set nfs --property volume_backend_name=nfsdriver-1 + +``` + +- Kiểm tra các Volume type +``` +openstack volume type list --long +``` + +- Khởi tạo NFS DISK +``` +openstack volume create --type nfs-node2 --size 10 disk_nfs + +``` + +- Kiểm tra Log +![](https://i.imgur.com/ZxjM2Wb.png) + + +- ## Note đối với các Network Node đang sử dụng Selinux cần khởi tạo một rule mới + +``` +setsebool -P virt_use_nfs on +``` diff --git a/Cinder/6. Filtering-Multi-Backend.md b/Cinder/6. Filtering-Multi-Backend.md new file mode 100644 index 0000000..fa24169 --- /dev/null +++ b/Cinder/6. Filtering-Multi-Backend.md @@ -0,0 +1,154 @@ + + +## Cấu hình Multi Backend Scheduler Filter + + +## 1. Introduction + +- Openstack Block Storage cho phép lựa chọn back-end storage dựa vào các cài đặt bổ sung dựa vào DriverFilter và GoodnessWeigher trong quá tringh schduler . Nhờ vào filter và weigher để chắc chắn scheduler lựa chọn backend tốt nhất trên mỗi request đưa vào API + + +### 1.2 : Cinder Scheduler Filters +- AvailabilityZoneFilter : Filter bằng availability zone +- CapabilitiesFilter : Filter theo tài nguyên (máy ảo và volume) +- CapacityFilter : Filter dựa vào công suất sử dụng của volume backend +- DifferentBackendFilter : Lên kế hoạch đặt các volume ở các backend khác nhau khi có 1 danh sách các volume +- DriverFilter : Dựa vào ‘filter function’ và metrics. +- InstanceLocalityFilter : lên kế hoạch cho các volume trên cùng 1 host. Để có thể dùng filter này thì Extended Server Attributes cần được bật bởi nova và user sử dụng phải được khai báo xác thực trên cả nova và cinder. +- JsonFilter : Dựa vào JSON-based grammar để chọn lựa backends +- RetryFilter : Filter những node chưa từng được schedule +- SameBackendFilter : Lên kế hoạch đặt các volume có cùng backend như những volume khác. + +### 1.3 Cinder Scheduler Weights + +- AllocatedCapacityWeigher : Allocated Capacity Weigher sẽ tính trọng số của host bằng công suất được phân bổ. Nó sẽ đặt volume vào host được khai báo chiếm ít tài nguyên nhất. +- CapacityWeigher : Trạng thái công suất thực tế chưa được sử dụng. +- ChanceWeigher : Tính trọng số random, dùng để tạo các volume khi các host gần giống nhau +- GoodnessWeigher : Gán trọng số dựa vào goodness function. + + +## 2. Cấu hình trên Cinder Node + +- Để cấu hình Block Storage scheduler multi back end cần sử dụng option `filter_scheduler`. Trong filter scheduler : + - Cinder Scheduler Filters : mặc định các filter `AvailabilityZoneFilter`, `CapacityFilter` and `CapabilitiesFilter` được sử dụng + - Cinder Scheduler Weights : mặc định option `CapacityWeigher` được sử dụng + +### 2.1 . Bật DriverFilter và GoodnessWeigher + +- Để enable driver filter sử dụng option `scheduler_default_filters = DriverFilter ` , để sử dụng GoodnessWeigher sử dụng option `scheduler_default_weighers = GoodnessWeigher`. + +``` +[DEFAULT] +.... +scheduler_driver = cinder.scheduler.filter_scheduler.FilterScheduler +scheduler_default_filters = DriverFilter + +``` + + +### 2.2 . Định nghĩa Filter function và Goodness function + +- Có thể tự định nghĩa các filter và weigher . Các thuộc tính tự định nghĩa này sẽ được gửi kèm về request , sau đó sẽ làm việc với scheduler + - Filter function sẽ xác định các xác định back-end phù hợp với các yêu cầu để đẩy vào quá trình scheduler. + - Goodness function sẽ đánh giá chất lượng của các host thuộc back-end từ quá trình filter rồi đẩy vào scheduler (0 to 100, 0 lowest, 100 highest). + +- Các phép toán hỗ trợ trong quá trình filtering +![](https://i.imgur.com/HoKGO4L.png) + + +- Cấu hình filter_function cho `LVM` và `NFS` +``` + + +[lvm] +volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver +volume_group = cinder-volumes +iscsi_protocol = iscsi +iscsi_helper = lioadm +filter_function = "volume.size > 5 or volume.size = 5" +volume_backend_name = lvmdriver-1 + + + + +[nfs] +volume_driver = cinder.volume.drivers.nfs.NfsDriver +nfs_shares_config = /etc/cinder/nfs_shares +nfs_mount_point_base = $state_path/mnt_nfs +volume_backend_name = nfsdriver-1 +filter_function = "volume.size < 5" + + + + +``` + +- Khởi động lại dịch vụ trên Storage Node +``` +systemctl restart openstack-cinder-api.service +systemctl restart lvm2-lvmetad.service +systemctl start openstack-cinder-scheduler.service +systemctl enable openstack-cinder-api.service +systemctl enable openstack-cinder-scheduler.service +``` + + +### 3. Cấu hình trên Controller + +- Kiểm tra volume service +```bash +[root@controller ~]# openstack volume service list ++------------------+-------------+------+---------+-------+----------------------------+ +| Binary | Host | Zone | Status | State | Updated At | ++------------------+-------------+------+---------+-------+----------------------------+ +| cinder-scheduler | controller | nova | enabled | up | 2018-12-21T07:04:31.000000 | +| cinder-volume | cinder1@lvm | nova | enabled | up | 2018-12-21T07:04:33.000000 | +| cinder-volume | cinder1@nfs | nova | enabled | up | 2018-12-21T07:04:35.000000 | +| cinder-scheduler | cinder1 | nova | enabled | up | 2018-12-21T07:04:32.000000 | ++------------------+-------------+------+---------+-------+----------------------------+ + + +``` + + +- Khởi tạo ổ cứng trên `5GB` + +```txt +2018-12-21 02:02:02.184 16688 DEBUG cinder.scheduler.host_manager [req-c02f5866-241a-47a6-823f- +06bd1fc91d1d - - - - -] Received volume service update from +cinder1@nfs: {u'filter_function': u'volume.size >= 5', +u'QoS_support': False, u'thick_provisioning_support': False, +u'provisioned_capacity_gb': 10.0, u'allocated_capacity_gb': 10, +u'volume_backend_name': u'nfs', u'thin_provisioning_support': +True, u'free_capacity_gb': 33.87841796875, u'driver_version': +u'1.4.0', u'total_capacity_gb': 36.974365234375, +u'sparse_copy_volume': True, u'reserved_percentage': 0, +u'goodness_function': None, u'max_over_subscription_ratio': +20.0, u'vendor_name': u'Open Source', u'storage_protocol': +u'nfs'} update_service_capabilities /usr/lib/python2.7/site- +packages/cinder/scheduler/host_manager.py:547 + +``` + +- Khởi tạo ổ cứng dưới `5GB` +``` +2018-12-21 02:03:25.229 16688 DEBUG cinder.scheduler.host_manager [req-4090a060-36a3-43ef-bdc3- +fca6248f89db - - - - -] Received volume service update from +cinder1@lvm: {u'filter_function': u'volume.size < 5', +u'goodness_function': None, u'shared_targets': False, +u'volume_backend_name': u'lvm', u'driver_version': u'3.0.0', +u'sparse_copy_volume': True, u'pools': [{u'pool_name': u'lvm', +u'filter_function': u'volume.size < 5', u'goodness_function': +None, u'multiattach': True, u'total_volumes': 1, +u'provisioned_capacity_gb': 0.0, u'allocated_capacity_gb': 0, +u'thin_provisioning_support': True, u'free_capacity_gb': 26.6, +u'location_info': u'LVMVolumeDriver:cinder1:cinder- +volumes:thin:0', u'total_capacity_gb': 26.6, +u'thick_provisioning_support': False, u'reserved_percentage': 0, +u'QoS_support': False, u'max_over_subscription_ratio': u'20.0', +u'backend_state': u'up'}], u'vendor_name': u'Open Source', +u'storage_protocol': u'iSCSI'} update_service_capabilities +/usr/lib/python2.7/site- +packages/cinder/scheduler/host_manager.py:547 + +``` diff --git a/Cinder/7. Cinder-More.md b/Cinder/7. Cinder-More.md new file mode 100644 index 0000000..8211877 --- /dev/null +++ b/Cinder/7. Cinder-More.md @@ -0,0 +1,94 @@ + +## Cấu hình bổ sung trong Cinder + +### 1. Tăng số lượng tiến trình cho API Service +- Mặc định , Block Storage API service sẽ chỉ chiếm một process . Điều này kiến giới hạn các API request trong một thời điểm. Trong môi trường production , có thể điều chỉnh lưu lượng đi qua Block Storage API nhờ việc tăng process của +- Để cấu hình ta có thể sử dụng tùy chọn +``` +[DEFAULT] +osapi_volume_workers CORES +``` +Trong đó : Cores là số core / luồng CPU vật lý + + + +### 2. Instance Volume + + +- Mặc định trong Cinder sẽ tích hợp ISCSI để sử dụng LVM ( Logical Volume Manager ) +- Openstack Block Storage service không phải là một giải pháp shared storage giống như Network Attached Storage (NAS) có thể gắn nhiều volume vào một server. Trong Block Service chỉ có thể gắn một volume vào một instance trên một thời điểm +- Khi sử dụng ISCSI , các storage node sẽ khởi tạo một ISCSI session và attack một storage mới có định dạng ( /dev/sdX ) +- Khi sử dụng NFS , các storage sẽ mount các NFS , mỗi instance sẽ là một volume , thường sẽ được lưu tại `/var/lib/cinder/mnt` - tùy cấu hình +- Livirt sẽ sử dụng storage này cho các các instance. Các instance khi khởi tạo từ volume sẽ có định dạng ( /dev/vdX ) + + +### 3. Get capabilities + +- Khi cấu hình volume type và extra spec của một storage back-end thì cần xem các khả năng của backend , xác định back-end có đủ yêu cầu đề ra + +- Lấy danh sách service +```bash +[root@controller ~]# openstack volume service list ++------------------+-------------+------+---------+-------+----------------------------+ +| Binary | Host | Zone | Status | State | Updated At | ++------------------+-------------+------+---------+-------+----------------------------+ +| cinder-scheduler | controller | nova | enabled | up | 2018-12-21T08:37:36.000000 | +| cinder-volume | cinder1@lvm | nova | enabled | up | 2018-12-21T08:37:34.000000 | +| cinder-volume | cinder1@nfs | nova | enabled | up | 2018-12-21T08:37:37.000000 | +| cinder-scheduler | cinder1 | nova | enabled | up | 2018-12-21T08:37:33.000000 | ++------------------+-------------+------+---------+-------+----------------------------+ + +``` +- Xem khả năng hỗ trợ cụ thể trên từng cinder-volume host +```bash +[root@controller ~]# cinder get-capabilities cinder1@nfs ++---------------------+----------------------------------------+ +| Volume stats | Value | ++---------------------+----------------------------------------+ +| description | None | +| display_name | None | +| driver_version | 1.4.0 | +| namespace | OS::Storage::Capabilities::cinder1@nfs | +| pool_name | None | +| replication_targets | [] | +| storage_protocol | nfs | +| vendor_name | Open Source | +| visibility | None | +| volume_backend_name | nfsdriver-1 | ++---------------------+----------------------------------------+ ++---------------------+---------------------------------------+ +| Backend properties | Value | ++---------------------+---------------------------------------+ +| compression | description : Enables compression. | +| | title : Compression | +| | type : boolean | +| qos | description : Enables QoS. | +| | title : QoS | +| | type : boolean | +| replication_enabled | description : Enables replication. | +| | title : Replication | +| | type : boolean | +| thin_provisioning | description : Sets thin provisioning. | +| | title : Thin Provisioning | +| | type : boolean | ++---------------------+---------------------------------------+ + +``` + + +### 4. Volume Group + +- Chức năng này hỗ trợ tạo một group type hoặc một group spec , khởi tạo một group các volume hoặc snapshot. +- Group type giống như volume type . Mỗi group type có thể gắn các extra spec giống như volume type . + + +### 5. Image-Volume cache + +- Chức năng này cho phép cải thiện hiệu năng khi tạo volume từ image. +- Lần đầu khi một volume được tạo từ image , thì một cached image-volume được khởi tạo được sở hữu bởi Block Storage internal project. Sau đó khi một yêu cầu tạo một volume từ image cũ thì image sẽ được clone từ cacher thay vì phải download image từ glance về +- Để sử dụng chức năng này . Block Storage service phải có quyền truy cập vào Internal tenant. Cấu hình trong `/etc/cinder/cinder.conf` . User và project sử dụng cho qúa trình image-volume cache sẽ không cần đặc quyền. +``` +cinder_internal_tenant_project_id = 9373ec3c823343de87ae613b972aa4d3 +cinder_internal_tenant_user_id = 6ca03d3c55444c10aa22f481f2e13381 +image_volume_cache_enabled = True +``` diff --git a/Glance/1. Introduction-Glance.md b/Glance/1. Introduction-Glance.md new file mode 100644 index 0000000..9360947 --- /dev/null +++ b/Glance/1. Introduction-Glance.md @@ -0,0 +1,131 @@ + + +# OPENSTACK IMAGE - GLANCE + +## 1: Khái niệm + +- Glance là **Image services** của Openstack . Dịch vụ này cung cấp các virtual image cho các máy ảo để bootable và để quản lý volume snapshot. +- Các volume snapshot có thể sử dụng để backup hoặc làm template cho máy ảo mới. +- Glance được thiết kế để có thể là dịch vụ hoạt động độc lập cho sự cần thiết các tổ chức lớn lưu trữ và quản lý các disk image ảo. +- Glance cung cấp RESTful API cho phép truy cập VM image metadata. + +## 2 : Các thành phần trong Glance + +Glance bao gồm các thành phần sau : +- openstack-glance-api : Xử lý yêu cầu và iamge . Sử dụng registry để lấy thông tin image +- openstack-glance-registry : quản lý , lưu trữ, xử lý các metadata mỗi image +- database : lưu trũ các metadata của các images +- mabbitmq-server : cung cấp hàng chờ AMQP. RabbitMQ (cũng được sử dụng bởi các dịch vụ khác), làm việc với các openstack service khác bao gồm xếp hàng, phân phối, bảo mật, quản lý, phân cụm và liên kết. + + +## 3. Glance Architecture + +- Glance có kiến trúc **client-server** và _**cung cấp REST API**_ thông qua đó yêu cầu tới server được thực hiện. + +- Yêu cầu từ client được tiếp nhận thông qua REST API và đợi sự xác thực của Keystone. Keystone Domain controller quản lý tất cả các tác vụ vận hành bên trong. Các tác vụ này chia thành các lớp, mỗi lớp triển khai nhiệm vụ vụ riêng của chúng. + +- Glance store driver là lớp giao tiếp giữa glane và các hệ thống backend bên ngoài hoặc hệ thống tệp tin cục bộ, cung cấp giao diện chung để truy cập. Glance sử dụng SQL Database làm điểm truy cập cho các thành phần khác trong hệ thống. + +![](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Openstack/Glance/images/1.3.png) + +- Glance tiếp nhận các API request yêu cầu images từ người dùng cuối hoặc các nova component và costheer lưu trữ các file images trong hệ thống object storage Swift hoặc các storage repos khác. + +- Glance hỗ trợ các hệ thống backend lưu trữ sau: + + - _**File system**_: Glance lưu trữ images của các máy ảo trong hệ thống tệp tin thông thường theo mặc định, hỗ trợ đọc ghi các image files dễ dàng vào hệ thống tệp tin + + - _**Object Storage**_: + + - Là hệ thống lưu trữ do OpenStack Swift cung cấp - dịch vụ lưu trữ có tính sẵn sàng cao , lưu trữ các image dưới dạng các object. + + - BlockStorage Hệ thống lưu trữ có tính sẵn sàng cao do OpenStack Cinder cung cấp, lưu trữ các image dưới dạng khối + + - _**VMWare**_ + + - _**Amazon S3**_ + + - _**HTTP**_: Glance có thể đọc các images của các máy ảo sẵn sàng trên Internet thông qua HTTP. Hệ thống lưu trữ này chỉ cho phép đọc. + + - _**RADOS Block Device(RBD)**_ : Lưu trữ các images trong cụm lưu trữ Ceph sử dụng giao diện RBD của Ceph + + - _**Sheepdog**_: Hệ thống lưu trữ phân tán dành cho QEMU/KVM + + - _**GridFS**_: Lưu trữ các image sử dụng MongoDB + +## 4. Định dạng hỗ trợ + +Khi upload một image lên Glance, ta cần xác định định dạng của image máy ảo VM. Glance hỗ trợ nhiều loại định dạng đĩa (iamge format) và định dạng container (Container format). + +**Disk Format bao gồm :** +- aki :An Amazon kernel image. + +- ami :An Amazon machine image. + +- ari : An Amazon ramdisk image. + +- iso : An archive format for the data contents of an optical disc, such as CD-ROM. + +- qcow2 : Supported by the QEMU emulator that can expand dynamically and supports Copy on Write. + +- raw : An unstructured disk image format; if you have a file without an extension it is possibly a raw format. + +- vdi : Supported by VirtualBox virtual machine monitor and the QEMU emulator. + +- vhd : The VHD disk format, a common disk format used by virtual machine monitors from VMware, Xen, Microsoft, VirtualBox, and others. + +- vhdx : The VHDX disk format, an enhanced version of the VHD format, which supports larger disk sizes among other features. + +- vmdk : Vmware + +**Container format bao gồm :** + +- aki : An Amazon kernel image. + +- ami :An Amazon machine image. + +- ari : An Amazon ramdisk image. + +- bare: The image does not have a container or metadata envelope. + +- docker: A docker container format. + +- ova :An OVF package in a tarfile. + +- ovf : The OVF container format. + +# 5. Luồng trạng thái của image trong Glance + +Luồng trạng thái của Glance cho biết trạng thái của image trong quá trình tải lên. Khi tạo một image, bước đầu tiên là queing, image được đưa vào hàng đợi trong một khoảng thời gian ngắn, được bảo vệ và sẵn sàng để tải lên. Sau khi queuing, image chuyển sang trạng thái saving nghĩa là quá trình tải lên chưa hoàn thành. Một khi image được tải lên hoàn toàn, trạng thái image chuyển sang Active. Khi quá trình tải lên thất bại nó sẽ chuyển sang trạng thái bị hủy hoặc bị xóa. Ta có thể deactive và reactive các image đã upload thành công bằng cách sử dụng command. Luồng trạng thái của flow được mô tả theo hình sau: + +[![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Openstack/Glance/images/1.6.png)](https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Openstack/Glance/images/1.6.png) + +Các trạng thái của image: + +- **queued** + +Định danh của image được bảo vệ trong Glance registry. Không có dữ liệu nào của image được tải lên Glance và kích thước của image không được thiết lập rõ ràng sẽ được thiết lập về zero khi khởi tạo. + +- **saving** Trạng thái này biểu thị rằng dữ liệu thô của image đang upload lên Glance. Khi image được đăng ký với lời gọi POST /images và có một header đại diện x-image-meta-location, image đó sẽ không bao giờ được đưa và trạng thái "saving" (bởi vì dữ liệu của image đã có sẵn ở một nơi nào đó) + +- **active** + +Biểu thị rằng một image đã sẵn sàng trong Glance. Trạng thái này được thiết lập khi dữ liệu của image được tải lên hoàn toàn. + +- **deactivated** + +Trạng thái biểu thị việc không được phép truy cập vào dữ liệu của image với tài khoản không phải admin. Khi image ở trạng thái này, ta không thể tải xuống cũng như export hay clone image. + +- **killed** + +Trạng thái biểu thị rằng có vấn đề xảy ra trong quá trình tải dữ liệu của image lên và image đó không thể đọc được + +- **deleted** + +Trạng thái này biểu thị việc Glance vẫn giữ thông tin về image nhưng nó không còn sẵn sàng để sử dụng nữa. Image ở trạng thái này sẽ tự động bị gỡ bỏ vào ngày hôm sau. + +- **pending_delete**: Tương tự như trạng thái deleted, tuy nhiên Glance chưa gỡ bỏ dữ liệu của image ngay. Một image khi đã rơi vào trạng thái này sẽ không có khả năng khôi phục. + +# 6. Tham khảo +1. https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Openstack/Glance/docs/1.Tim_hieu_Glance_trong_Openstack.md# +2. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux_OpenStack_Platform/6/html-single/Component_Overview/index.html#section-image +3. https://docs.openstack.org/image-guide/image-formats.html diff --git a/Glance/2. Install Glance.md b/Glance/2. Install Glance.md new file mode 100644 index 0000000..08942b8 --- /dev/null +++ b/Glance/2. Install Glance.md @@ -0,0 +1,167 @@ +# Cài đặt Glance - Openstack IMAGE + + +## 2. Cài đặt, cấu hình Memcached +### 2.1. Giới thiệu Memcached +- Memcached là một hệ thống lưu trữ bản sao các đối tượng (objects) và dữ liệu được truy cập nhiều lần để tăng tốc độc truy xuất. Mục đích chính của nó là để tăng tốc độ ứng dụng web bằng cách truy vấn cơ sở dữ liệu bộ nhớ đệm, nội dung, hoặc kết quả tính toán khác. +- Trong Openstack Indentity Service , memcached được sử dụng để cache token, thường được cài đặt trên `Controller Node` + +### 2.2. Cài đặt Memcached +- Cài đặt package +```bash +yum install memcached python-memcached +``` +- Khởi động dịch vụ +```bash +systemctl enable memcached.service +systemctl start memcached.service +``` + + +## 3. Cài đặt , cấu hình Glance + + +### 3.1. Cấu hình DB, User, Service +- Khởi tạo database +```bash +[root@localhost ~]# mysql -u root --password=123@123Aa -e "create database glance" +[root@localhost ~]# mysql -u root --password=123@123Aa -e "GRANT ALL PRIVILEGES on glance.* to 'glance'@'localhost' IDENTIFIED BY 'glance_123' " +[root@localhost ~]# mysql -u root --password=123@123Aa -e "GRANT ALL PRIVILEGES on glance.* to 'glance'@'%' IDENTIFIED BY 'glance_123'" +``` + +- Khởi tạo người dùng , glance service entity và gắn quyền +```bash +[root@localhost ~]# openstack user create --domain default glance --password glance_123 ++---------------------+----------------------------------+ +| Field | Value | ++---------------------+----------------------------------+ +| domain_id | default | +| enabled | True | +| id | 8bb5b9ee5e7e46f5a669cc5a11d468dc | +| name | glance | +| options | {} | +| password_expires_at | None | ++---------------------+----------------------------------+ +[root@localhost ~]# openstack service create --name glance --des "Openstack Image -- Glance" image ++-------------+----------------------------------+ +| Field | Value |[root@localhost ~]# mysql -u root --password=123@123Aa -e "GRANT ALL PRIVILEGES on glance.* to 'glance'@'%' IDENTIFIED BY 'glance_123@123Aa'" + ++-------------+----------------------------------+ +| description | Openstack Image -- Glance | +| enabled | True | +| id | 4de24c47507d482c9274a9f9a23c986c | +| name | glance | +| type | image | ++-------------+----------------------------------+ +[root@localhost ~]# openstack role add --project service --user glance admin + +``` + +- Khởi tạo API endpoint : public , internal, admin + +```bash +[root@localhost ~]# openstack endpoint create --region RegionOne image public http://controller:9292 ++--------------+----------------------------------+ +| Field | Value | ++--------------+----------------------------------+ +| enabled | True | +| id | 9579f05b41f84e2a8d3309a81adee83e | +| interface | public | +| region | RegionOne | +| region_id | RegionOne | +| service_id | 4de24c47507d482c9274a9f9a23c986c | +| service_name | glance | +| service_type | image | +| url | http://controller:9292 | ++--------------+----------------------------------+ +[root@localhost ~]# openstack endpoint create --region RegionOne image admin http://controller:9292 ++--------------+----------------------------------+ +| Field | Value | ++--------------+----------------------------------+ +| enabled | True | +| id | 6de4f423b9894deebd364c8d049df393 | +| interface | admin | +| region | RegionOne | +| region_id | RegionOne | +| service_id | 4de24c47507d482c9274a9f9a23c986c | +| service_name | glance | +| service_type | image | +| url | http://controller:9292 | ++--------------+----------------------------------+ +[root@localhost ~]# openstack endpoint create --region RegionOne image internal http://controller:9292 ++--------------+----------------------------------+ +| Field | Value | ++--------------+----------------------------------+ +| enabled | True | +| id | 39fa1756a5a84c6782f13f7cbdc80b0c | +| interface | internal | +| region | RegionOne | +| region_id | RegionOne | +| service_id | 4de24c47507d482c9274a9f9a23c986c | +| service_name | glance | +| service_type | image | +| url | http://controller:9292 | ++--------------+----------------------------------+ + +``` + +### 3.2. Cài đặt , cấu hình Glance + +- Cài đặt package +```bash +yum install openstack-glance +``` + +- Cấu hình Glance API trong file `/etc/glance/glance-api.conf` +```bash +crudini --set /etc/glance/glance-api.conf database connection mysql+pymysql://glance:glance_123@controller/glance +set1=(auth_uri auth_url memcached_servers auth_type project_domain_name user_domain_name project_name username password ) +set2=(http://controller:5000 http://controller:5000 controller:11211 password Default Default service glance glance_123) +id_set2=0 +for i in "${set1[@]}" +do +echo $i ${set2[id_set2]} +crudini --set /etc/glance/glance-api.conf keystone_authtoken $i ${set2[id_set2]} +let id_set2+=1 +done +crudini --set /etc/glance/glance-api.conf paste_deploy flavor keystone +crudini --set /etc/glance/glance-api.conf glance_store stores file,http +crudini --set /etc/glance/glance-api.conf glance_store default_store file +crudini --set /etc/glance/glance-api.conf glance_store filesystem_store_datadir /var/lib/glance/images/ + +``` + +- Cấu hình Glance Registry trong `/etc/glance/glance-registry.conf` +```bash +crudini --set /etc/glance/glance-registry.conf database connection mysql+pymysql://glance:glance_123@controller/glance +set1=(auth_uri auth_url memcached_servers auth_type project_domain_name user_domain_name project_name username password ) +set2=(http://controller:5000 http://controller:5000 controller:11211 password Default Default service glance glance_123@) +id_set2=0 +for i in "${set1[@]}" +do +echo $i ${set2[id_set2]} +crudini --set /etc/glance/glance-registry.conf keystone_authtoken $i ${set2[id_set2]} +let id_set2+=1 +done +crudini --set /etc/glance/glance-registry.conf paste_deploy flavor keystone +``` + +- Đồng bộ hóa dữ liệu đến DB +```bash +su -s /bin/sh -c "glance-manage db_sync" glance +``` + +- Khởi động dịch vụ +```bash +systemctl enable openstack-glance-api.service \ + openstack-glance-registry.service +systemctl start openstack-glance-api.service \ + openstack-glance-registry.service +``` + +- Cấu hình Firewalld + +``` +firewall-cmd --add-port={11211/tcp,9191/tcp,9292/tcp} --permanent +firewall-cmd --reload +``` diff --git a/Glance/3. Openstack-Glance-&-CURL.md b/Glance/3. Openstack-Glance-&-CURL.md new file mode 100644 index 0000000..b20a7e0 --- /dev/null +++ b/Glance/3. Openstack-Glance-&-CURL.md @@ -0,0 +1,190 @@ + +# Làm việc với Glance + + +## 1. Thao tác với Glance qua Openstack Client +- Tạo một image mới +```bash +[root@localhost ~]# source ~/admin-openrc +[root@localhost ~]# yum install wget -y +[root@localhost ~]# wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img +[root@localhost ~]# openstack image create "cirros" \ +> --file cirros-0.4.0-x86_64-disk.img \ +> --disk-format qcow2 --container-format bare \ +> --public + ++------------------+------------------------------------------------------+ +| Field | Value | ++------------------+------------------------------------------------------+ +| checksum | 443b7623e27ecf03dc9e01ee93f67afe | +| container_format | bare | +| created_at | 2018-11-05T04:11:06Z | +| disk_format | qcow2 | +| file | /v2/images/aa614334-8c0c-4e98-b692-85a42dbcb4fb/file | +| id | aa614334-8c0c-4e98-b692-85a42dbcb4fb | +| min_disk | 0 | +| min_ram | 0 | +| name | cirros | +| owner | baedd3b48fbc4134ac1eba01798addea | +| protected | False | +| schema | /v2/schemas/image | +| size | 12716032 | +| status | active | +| tags | | +| updated_at | 2018-11-05T04:11:07Z | +| virtual_size | None | +| visibility | public | ++------------------+------------------------------------------------------+ +``` + +- Liệt kê danh sách image +``` +[root@localhost ~]# openstack image list ++--------------------------------------+--------+--------+ +| ID | Name | Status | ++--------------------------------------+--------+--------+ +| aa614334-8c0c-4e98-b692-85a42dbcb4fb | cirros | active | ++--------------------------------------+--------+--------+ + +``` +- Thông tin cụ thể của một image +``` +[root@localhost fernet-keys]# openstack image show cirror ++------------------+------------------------------------------------------+ +| Field | Value | ++------------------+------------------------------------------------------+ +| checksum | ec508c1e3a5399ca60ae6e6d0feefc45 | +| container_format | bare | +| created_at | 2018-11-05T06:47:38Z | +| disk_format | qcow2 | +| file | /v2/images/8a37019d-3d85-416c-b903-615f437a6773/file | +| id | 8a37019d-3d85-416c-b903-615f437a6773 | +| min_disk | 0 | +| min_ram | 0 | +| name | cirror | +| owner | baedd3b48fbc4134ac1eba01798addea | +| protected | False | +| schema | /v2/schemas/image | +| size | 6472401 | +| status | active | +| tags | | +| updated_at | 2018-11-05T06:48:06Z | +| virtual_size | None | +| visibility | shared | ++------------------+------------------------------------------------------+ + +``` + + +- Xóa một image + +``` +[root@localhost ~]# openstack image delete cirros +[root@localhost ~]# openstack image list +``` + + +## 2. Làm việc với Glance qua CURL + +- Khởi tạo token +``` +curl -i \ +-H "Content-Type: application/json" \ +-d ' +{ "auth": { +"identity": { +"methods": ["password"], +"password": { +"user": { +"name": "admin", +"domain": { "id": "default" }, +"password": "keystone_123@123Aa" +} +} +}, +"scope": { +"project": { +"name": "admin", +"domain": { "id": "default" } +}}}}' \ +http://localhost:5000/v3/auth/tokens | jq +``` + +- Khởi tạo một image +```bash +curl -s -H "X-Auth-Token: $TOKEN" \ +-d '{ +"container_format": "bare", +"disk_format": "qcow2", +"name": "cirror" +}' \ +http://controller:9292/v2/images | jq .id +``` + +- Sau khi khởi tạo image chưa có data, upload data cho image +```bash +curl -i -X PUT -H "X-Auth-Token: $TOKEN" \ + -H "X-Image-Meta-Store: {store_identifier}" \ + -H "Content-Type: application/octet-stream" \ + -d @/etc/glance/cirros-0.4.0-x86_64-disk.img \ +http://controller:9292/v2/images/8a37019d-3d85-416c-b903-615f437a6773/file +``` + +- Liệt kê danh sách image +```bash +[root@localhost fernet-keys]# curl -s -H "X-Auth-Token: $TOKEN" http://controller:9292/v2/images | jq +{ + "images": [ + { + "status": "active", + "name": "cirror", + "tags": [], + "container_format": "bare", + "created_at": "2018-11-05T06:47:38Z", + "size": 6472401, + "disk_format": "qcow2", + "updated_at": "2018-11-05T06:48:06Z", + "visibility": "shared", + "self": "/v2/images/8a37019d-3d85-416c-b903-615f437a6773", + "min_disk": 0, + "protected": false, + "id": "8a37019d-3d85-416c-b903-615f437a6773", + "file": "/v2/images/8a37019d-3d85-416c-b903-615f437a6773/file", + "checksum": "ec508c1e3a5399ca60ae6e6d0feefc45", + "owner": "baedd3b48fbc4134ac1eba01798addea", + "virtual_size": null, + "min_ram": 0, + "schema": "/v2/schemas/image" + } + ],image + "schema": "/v2/schemas/images", + "first": "/v2/images" +} +``` + +- Thông tin cụ thể của một image +```bash +[root@localhost fernet-keys]# curl -s -H "X-Auth-Token: $TOKEN" \ +> http://controller:9292/v2/images/8a37019d-3d85-416c-b903-615f437a6773 | jq +{ + "status": "active", + "name": "cirror", + "tags": [], + "container_format": "bare", + "created_at": "2018-11-05T06:47:38Z", + "size": 6472401, + "disk_format": "qcow2", + "updated_at": "2018-11-05T06:48:06Z", + "visibility": "shared", + "self": "/v2/images/8a37019d-3d85-416c-b903-615f437a6773", + "min_disk": 0, + "protected": false, + "id": "8a37019d-3d85-416c-b903-615f437a6773", + "file": "/v2/images/8a37019d-3d85-416c-b903-615f437a6773/file", + "checksum": "ec508c1e3a5399ca60ae6e6d0feefc45", + "owner": "baedd3b48fbc4134ac1eba01798addea", + "virtual_size": null, + "min_ram": 0, + "schema": "/v2/schemas/image" +} +``` diff --git a/Glance/4. Config.md b/Glance/4. Config.md new file mode 100644 index 0000000..d5d67c4 --- /dev/null +++ b/Glance/4. Config.md @@ -0,0 +1,76 @@ +# Tìm hiểu cấu hình cơ bản trong Glance + +## 1. Cấu hình cơ bản + +- Trong Glance có rất nhiều tập tin cấu hình cho API Server, Registry server và hàng loạt backend để lưu trữ các glance image +- Khi khởi động Glance Server , thì các file cấu hình có thể được load từ các đường dẫn sau : + - `~/.glance` + - `~/` + - `/etc/glance` + - `/etc` +- Để có thể tùy chọn được folder có thể load được các file *.conf làm các section cấu hình có thể sử dụng +```bash +glance-api --config-dir=/etc/glance/glance-api.d +``` + + +## 2. Các file cấu hình +- Trong Glance gồm các file cấu hình cơ bản sau : + - **glance-api.conf**: File cấu hình cho các API của image service. + - **glance-registry.conf**: File cấu hình cho glance image registry - nơi lưu trữ metadata về các images. + - **glance-api-paste.ini**: Cấu hình cho các API middleware pipeline của Image service + - **glance-manage.conf**: Là tệp cấu hình ghi chép tùy chỉnh. Các tùy chọn thiết lập trong tệp glance- manage.conf sẽ ghi đè lên các section cùng tên thiết lập trong các tệp glance-registry.conf và glance-api.conf. Tương tự như vậy, các tùy chọn thiết lập trong tệp glance-api.conf sẽ ghi đè lên các tùy chọn thiết lập trong tệp glance-registry.conf + - **glance-registry-paste.ini**: Tệp cấu hình middle pipeline cho các registry của Image service. + - **glance-scrubber.conf**: Tiện ích sử dụng để dọn sạch các images đã ở trạng thái **"deleted"**. Nhiều glance-scrubber có thể chạy trong triển khai, tuy nhiên chỉ có một scrubber được thiết lập để "dọn dẹp" cấu hình trong file `"scrubber.conf"`. Clean-up scrubber này kết hợp với các scrubber khác bằng cách duy trì một hàng đợi chính của các images cần được loại bỏ. Tệp `glance-scrubber.conf` cũng đặc tả cấu hình các giá trị quan trọng như khoảng thời gian giữa các lần chạy, thời gian chờ của các images trước khi bị xóa. Glance-scrubber có thể chạy theo định kỳ hoặc có thể chạy như một daemon trong khoảng thời gian dài. + - **policy.json**: File tùy chọn được thêm vào để điều khiển truy cập áp dụng với image service. Trong file này ta có thể định nghĩa các roles và policies. Đó là tính năng bảo mật trong OpenStack Glance. + + +## 3. Cấu hình LOG +- Mặc định trong GLANCE sẽ có 2 file lưu lại LOG cho dịch vụ `API Server` và `Registry Server` + - `glance-api.log`: ghi các log, warning đến truy cập và cấu hình cho API Server + - `glance-registry.log` : ghi các log, warning đến truy cập và cấu hình cho Registry Server +- Để có thể tùy chọn file LOG cho từng service có thể file cấu hình mà đến section `Default`, mà tùy chỉnh tập tin chứa LOG +``` +#log_file = +``` + + +## 4. Cấu hình Storage Backend + +- Mặc định Glance sẽ tiến hành các image tại filesystem `/var/lib/images` +- Để chỉnh sửa được backend cho GLANCE có thể chỉnh sửa `default_store` trong file `glance-api.conf` +- Hiện Glance đang hỗ trợ các backend sau để lưu trữ disk iamge : file, http, swift , rbd, sheepdog, cinder, vmware + +## 5. Cấu hình User image quota + +- Có thể cấu hình giới hạn tại section `DEFAULT` trong file cấu hình `glance-api.conf` +`#user_storage_quota = 0` +- Giá trị này xác định lượng data nhiều nhất mà user có thể lưu trữ trong hệ thống lưu trữ. (đơn vị là B, KB, MB, GB hoặc TB tương ứng cho Byte, Kilobyte, megabyte, Gigabyte và terabyte; nếu không có đơn vị thì mặc định là byte). + +## 5. Cấu hình Image Cache + +- Glance Local Cache sẽ tạo ra các bản copy của một image, cho phép mỗi API Endpoint sẽ truy cập vào một bản copy của Image trên một thời điểm. + +### 5.1. Quản lý glance image cache +- Để kích hoạt hay tắt glance cache, tiến hành cấu hình trong file `/etc/glance/glance-api.conf` + - Để kích hoạt cached đi tơi section `paste_deploy` : + ``` + [paste_deploy] + flavor = keystone+cachemanagement + ``` + - Tắt glance cache: + ``` + [paste_deploy] + flavor = keystone + ``` + +## 6. Cấu hình image format + +- Chỉnh sửa trong section `[image_format]` trong file `glance-api.conf` + +- Cấu hình các giá trị có thể được liệt kê, phân tách bởi dấu “,” + +`#container_formats = ami,ari,aki,bare,ovf,ova,docker` +- Liệt kê các container_format được hỗ trợ. + +`#disk_formats = ami,ari,aki,vhd,vhdx,vmdk,raw,qcow2,vdi,iso,ploop` diff --git a/Glance/5. Glance-Advanced.md b/Glance/5. Glance-Advanced.md new file mode 100644 index 0000000..9159a4d --- /dev/null +++ b/Glance/5. Glance-Advanced.md @@ -0,0 +1,121 @@ + +## Glance Advance + +## 1 . Instance and Image + + +- Khi một máy ảo khởi động, Image service sẽ gửi disk image đến compute node +Thông thường , Compute service sẽ gửi image indentifier tới shuleder service và gửi request đến Glance thông qua Glance API. - Tùy vào Glance Backend , Compute Node sẽ kết nối đến Image Service và truyền nhận Image +- Nếu sử dụng Object Storage Node làm glance backend , và có kết nối giữa Object storage node và compute node. Trên storage node cấu hình my_block_storage_ip để cho phép compute node và storage node kết nối với nhau +- Một số backend hỗ trợ các phương thức trực tiếp , nơi nào có request image service sẽ trả về một URL trực tiếp đến back-end storage . +- Các compoute node nếu sử dụng glance cache có nghĩa là nếu image đã được download 1 lần sẽ không download trong lần tiếp theo + + +## 2. Glance image cache + +- Việc kích hoạt Glance cache thường được khuyên khi sử dụng hệ thống lưu trữ mặc định là file, tuy nhiên nếu sử dụng Ceph RBD backend sẽ có một số khác biệt. + +- Kích hoạt glance cache dẫn tới việc tạo ra cached của image đó trong thư mục /var/lib/glance/image-cache mỗi lần boot máy ảo lên. Giả sử ta có một máy ảo với kích thước VM image là cỡ 50GB, nếu như mỗi lần boot mà lại tạo cached như vây, hệ thống lưu trữ sẽ sớm bị cạn kiệt, trừ khi ta mount thư mục /var vào một ổ lưu trữ lớn. + +- Glance API server có thể được cấu hình để có thư mục lưu trữ image cache local. Một thưc mục local image cache lưu trữ một bản copy của các image, về cơ bản điều này cho phép nhiều API server phục vụ cùng các file image giống nhau, để mở rộng khả năng phục vụ của Glance. + +- Local image cache là trong suốt với người dùng. Người dùng cuối không biết được Glance API đang chuyển các file image từ local cache hay từ hệ thống backend lưu trữ thực sự. + +- Thực hiện cấu hình glance-api hỗ trợ local image cache và sử dụng local image cache [tại đây.](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Glance/4.%20Config.md#5-c%E1%BA%A5u-h%C3%ACnh-image-cache) + + +## 3. Glance Image Signing and Verification + +### 3.1. Đặt vấn đề về bảo mật và toàn vẹn Image + +- Trước bản phát hành Liberty, không hề có phương thức nào cho các user để xác nhận rằng image họ tải lên có bị thay đổi hay không. Một image bị thay đổi có thể xảy ra trong quá trình upload từ user lên Glance hoặc Glance chuyển image tới Nova, hoặc cũng có thể do chính Glance tự mình thay đổi mà không có tác động từ phía người dùng. Một image bị thay đổi có thể chứa mã độc. Bởi vậy việc cung cấp cơ chế chữ ký số cho image và xác nhận chữ ký số cho phép user xác nhận xem image có bị thay đổi không trước khi boot image tạo máy ảo. + +- Tính năng này hỗ trợ một số trường hợp như sau: + + - Một image được kí bởi end user, sử dụng private key (hiểu là mã hóa bởi private key). Sau đó, user upload image lên Glance, cùng với chữ kí vưa tạo và public key certificate của user. Glance sử dụng thông tin này để xác thực chữ ký, và thông báo tới user nếu chữ ký có bị không xác thực. + + - Một image được tạo trong Nova, và Nova ký lên image tại request của end user. Khi image được upload lên Glance, chữ ký và public key certificate cũng được cung cấp. Glance xác nhận chữ ký trước khi lưu trữ image, và thông báo với Nova nếu sự xác thực xảy ra lỗi. + + - Một image đã được ký được yêu cầu bởi Nova, và Glance cung cấp chữ ký va public key certificate tới Nova cùng image để Nova có thể xác thực chữ ký trước khi booting image. + + +### 3.2. Quá trình xác thực chữ ký image trong Glance + +- Những phiên bản triển khai đầu tiên trong Liberty, thay đổi này sử dụng tính năng của Glance để lưu trữ metadate cân thiết cho việc ký và xác nhận image. Những thông tin này bao gồm: 1 public key certificate, và chữ ký. + +- Những tính năng này được cung cấp khi image được tạo và có thể truy cập được khi image được upload. Lưu ý rằng tính năng này chỉ hỗ trợ upload image với Glance APIv2 (và không hỗ trợ Glance APIv1); và nhiều định dạng của key và chữ ký được hỗ trợ, định dạng chữ ký cũng được lưu trữ như là một thuộc tính của image. Certificate tham chiếu được sử dụng để truy cập tới certificate từ một key manager, nới mà các certificate được lưu trữ. Certificate này được thêm vào trong key manager bởi end user trước khi upload image. Lưu ý là chữ kí được thực hiện offline. + +- Sau đây là luồng thực hiện ký và xác nhận image trong các trường hợp đề cập ở trên (Bước 1 tới Bước 10 là trường hợp user upload image lên Glance, từ Bước 11 là trường hợp Nova request image từ Glance để boot máy ảo): + + [![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Openstack/Glance/images/1.9.png)](https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Openstack/Glance/images/1.9.png) + + - **Bước 1**: User tạo image để upload lên Glance. + + - **Bước 2**: User tạo cặp key theo thuật toán mã hóa khóa công khai (khóa bất đối xứng). + + - **Bước 3**: User sử dụng các thông tin của mình để tạo certificate xác minh bản thân. + + - **Bước 4**: Ký lên image sử dụng Private Key (mã hóa image) . Chú ý bước này có sự khác biệt giữa Liberty và các bản từ Mitaka về sau: + + - _**Liberty**_: Trước khi ký lên image, dữ liệu của image sẽ được băm sử dụng thuật toán MD5. Dữ liệu của image sẽ được chia thành từng phần nhỏ rồi băm. Cuối cùng ta sẽ thu lại được một mã băm **checksum_hash** của dữ liệu image. Tiếp đó mã này sẽ được sử dụng vào thuật toán băm thứ hai là SHA-256. + + [![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Openstack/Glance/images/1.10.png)](https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Openstack/Glance/images/1.10.png) + + - _**Mitaka và các phiên bản về sau**_: Không sử dụng thuật toán MD5 để băm dữ liệu của image. Tuy nhiên dữ liệu của image sẽ bị băm một lần sử dụng thuật toán SHA-256. + + [![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Openstack/Glance/images/1.11.png)](https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Openstack/Glance/images/1.11.png) + + + Tiếp đó sử dụng Private Key đã tạo ở bước 2 để ký lên image đã bị băm. + + - **Bước 5**: Gửi Public Key certificate lên Key Manager để lưu trữ sử dụng giao diện Castellan (gửi thông tin certificate và public key), đồng thời thu lại giá trị `signature_certificate_uuid` sử dụng cho quá trình upload image và các đối tượng khác thu thập Public Key certificate sử dụng để xác thực sau này. + + - **Bước 6**: Upload Image lên Glance kèm theo các thuộc tính liên quan tới chữ ký số (các Signature metadata). Các thuộc tính này bao gồm: + + - `signature`: chính là chữ ký số ta thu được. Tùy thuộc phiên bản Liberty hay từ phiên bản Mitaka mà chữ ký số này sẽ được tạo ra khác nhau(theo giải thích ở bước 4). Với Liberty: `signature = RSA-PSS(SHA-256(MD5(IMAGE-CONTENT)))`. Với các phiên bản từ Mitaka trở đi: `signature = RSA-PSS(SHA-256(IMAGE-CONTENT))` + + - `signature_key_type`: là loại key được sử dụng để tạo chữ ký số. Ví dụ: RSA-PSS + + - `signature_hash_method`: là phương thức băm được sử dụng để tạo chữ kỹ. Ví dụ: SHA-256 + + - `signature_certificate_uuid`: chính là cert_uuid thu được ở bước 5 khi tiến hành lưu trữ certificate. + + - `mask_gen_algorithm`: giá trị này chỉ ra thuật toán tạo mặt nạ được sử dụng trong quá trình tạo ra chữ ký số. + Ví dụ: MGF1. Giá trị này chỉ sử dụng cho mô hình RSA-PSS. + + - `pss_salt_length`: định nghĩa **sal length** sử dụng trong quá trình tạo chữ ký và chỉ áp dụng cho mô hình RSA-PSS. Giá trị mặc định là `PSS.MAX_LENGTH`. + + - **Bước 7** : Glance gửi request “Public key certificate” từ Key-manager để xác nhận lại chữ ký được upload lên cùng image. (public key được dùng để giải mã chữ ký). Để làm điều này Glance phải sử dụng `signature_certificate_uuid` thu được trong quá trình tải image lên của người dùng. + + - **Bước 8** : Key-manager trả lại “Public key certificate” cho Glance. + + - **Bước 9** : Xác nhận lại chữ kí của Image: sử dụng public key thu được cùng với các signature metadata khi image được upload lên. Việc xác thực này được thực hiện bởi module `signature_utils`. + + - **Bước 10**: Lưu lại image nếu chứng thực thành công. Nếu chứng thực thất bại, Glance sẽ đưa image đó vào trạng thái `killed` và gửi thông báo lại cho người dùng kèm theo lý do tại sao image upload bị lỗi. + + - **Bước 11**: Nova gửi yêu cầu tới Glance để lấy Image và metadata để boot máy ảo. + + - **Bước 12**: Glance gửi lại Nova image kèm theo metadata để chứng thực. + + - **Bước 13**: Nova yêu cầu Public Key Certificate từ Key Manager bằng việc sử dụng `cert_uuid` tương tác với giao diện Castellan + + - **Bước 14**: Key Manager trả về Public Key Certificate lại cho Nova + + - **Bước 15**: Nova xác nhận chứng chỉ. Chức năng này được thực hiện nếu chỉnh sửa module `signature_utils` của Nova để kết hợp việc xác nhận chứng chỉ (certificate validation) vào workflow của tiến trình xác thực chữ ký(signature verification). + + - **Bước 16**: Xác thực chữ ký của image. Để làm điều này, ta phải cấu hình trong file `nova.conf` của nova, thiết lập giá trị `verify_glance_signatures = true`. Như vậy, Nova sẽ sử dụng các thuộc tính của image, bao gồm các thuộc tính cần thiết cho quá trình xác thực chữ ký image(signature metadata). Nova sẽ đưa dữ liệu của image và các thuộc tính của nó tới module `signature_utils` để xác thực chữ ký. + + - **Bước 17**: Nếu việc xác thực chữ ký thành công, nova sẽ tiến hành boot máy ảo sử dụng image đó và ghi vào log chỉ ra rằng việc xác thực chữ ký thành công kèm theo các thông tin về **signing certificate**. Ngược lại nếu xác nhận thất bại, Nova sẽ không boot image đó và lưu lại lỗi vào log. + + +## 4. Task + +- Task trong Glance bao gồm các trạng thái sau + - pending : task indentifier đang được dàng cho một task vụ khác + - processing : task đã được thực thi , đang được Glance Backend cùng các child service xử lý + - sucsess : task được thực thi hoàn tất + - failure : quá trình chạy task bị lỗi, không thể tiếp tục được tiến trình. Sẽ trả về message về error + +## 5. Tham khảo + +1:https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Openstack/Glance/docs/1.Tim_hieu_Glance_trong_Openstack.md diff --git a/Horizon/Introduction-horizon.md b/Horizon/Introduction-horizon.md new file mode 100644 index 0000000..7faac34 --- /dev/null +++ b/Horizon/Introduction-horizon.md @@ -0,0 +1,47 @@ + +# OpenStack Dashboard - Horizon + +# 1. Tổng quan về Horizon + +## 1.1. Khái niệm Horizon + +- Horizon là code-name của Openstack Dashboard , cung cấp một Web-based interface cho các Openstack Service khác nhau gồm : Nova, Swift, Keystone, etc... +- Horizon sử dụng Django Python làm việc với các API Service, sử dụng openstack indentify để authen , không sử dụng database riêng + +## 1.2 . Chức năng chính của Horzion +- Cung cấp giao diện quản lý dễ dàng +- Có thể sử dụng cho môi trường production +- Tùy chỉnh, thêm các compoment vào panel theo từng dịch vụ +- Quy trình làm việc trong suốt với người dùng +- Code-base theo hướng đối tượng, dễ phát triển + +## 1.3 . Kiếm trúc làm việc với các Service khác + +![](https://access.redhat.com/webassets/avalon/d/Red_Hat_Enterprise_Linux_OpenStack_Platform-7-Architecture_Guide-en-US/images/05df8dacdfb319319665befc022e4159/RHEL_OSP_arch_347192_1015_JCS_02_Interface-Dashboard.png) + + +## 2. Các thành phần trên Dashboard Tab + +# 2.1 . Compute Tab + +- Overview : xong báo cáo tổng quan về project +- Instance : quản lý vòng đời của các mảy ảo, kết nối máy ảo qua console +- Volume : quản lý vòng đời các volume và snapshot volume +- Image : liệt kê các image, instance snapshot, volume snapshot và quản lý vòng đời của chúng +- Access & Security : quản lý vòng đời security group, key pair, floating IP, API access request + +# 2.2. Network Tab + +- Network topology : tổng quan về mô hình mạng đang có sẵn +- networs : quản lý vòng đời các mạng ảo +- route : khởi tạo các điểm routing + +# 2.3. Identity Tab + +- **Projects** : quản lý vòng đời các project, xem thống kê của project, quản lý các user +- **Users** : quản lý user, hiển thị thông báo nếu không có đặc quyền + +# 3. Tham khảo thêm + +[1] : https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/8/html-single/introduction_to_the_openstack_dashboard/index +[2] : https://docs.openstack.org/horizon/latest/ diff --git a/Keystone/1. Introduction-Keystone.md b/Keystone/1. Introduction-Keystone.md new file mode 100644 index 0000000..b4fbd8e --- /dev/null +++ b/Keystone/1. Introduction-Keystone.md @@ -0,0 +1,128 @@ + + +# 1. Openstack Indentify ( Keystone ) + +## 1: Khái niệm Keystone + +- Keystone là OpenStack project cung cấp các dịch vụ Identity, Token, Catalog, Policy cho các project khác trong OpenStack. +- Keystone có 2 phiển bản gồm + +| V2 | V3 | +|---|---| +| sử dụng UUID | sử dụng PKI, mỗi mã thông báo đại diện cho một cặp khóa mở và đóng để xác minh chéo và xác thực. | + +- Hai tính năng chính của Keystone: + - User Management: keystone xác thực tài khoản người dùng và chỉ định xem người dùng có quyền được làm gì. + - Service Catalog: Cung cấp một danh mục các dịch vụ sẵn sàng cùng với các API endpoints để truy cập các dịch vụ đó. + - +## 2 : Cấu trúc trong Keystone + +**2.1. Project** + +- Khái niệm chỉ sự gom gộp, cô lập các nguồn tài nguyên (server, images, etc.) +- Các user được gắn role và truy cập sử dụng tài nguyên trong project +- - role để quy định tài nguyên được phép truy cập trong project (khái niệm role assignment) +- Bản thân projects không sở hữu users hay groups mà users và groups được cấp quyền truy cập tới project sử dụng cơ chế gán role. +**2.2. Domain** + - Domain là tập hợp bao gồm các user, group, project + - Phân chia tài nguyên vào các "kho chứa" để sử dụng độc lập với các domain khác + - Mỗi domain có thể coi là sự phân chia về mặt logic giữa các tổ chức, doanh nghiệp trên cloud + +**2.3. Users và User Groups** + +- User: người dùng sử dụng nguyên trong project, domain được phân bổ +- Group: tập hợp các user , phân bổ tài nguyên +- Role: các role gán cho user và user group trên các domain và project + +**2.4. Roles** + +Khái niệm gắn liên với Authorization (ủy quyền), giới hạn các thao tác vận hành hệ thống và nguồn tài nguyên mà user được phép. **Role được gán cho user và nó được gán cho user đó trên một project cụ thể. ("assigned to" user, "assigned on" project)** + +![](https://camo.githubusercontent.com/71fdb3e88830477da58ad285b43ba7b2c965c4bd/687474703a2f2f692e696d6775722e636f6d2f69596b7145354f2e706e67) +**2.5. Token** + +Token được sử dụng để xác thực tài khoản người dùng và ủy quyền cho người dùng khi truy cập tài nguyên (thực hiện các API call). +Token bao gồm: +- ID: định danh duy nhất của token trên DB +- payload: là dữ liệu về người dùng (user được truy cập trên project nào, danh mục các dịch vụ sẵn sàng để truy cập cùng với endpoints truy cập các dịch vụ đó), thời gian khởi tạo, thời gian hết hạn, etc. + +**2.6. Catalog** + +Là danh mục các dịch vụ để người dùng tìm kiếm và truy cập. Catalog chỉ ra các endpoints truy cập dịch vụ, loại dịch vụ mà người dùng truy cập cùng với tên tương ứng, etc. Từ đó người dùng có thể request khởi tạo VM và lưu trữ object. + +**2.6. Services** + +Là một dịch khác như Nova, Glance, Swift có cung cấp các endpoint cho phép người dùng truy cập, sử dụng tài nguyên + +**2.7. Openstack Client ** + +Là một command-line , bao nhiều nhiều dịch vụ gồm Indentify API, cho phép làm việc với keystone + +![](https://camo.githubusercontent.com/8a5debcf7776f4c94a8c119510ab8f74b325be3c/687474703a2f2f312e62702e626c6f6773706f742e636f6d2f2d424c456c53354c487262492f5646634f774b714e3750492f41414141414141414150772f734f692d686a34474a2d512f73313630302f6b657973746f6e655f6261636b656e64732e706e67) + + +## 2. Indentify Service + +Identity service trong keystone cung cấp các Actors. Nó có thể tới từ nhiều dịch vụ khác nhau như SQL, LDAP, và Federated Identity Providers. + +### 2.1. SQL + +- Keystone có tùy chọn cho phép lưu trữ actors trong SQL. Nó hỗ trợ các database như MySQL, PostgreSQL, và DB2. +- Keystone sẽ lưu những thông tin như tên, mật khẩu và mô tả. +- Những cài đặt của các database này nằm trong file config của keystone +- Về bản chất, Keystone sẽ hoạt động như 1 Identity Provider. Vì thế đây sẽ không phải là lựa chọn tốt nhất trong một vài trường hợp, nhất là đối với các khách hàng là doanh nghiệp +- Sau đây là ưu nhược điểm: + +Ưu điểm: +- Dễ set up +- Quản lí users, groups thông qua OpenStack APIs. + +Nhược điểm: +- Keystone không nên là một Identity Provider +- Hỗ trợ cả mật khẩu yếu +- Hầu hết các doanh nghiệp đều sử dụng LDAP server +- Phải ghi nhớ username và password. + +### 2.2. LADP +- Keystone sẽ truy cập tới LDAP như bất kì ứng dụng khác (System Login, Email, Web Application, etc.). +- Các cài đặt kết nối sẽ được lưu trong file config của keystone. Các cài đặt này cũng bao gồm tùy chọn cho phép keystone được ghi hoặc chỉ đọc dữ liệu từ LDAP. +- Thông thường LDAP chỉ nên cho phép các câu lệnh đọc, ví dụ như tìm kiếm user, group và xác thực. +- Nếu sử dụng LDAP như một read-only Identity Backends thì Keystone cần có quyền sử dụng LDAP. + +Ưu điểm: +- Không cần sao lưu tài khoản người dùng. +- Keystone không hoạt động như một Identity Provider. + +Nhược điểm: +- Keystone có thể thấy mật khẩu người dùng, lúc mật khẩu được yêu cầu authentication. + +### 2.3. Multiple Backends +- Kể từ bản Juno thì Keystone đã hỗ trợ nhiều Identity backends cho V3 Identity API. Nhờ vậy mà mỗi một domain có thể có một identity source (backend) khác nhau. +- Domain mặc định thường sử dụng SQL backend bởi nó được dùng để lưu các host service accounts. Service accounts là các tài khoản được dùng bởi các dịch vụ OpenStack khác nhau để tương tác với Keystone. +- Việc sử dụng Multiple Backends được lấy cảm hứng trong các môi trường doanh nghiệp, LDAP chỉ được sử dụng để lưu thông tin của các nhân viên bởi LDAP admin có thể không ở cùng một công ty với nhóm triển khai OpenStack. Bên cạnh đó, nhiều LDAP cũng có thể được sử dụng trong trường hợp công ty có nhiều phòng ban. + +Ưu điểm: +- Cho phép việc sử dụng nhiều LDAP để lưu tài khoản người dùng và SQL để lưu tài khoản dịch vụ +- Sử dụng lại LDAP đã có. + +Nhược điểm: +- Phức tạp trong khâu set up +- Xác thực tài khoản người dùng phải trong miền scoped + +### 2.4. Identity Providers +- Kể từ bản Icehouse thì Keystone đã có thể sử dụng các liên kết xác thực thông qua module Apache cho các Identity Providers khác nhau. +- Cơ bản thì Keystone sẽ sử dụng một bên thứ 3 để xác thực, nó có thể là những phần mềm sử dụng các backends (LDAP, AD, MongoDB) hoặc mạng xã hội (Google, Facebook, Twitter). + +Ưu điểm: + +- Có thể tận dụng phần mềm và cơ sở hạ tầng cũ để xác thực cũng như lấy thông tin của users. +- Tách biệt keystone và nhiệm vụ định danh, xác thực thông tin. +- Mở ra cánh cửa mới cho những khả năng mới ví dụ như single signon và hybrid cloud +- Keystone không thể xem mật khẩu, mọi thứ đều không còn liên quan tới keystone. + +Nhược điểm: +- Phức tạp nhất về việc setup + +## 3 . Keystone WorkFlow + +![](https://camo.githubusercontent.com/df9544d836ef42aec47fe777b7427680d7eb4453/687474703a2f2f692e696d6775722e636f6d2f566148594834382e706e67) diff --git a/Keystone/2.Install-Keystone.md b/Keystone/2.Install-Keystone.md new file mode 100644 index 0000000..dd7beaf --- /dev/null +++ b/Keystone/2.Install-Keystone.md @@ -0,0 +1,198 @@ + + +# Cài đặt và cấu hình Keystone + +# 1. Openstack Indentity Overview + +- Openstack indentity cung cấp một điểm tích hợp để xác thực, phân quyền hoặc và danh mục dịch vụ. +Openstack indentity service tường là dịch vụ đầu tiên mà người dùng tương tác đến. Mỗi khi đã xác thực, các end-user có thể sử dụng indentify token để truy cập vào các Openstack Service khác. . Tương tụ như vậy các - - Openstack service khác sử dung các indentity khác để chắc chắn rằng người dùng và quyền của người dùng đó. Indentifty serivce có thể tích hợp vào các management system khác như ( LAPD ) +- Người dùng và dịch vụ trong openstack có thể nhận dạng các Services khác qua các catalog service mà được quản trị bởi Indentity service. Catalog nắm nhiệm vụ nắm dữ danh sách serive trong quá trình deployment. Mỗi service sẽ có nhiều endpoint , các endpoint sẽ nằm trong 3 dạng sau : public, ijnternal, admin. Trong môi trường production, các endpoint sẽ nằm trên các mạng riêng biệt để bản bảo bảo mật. Ví dụ . public API có thể được tiếp cận từ môi trường internet, khác hàng có thể sử dụng sản phẩn cloud qua API này. Admin API sử dụng cho các sysadmin để quản trị infractructure cloud. Internal API sẽ sử dụng để làm việc với các host được quản lý bởi các Openstack Service +- Openstack Indentity cung cấp `region` để tăng khả năng mở rộng. Mặc định `RegionOne` được sử dụng làm Region đâu tiên +- Mỗi Openstack Service cài lên cần có một endpoint trên indentity service +- Trong Indentity gồm có 3 thành phần + - Server : một server tập trung cung cấp chức năng xác thực và phân quyền sử dụng Restful API + - Drivers : driver hoặc back-end được tích hợp vào server dùng để truy cập vào DB indentity có thể là external service hoặc các dịch vụ internal ( SQL, LADP ) + - Modules : middleware module có thể chạy trên các Openstack compoment đang sử dụng indentity services. Những module này chặn các reques , xuất ra các credential sau đó gửi đến Server . + + + +# 2. Cài đặt Openstack Queens trên Controller + +- Triển khai trên mô hình +![](![](https://i.imgur.com/ogdwTbG.png) +) + +- Cài đặt Openstack Queens và Openstack Client +``` +yum install centos-release-openstack-queens -y +yum upgrade +yum install python-openstackclient -y +``` + +- Mặc định trên Centos và RHEL đã bật `SElinux `, cài đặt `openstack-selinux` để apply các policies cho các Openstack Service +``` +yum install openstack-selinux -y + +``` +- Disable SeLinux `/etc/selinux/config` +Sau do reboot server +``` + This file controls the state of SELinux on the system. + # SELINUX= can take one of these three values: + # enforcing - SELinux security policy is enforced. + # permissive - SELinux prints warnings instead of enforcing. + # disabled - No SELinux policy is loaded. + SELINUX=disabled + # SELINUXTYPE= can take one of these two values: + # targeted - Targeted processes are protected, + # mls - Multi Level Security protection. + SELINUXTYPE=targeted + +``` + +- Cấu hình hostname resolution +``` +echo " +192.168.69.130 controller +192.168.69.131 compute1 +192.168.69.132 compute2 +" >> /etc/hosts +``` +# 3. Cài đặt Openstack Indentity - Keystone +Trong loạt bài này sẽ cài đặt Keystone trên Controller Node . Để phục vụ cho khả năng mở rộng, Fernet tokens và Apache HTTP Server sử được sử dụng + + + +## 3.1 . Chuẩn bị +- Trên hầu hết các Openstack Service đểu sử dụng SQL database để lưu thông tin. Cơ sở dữ liệu thường được chạy trên Controller Node. Trên loạt tìm hiểu này sẽ sử dụng `Mysql` và `MarriaDB` . + +- Cài đặt MarriaDB +``` +yum install mariadb mariadb-server python2-PyMySQL -y +``` + +- Cấu hình MarriaDB Server + +```bash +echo "[mysqld] +bind-address = 192.168.69.130 +default-storage-engine = innodb +innodb_file_per_table = on +max_connections = 4096 +collation-server = utf8_general_ci +character-set-server = utf8" >> /etc/my.cnf.d/openstack.cnf +``` +Trong đó : bind-address : IP của network interface management + +- Start MarriaDB và cho phép enable trong boot +``` +systemctl enable mariadb.service +systemctl start mariadb.service +``` + +- Cấu hình tài khoản root cho các Database +``` +/usr/bin/mysqladmin -u root -h localhost password 123@123Aa +``` + +## 3.2 . Cài đặt, cấu hình Keystone + + +### 3.2.1. Cài đặt, cấu hình các thành phần + +- Trước khi cài đặt Keystone, cần khởi tạo một DB riêng cho Keystone với tài khoản `root` +```bash +mysql -u root --password=123@123Aa -e "CREATE DATABASE keystone"; +mysql -u root --password=123@123Aa -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \ +IDENTIFIED BY 'keystone_123';GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \ +IDENTIFIED BY 'keystone_123';" +``` + +- Cài đặt Openstack_keystone, httpd, mod_wsgi và cấu hình ban dầu +```bash +yum install openstack-keystone httpd mod_wsgi crudini +crudini --set /etc/keystone/keystone.conf "database" "connection" "mysql+pymysql://keystone:keystone_123@controller/keystone" +crudini --set /etc/keystone/keystone.conf "token" "provider" "fernet" +su -s /bin/sh -c "keystone-manage db_sync" keystone +``` +- Khởi tạo kho lưu trữ `Fernet Token` +``` +keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone +keystone-manage credential_setup --keystone-user keystone --keystone-group keystone +``` +- Khởi động các dịch vụ trong Openstack Indentity +``` +keystone-manage bootstrap --bootstrap-password keystone_123 \ + --bootstrap-admin-url http://controller:5000/v3/ \ + --bootstrap-internal-url http://controller:5000/v3/ \ + --bootstrap-public-url http://controller:5000/v3/ \ + --bootstrap-region-id RegionOne +``` + +### 3.2.2. Cài đặt, cấu hình Apace HTTP Server + +- Cấu hình Apache Conf và enable service +```bash +ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ +systemctl enable httpd.service +systemctl start httpd.service +``` + + +### 3.2.3 . Set biến môi trường cho tài khoản admin + +**Sử dụng password được sử dụng trong quá trình cài đặt cho tài khoản `admin`** + +```bash +echo " +export OS_USERNAME=admin +export OS_PASSWORD=keystone_123 +export OS_PROJECT_NAME=admin +export OS_USER_DOMAIN_NAME=Default +export OS_PROJECT_DOMAIN_NAME=Default +export OS_AUTH_URL=http://controller:5000/v3 +export OS_IDENTITY_API_VERSION=3 " > admin-openrc +. admin-openrc +``` +- Kiểm tra authentication token: + +``` +[root@localhost my.cnf.d]# openstack token issue ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Field | Value | ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| expires | 2018-10-19T11:48:31+0000 | +| id | gAAAAABbybZ_QDUHiAbszPy2R0fG0bsCJ5Lb38zjUXSkBFiaPXstEUKGipLLvp5U4OB0UKWRRNjTHgLPPnggOP3_n9wJJCPYpy9Oitml1DYJZ-i0TBgr_CU7HU7-IpttwtKW3ywaksEyqrkaKEOpdgCe6KREkFY_qDaQ60gBZx2E9uC9EVGXjPE | +| project_id | baedd3b48fbc4134ac1eba01798addea | +| user_id | b495617610354ec08b6d9512e31d93eb | ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +``` + +- Cấu hình FirewallD +``` +firewall-cmd --add-port=5000/tcp --permanent +firewall-cmd --add-port=35357/tcp --permanent + +firewall-cmd --reload +``` + +## 3.3 . Khởi tạo Project cho các Openstack Service khác + + +``` +[root@localhost my.cnf.d]# openstack project create --domain default --description "Service Project" service ++-------------+----------------------------------+ +| Field | Value | ++-------------+----------------------------------+ +| description | Service Project | +| domain_id | default | +| enabled | True | +| id | 2f6d32f44a074bcab270084b989c2fd2 | +| is_domain | False | +| name | service | +| parent_id | default | +| tags | [] | ++-------------+----------------------------------+ + +``` diff --git a/Keystone/3. Architecture-Keystone( additional ).md b/Keystone/3. Architecture-Keystone( additional ).md new file mode 100644 index 0000000..b8bc538 --- /dev/null +++ b/Keystone/3. Architecture-Keystone( additional ).md @@ -0,0 +1,11 @@ + + + +# 1. Kiến trúc trong Keystone ( bổ sung ) + +- Keystone được xem là một giao diện HTTP cho nhiều service khác. . Giống như các service khác, keystone được xây dựng từ WSGI,. Những endpoint của Keystone được xây dựng bởi pipeline của WSGI middeware + +- Mỗi một services có thể cấu hình một backen để cho phép keystone có thể làm việc với các môi trường, mục đích khác nhau +- Keystone được phát triển để đảm nhiệm nhiều nhiệm vụ với nhiều phần bỗ trợ khác nhau. Như vật nhiều phương thức và kiểu dữ liệu sẽ được diễn ra trong quá trình làm việc để làm việc với backend. Một data-model cho phép tạo liên kết giữa các bảng. +- Service trong hệ thống sẽ có các action khác nhau, có thể dùng `## Policy` để kiếm soát user có thể thực hiện hành động đó không không +- Có thể đưa ra một list rule hướng kiểm tra, chỉ cần xác minh các credintal đúng yêu cầu thì sẽ được cấp quyền thực hiện. diff --git a/Keystone/4. Config-Keystone.md b/Keystone/4. Config-Keystone.md new file mode 100644 index 0000000..b3fbb96 --- /dev/null +++ b/Keystone/4. Config-Keystone.md @@ -0,0 +1,141 @@ + + + + + +## 1. Cấu trúc file cấu hình + +- Openstack chủ yếu sử dụng các cặp gía trị `key` = `value` cho các section trong file cấu hình . +- Các options có thể có các giá trị khác nhau, dưới đây là các loại thường được sử dụng bởi OpenStack: + +- `boolean` : Giá trị cho phép lựa chọn là `true` và `fale`. + +- `float` : Số thực (ví dụ 0.25 hoặc 1000) + +- `interger` : số nguyên + +- `list` : danh sách các values được phân tách nhau bởi dấu phẩy + +- `muilti valued` : là một string value và có thể gán nhiều hơn 1 giá trị, tất cả sẽ đều được sử dụng. + +- `string` : có thể có hoặc không đặt trong dấu `""` hoặc `''` + + +- **Section** + +Các tùy chọn cài đặt được nhóm lại thành các section. Thông thường hầu hết các file config của OpenStack đều có 2 section [DEFAULT] và [database] + +- **Substitution** + +File config hỗ trợ variable substitution. Sau khi thiết lập, tùy chọn cấu hình đó có thể được dùng lại trong các giá tùy chọn khác bằng cách thêm dấu `$`, ví dụ như `rabbit_hosts = $rabbit_host:$rabbit_port` + +Để tránh substitution, dùng `$$`. Ví dụ `ldap_dns_password = $$xkj432` + +- **Whitespace** + +Để sử dụng khoảng trắng trong phần value, sử dụng dấu nháy đơn `''`. Ví dụ: `ldap_dns_passsword='a password with spaces'` + + +## 2. Default Section + +| [#]Key = Default Value | Description | +|-------------------------|------------ +|#admin_token = None | không được khuyến nghị sử dụng. Sử dụng đoạn mã này có thể dùng để khởi động Keystone thông qua API . Token này không thuộc về một user cụ thể , đây là một hình thức bypass hầu như các phần kiểm tra ủy quyền| +|#public_endpoint = None| cung cấp một URL API endpoint cho các Client. Nên cấu hình một URL không trungf với các endpoint path default hoặc endpoint đang sử dụng ở một host khác | +|#admin_endpoint = None| cung cấp thêm một URL API endpoint co các Client. Nên cấu hình một URL không trungf với các endpoint path default hoặc endpoint đang sử dụng ở một host khác| +|#max_project_tree_depth = 5| Giới hạn số lần phân cấp trong một project | +|#max_param_size = 64| Giới hạn ký tự của ID và Name trong user và group| +|#max_token_size = 255| Giới hạn chiều dài của Token, với Fermet token 255 , UUID là 32| +|#member_role_id = 9fe2ff9ee4384b1894a90878d3e92bab| Găn quyền mặc định cho các user cho API v2 ( API V2 không còn hỗ trợ ) | +|#member_role_name = _member_ | Găn quyền mặc định cho các user cho API v2 ( API V2 không còn hỗ trợ ) | +|#crypt_strength = 10000| Sử dụng hàm mã hóa băm passlib| +|#list_limit = None| Số lượng các user và group được lưu tối đa| +|#strict_password_check = false | Kiểm tra pasword khi gửi request đến, nếu set `True` khi password gửi đến qua ký tự đối đa sẽ trả status `403`| +|#secure_proxy_ssl_header = HTTP_X_FORWARDED_PROTO| sử dụng HTTP cho các request | +|#insecure_debug = false| Cung cấp bổ sung thông tin để phục vụ debug trong các HTTP Response| +|#default_publisher_id = None|Cung cấp host để đẩy các thông báo, mặc định là server name | + + +## 3. oslo.log section + +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#debug = false| Nếu enable chức năng này LOG sẽ được chuyển sang mode DEBUG| +|#log_config_append = None| Chỉ định file chứa log | +|#log_date_format = %Y-%m-%d %H:%M:%S |Chỉ định format thời gian trong log| +|#log_dir = None| Chỉ định folder chứa LOG, sẽ được bỏ qua nến đã enable log_config_append| +|#use_syslog = false | Sử dụng syslog `/var/syslog.txt` để làm file lưu log | +|#use_journal = false | sử dụng journal để lưu log| +|#use_json = false| sử dụng JSON Format để lưu log|| + +## 4. catalog section + +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#template_file = default_catalog.templates| chỉ định file làm catalog template | +|#driver = sql| chỉ định SQL backen làm catalog entry | +|#caching = true | lưu cache các catalog | +|#cache_time = None | thời gian lưu cache tối đa | +|#list_limit = None | Số endpoint giới hạn trên mỗi catalog| + + +## 5. credential section +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#driver = sql| Entry point cho các Credential| +|#provider = fernet | Entry point cho các thuật toán mã hóa và giải mã| +|#key_repository = /etc/keystone/credential-keys/| Folder chưa các keys cho việc mã hóa, giải mã trong credential backen. Fernet key cho encrypt credentials và Fernet key cho encrypt Fermet key không liên quan đến nhau | + +## 6. database section + +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#connection = None| định nghĩa kết nối tới DB | +|#backend = sqlalchemy | backend sử dụng cho DB| +|#slave_connection = None| Định nghĩa một DB Slave | +|#use_db_reconnect | Thử kết nối lại khi không kết nối được đến DB | + +## 7. domain_config section + +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#driver = sql| Chỉ hỗ trợ SQL để entry point cho các domain config| +|#caching = true | Thời gian để lưu cache domain dataconfig| + + +## 8. endpoint_filter và endpoint_policy section +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#driver = sql| Entry point cho các endpoint filter , chỉ hỗ trợ SQL | + + +## 9. Fernet tokens section +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#key_repository = /etc/keystone/fernet-keys/| thư mục chưa Fernet token keys | +|#max_active_keys | số lượng key có thể active trên một thời điểm | + + +## 10. identity section + + +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#default_domain_id = default| Domain mặc dịnh lắng nghe các API v2 request Identity | +|#domain_config_dir = /etc/keystone/domains|Đường dẫn cho Keystone lưu domain configuration files nếu domain_specific_drivers_enabled được thiết lập là true| +|#driver = sql | Entry point cho the identity backend| +|#max_password_length = 4096| độ dài cho phép tối đa của user pasword | +|#password_hash_algorithm = bcrypt| hàm băm được sử dụng cho password| + +## 11. memcache section + +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#dead_retry = 300 | số giây thử để chắc chắn memcached server | +|servers = *:11211 | Memcache servers | + +## 12. policy section +| [#]Key = Default Value | Description | +|-------------------------|------------| +|#driver = sql| Entry point cho policy backend driver|\ +|#list_limit = None| số lượng thực thể tối đa cho policy collection. | diff --git a/Keystone/5. Keystone-Openstack-CLI.md b/Keystone/5. Keystone-Openstack-CLI.md new file mode 100644 index 0000000..b4b5114 --- /dev/null +++ b/Keystone/5. Keystone-Openstack-CLI.md @@ -0,0 +1,181 @@ + +# Làm việc với Keystone qua CLI + + +## 1. Khởi tạo Token + +- Để làm việc với Keystone hoặc các service sử dụng Keystone làm Indentity Service cần khai báo các thông tin để xin credential +```bash +echo " +export OS_USERNAME=admin +export OS_PASSWORD=keystone_123@123Aa +export OS_PROJECT_NAME=admin +export OS_USER_DOMAIN_NAME=Default +export OS_PROJECT_DOMAIN_NAME=Default +export OS_AUTH_URL=http://controller:5000/v3 +export OS_IDENTITY_API_VERSION=3 " > admin-openrc +. admin-openrc +``` + +- Sau khi thực hiện xong biến mối trương, kiểm tra token đã được cấp +``` +[root@localhost ~]# openstack token issue ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Field | Value | ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| expires | 2018-10-21T08:33:21+0000 | +| id | gAAAAABbzCvBtoTTuaE7Rr2KBCeA2q2VsCUyNUo8l_LsYZpU5QU5ISBaiCkU7G3hZpCUNRbaN19vBV28P51Xjykm9rxnMVsEKAT-rabcZgtejlYCgwxSCdR4wkQWR7FayPWqVVGlkeT9Gvm-HZAgARV3XnlGlthmqwRqeS7xYfNfJBZBCmt6kqc | +| project_id | baedd3b48fbc4134ac1eba01798addea | +| user_id | b495617610354ec08b6d9512e31d93eb | ++------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + +- Khi người dùng được xác thực, một token được gửi đến và ủy quyền để được tác động đến các Service khác . Mã token có thể biến đổi; tuy nhiên giá trị mặc định cho hết hạn là một giờ. Trước khi task hòan thành mà token hết hạn thì có thể bị ngừng tác tác động tiếp theo đến các service + + +## 2. Quản lý User + +- Khởi tạo một user `nguyenhungsync` +```bash +[root@localhost ~]# openstack user create --password 123@123Aa --email 123@123Aa@gmail.com nguyenhungsync ++---------------------+----------------------------------+ +| Field | Value | ++---------------------+----------------------------------+ +| domain_id | default | +| email | 123@123Aa@gmail.com | +| enabled | True | +| id | c7e3e4fd12114402916d6afa056303e7 | +| name | nguyenhungsync | +| options | {} | +| password_expires_at | None | ++---------------------+----------------------------------+ +``` + +- Khởi tạo một project trên `customer` + +```bash +[root@localhost ~]# openstack project create --domain default customer ++-------------+----------------------------------+ +| Field | Value | ++-------------+----------------------------------+ +| description | | +| domain_id | default | +| enabled | True | +| id | 816290ab5cd6488ebf3f92940b223b56 | +| is_domain | False | +| name | customer | +| parent_id | default | +| tags | [] | ++-------------+----------------------------------+ +``` + +- Khởi tạo một role mới +``` +[root@localhost ~]# openstack role create compute-customer + +-----------+----------------------------------+ +| Field | Value | ++-----------+----------------------------------+ +| domain_id | None | +| id | efeb7cfca58a48dc838fa9be0eda0130 | +| name | compute-customer | ++-----------+----------------------------------+ + +``` + +- Gắn role `compute-customer` vào user `nguyenhungsync` trong project `customer` + +``` +[root@localhost ~]# openstack role add --project customer --user nguyenhungsync compute-customer + +[root@localhost ~]# openstack role list --user nguyenhungsync --project customer +Listing assignments using role list is deprecated. Use role assignment list --user --project --names instead. ++----------------------------------+------------------+----------+----------------+ +| ID | Name | Project | User | ++----------------------------------+------------------+----------+----------------+ +| efeb7cfca58a48dc838fa9be0eda0130 | compute-customer | customer | nguyenhungsync | ++----------------------------------+------------------+----------+----------------+ + +``` + +- Kiểm tra status project +```bash +root@localhost ~]# openstack project show customer ++-------------+----------------------------------+ +| Field | Value | ++-------------+----------------------------------+ +| description | | +| domain_id | default | +| enabled | True | +| id | 816290ab5cd6488ebf3f92940b223b56 | +| is_domain | False | +| name | customer | +| parent_id | default | +| tags | [] | ++-------------+----------------------------------+ +``` + +## 3. Quản lý Service và Service User + +- Liệt kê danh sách các service +```bash + +[root@localhost ~]# openstack service list ++----------------------------------+----------+----------+ +| ID | Name | Type | ++----------------------------------+----------+----------+ +| 38481698c0ea4af2ad8101db59c14578 | keystone | identity | ++----------------------------------+----------+----------+ +``` + +- Khởi tạo một service cho `nova` +```bash +[root@localhost ~]# openstack service create --name nova --descript Compute-Service compute ++-------------+----------------------------------+ +| Field | Value | ++-------------+----------------------------------+ +| description | Compute-Service | +| enabled | True | +| id | 5df98434b3c44abab4fc96cf48d66376 | +| name | nova | +| type | compute | ++-------------+----------------------------------+ +``` + +- Khởi tạo một project cho các service user +```bash +[root@localhost ~]# openstack project create service --domain default ++-------------+----------------------------------+ +| Field | Value | ++-------------+----------------------------------+ +| description | | +| domain_id | default | +| enabled | True | +| id | 4f8df1897b004ca09b42f22788ea2516 | +| is_domain | False | +| name | service | +| parent_id | default | +| tags | [] | ++-------------+----------------------------------+ +``` + +- Khởi tạo user cho service `nova` +```bash +[root@localhost ~]# openstack user create nova --password nova_123@123Aa --des Nova_User ++---------------------+----------------------------------+ +| Field | Value | ++---------------------+----------------------------------+ +| description | Nova_User | +| domain_id | default | +| enabled | True | +| id | d1b68aca653e4a3cbb8f04a5b5aca993 | +| name | nova | +| options | {} | +| password_expires_at | None | ++---------------------+----------------------------------+ +``` + +- Gắn quyền admin cho `nova` để có thẻ full access khi làm việc với các service khác +```bash +[root@localhost ~]# openstack role add --project service --user nova admin + +``` diff --git a/Keystone/6. Keystone-CURL.md b/Keystone/6. Keystone-CURL.md new file mode 100644 index 0000000..c2cecda --- /dev/null +++ b/Keystone/6. Keystone-CURL.md @@ -0,0 +1,273 @@ + +# 1. Application Credentials +-Người dùng có thể tạo ra các thông tin xác thực để cho phép các ứng dụng của họ có thể xác thực với keystone. Người dùng có thể có thể ủy nhiệm các quyền con của người dùng trên một project cho các application credential, cung cấp cho ứng dụng quyền để access tới một project. +- Với application credential , các ứng dụng có thể xác thực bằng APP ID và screet string không sử dụng user và password để xác thực . +- Khởi tạo một credential cho việc monitoring + + +# 2. Curl API + +- Sử dụng CURL đẻ lấy token có giới hạn trong phạm vi `project` , có thể giới hạn trọng `domain` hoặc không được khoanh vùng ( không có quyền thực thi ) +```bash +curl -i \ +-H "Content-Type: application/json" \ +-d ' +{ "auth": { +"identity": { +"methods": ["password"], +"password": { +"user": { +"name": "admin", +"domain": { "id": "default" }, +"password": "keystone_123@123Aa" +} +} +}, +"scope": { +"project": { +"name": "admin", +"domain": { "id": "default" } +} +} +} +}' \ +"http://localhost:5000/v3/auth/tokens" ; echo +``` +Token được trả về HTTP Response : `X-Subject-Token` +``` +HTTP/1.1 201 Created +Date: Fri, 02 Nov 2018 07:36:03 GMT +Server: Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5 +X-Subject-Token: gAAAAABb2_5k-3Hnw3Iz-ETfK8ObeMmy7iWNU0pDGE_n27GEOCOTCYtCOfnwjiCx9KyAR78JdMc4U31Q9CcpIyK2VggVslOXHIM5W5tuc5ZaCynoJ6f88sDSitZ1h2w_Ib-SEEyXvoXzxqHe_JZmBeXa3puGHA0XMD12_62pckgg2pETmqIzQgs +Vary: X-Auth-Token +x-openstack-request-id: req-23e16631-11d4-4612-82de-da17bc01a4c6 +Content-Length: 1299 +Content-Type: application/json + + +``` + + +``` +{ + "token": { + "is_domain": false, + "methods": ["password"], + "roles": [ { + "id": "71361dfdcc4c4f148ecb3c5918987041", "name": "admin" + } + ], + "expires_at": "2018-11-02T10:25:32.000000Z", + "project": { + "domain": { + "id": "default", "name": "Default" + } + , + "id": "baedd3b48fbc4134ac1eba01798addea", + "name": "admin" + } + , + "catalog": [ { + "endpoints": [ { + "region_id": "RegionOne", "url": "http://controller:5000/v3/", "region": "RegionOne", "interface": "internal", "id": "4237a9ae2c2242f0ab65278637d3dafe" + } + , + { + "region_id": "RegionOne", "url": "http://controller:5000/v3/", "region": "RegionOne", "interface": "admin", "id": "5f5e989d069a4a918729480fc2e569f2" + } + , + { + "region_id": "RegionOne", "url": "http://controller:5000/v3/", "region": "RegionOne", "interface": "public", "id": "a8581cbcb5734f46aba679af5fc40460" + } + ], + "type": "identity", + "id": "38481698c0ea4af2ad8101db59c14578", + "name": "keystone" + } + , + { + "endpoints": [], "type": "compute", "id": "50da716315c24213957835e38fd30cfc", "name": "Compute-Service" + } + , + { + "endpoints": [], "type": "compute", "id": "5df98434b3c44abab4fc96cf48d66376", "name": "nova" + } + ], + "user": { + "password_expires_at": null, + "domain": { + "id": "default", "name": "Default" + } + , + "id": "b495617610354ec08b6d9512e31d93eb", + "name": "admin" + } + , + "audit_ids": ["2MzOxAJfTPmjlUunby1l9Q"], + "issued_at": "2018-11-02T09:25:32.000000Z" + } +} +``` +Qua `issued_at` và `expires_at` ta có thể nhận thấy token trong openstack mặc định có hiệu lực trong 1 tiếng + +- Sau khi có Token, có thể export thành một biến môi trường để có làm `header "X-Auth-Token"` cho các request khác +```bash +[root@localhost fernet-keys]# export TOKEN=ETfK8ObeMmy7iWNU0pDGE_n27GEOCOTCYtCOfnwjiCx9KyAR78JdMc4U31Q9CcpIyK2VggVslOXHIM5W5tuc5ZaCynoJ6f88sDSitZ1h2w_Ib-SEEyXvoXzxqHe_JZmBeXa3puGHA0XMD12_62pckgg2pETmqIzQgs +root@localhost ~]# curl -X GET -i \ +> -H "X-Auth-Token: $TOKEN" \ +> -H 'content-type: application/json' \ +> http://localhost:5000/v3/users +HTTP/1.1 200 OK +Date: Fri, 02 Nov 2018 08:02:18 GMT +Server: Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5 +Vary: X-Auth-Token +x-openstack-request-id: req-4ebd430a-1f91-428d-8dd4-05977c4f139e +Content-Length: 1190 +Content-Type: application/json + +``` + +- Danh sách User được trả về +```json +{ + "users": [ + { + "name": "nguyenhungsnc", + "links": { + "self": "http://192.168.30.130:5000/v3/users/28c4fb726eea4e1cb13d4e19215f8ecf" + }, + "domain_id": "default", + "enabled": true, + "options": {}, + "id": "28c4fb726eea4e1cb13d4e19215f8ecf", + "email": "123@123Aa@gmail.com", + "password_expires_at": null + }, + { + "password_expires_at": null, + "name": "admin", + "links": { + "self": "http://192.168.30.130:5000/v3/users/b495617610354ec08b6d9512e31d93eb" + }, + "domain_id": "default", + "enabled": true, + "id": "b495617610354ec08b6d9512e31d93eb", + "options": {} + }, + { + "name": "nguyenhungsync", + "links": { + "self": "http://192.168.30.130:5000/v3/users/c7e3e4fd12114402916d6afa056303e7" + }, + "domain_id": "default", + "enabled": true, + "options": {}, + "default_project_id": "816290ab5cd6488ebf3f92940b223b56", + "id": "c7e3e4fd12114402916d6afa056303e7", + "email": "123@123Aa@gmail.com", + "password_expires_at": null + }, + { + "description": "Nova_User", + "name": "nova", + "domain_id": "default", + "enabled": true, + "links": { + "self": "http://192.168.30.130:5000/v3/users/d1b68aca653e4a3cbb8f04a5b5aca993" + }, + "options": {}, + "id": "d1b68aca653e4a3cbb8f04a5b5aca993", + "password_expires_at": null + } + ], + "links": { + "self": "http://192.168.30.130:5000/v3/users", + "previous": null, + "next": null + } +} +``` + + +- Liệt kê danh sách Project +```bash +[root@localhost ~]# curl -s -H "X-Auth-Token: $TOKEN" \ +> http://localhost:5000/v3/projects | python -mjson.tool +{ + "links": { + "next": null, + "previous": null, + "self": "http://localhost:5000/v3/projects" + }, + "projects": [ + { + "description": "", + "domain_id": "default", + "enabled": true, + "id": "4f8df1897b004ca09b42f22788ea2516", + "is_domain": false, + "links": { + "self": "http://localhost:5000/v3/projects/4f8df1897b004ca09b42f22788ea2516" + }, + "name": "service", + "parent_id": "default", + "tags": [] + }, + { + "description": "", + "domain_id": "default", + "enabled": true, + "id": "816290ab5cd6488ebf3f92940b223b56", + "is_domain": false, + "links": { + "self": "http://localhost:5000/v3/projects/816290ab5cd6488ebf3f92940b223b56" + }, + "name": "customer", + "parent_id": "default", + "tags": [] + }, + { + "description": "Bootstrap project for initializing the cloud.", + "domain_id": "default", + "enabled": true, + "id": "baedd3b48fbc4134ac1eba01798addea", + "is_domain": false, + "links": { + "self": "http://localhost:5000/v3/projects/baedd3b48fbc4134ac1eba01798addea" + }, + "name": "admin", + "parent_id": "default", + "tags": [] + } + ] +} + +``` + +- Danh các API v3 được lưu tại `https://developer.openstack.org/api-ref/identity/v3/?expanded=list-domains-detail` + +- Khởi tạo một project mới + +``` bash +curl -i -H "X-Auth-Token: $TOKEN" \ + +-H "Content-Type: application/json" \ + +-d '{ + +"project": { + +"description": "New Project", + +"domain_id": "default", + +"enabled": true, + +"is_domain": false, + +"name": "testproject" + +}}' \ + +http://localhost:5000/v3/projects | pytohn -mjson.tool +``` diff --git a/Keystone/7. Token-Keystone.md b/Keystone/7. Token-Keystone.md new file mode 100644 index 0000000..378f68e --- /dev/null +++ b/Keystone/7. Token-Keystone.md @@ -0,0 +1,108 @@ + + + +# Tìm hiểu Token trong Openstack + + +## 1. Cơ bản về Keystone Token + +- Token được sử dụng trong Keystone để xác thực và ủy quyền cho phép các tương tác của người dùng tới các API endpoint. Token có nhiều loại đại diện cho nhiều kiểu xác thực và nhận dạng . Có rất nhiều `token provider` mỗi provider có đặc tính rieeng cho quá trình phát triển +- Token có thể dùng để thực hiện ủy quyền trên nhiều phạm vi khác nhau . Người dùng sẽ có mỗi đặc quyền riêng bởi các role, trên các project và domain . Mỗi phạm vi sẽ ảnh hưởng đến các service nằm trong phạm vi đó . + - Unscoped token không tác động đến service , catalog, project, domain . Khi sử dụng unscoped token thì chỉ mang tính đạng danh, không được tương tác với các compoment khác + - Project-scoped token : được sử dụng để có thể tác động tới các serivce khác. Chúng chưa các catalog , role và các thông tin của project và được ủy quyền + - Domain-scoped token : được sủ dụng ít, có thể làm việc tới các đối tưowngj dưới domain, + + +## 2. Token Provider +Token provider trong keystone được cấu hình tại `/etc/keystone/keystone.conf`. Hiện tại có 4 kiểu token provider hỗ trợ : `UUID` `fernet` , ``PKI ``và ``PKIZ`` + +![](https://camo.githubusercontent.com/b15a8e105a082c411ed74fb87f2ca6123bdead67/687474703a2f2f692e696d6775722e636f6d2f55764359474d342e706e67) + +## 2.1 : UUID +- Kích thước nhỏ gọn, là chuỗi ngẫu nhiên 32 ký tự +- Tạo nên từ các chỉ số hệ thập lục phân +- Tokens URL thân thiện và an toàn khi gửi đi trong môi trường non-binary. +- Lưu trữ trong hệ thống backend (như database) bề vững để sẵn sàng cho mục đích xác thực +- UUID không bị xóa trong hệ thống lưu trữ nhưng sẽ bị đánh dấu là "revoked" (bị thu hồi) thông qua DELETE request với token ID tương ứng. +- UUID không mang thông tin gì về User. Keystone phải thực hiện việc xác thực token và lưu trữ, với kích thước của hệ thống mở rộng hơn thì hiệu xuất của Keystone sẽ bị ảnh hưởng. + +- Workflow tạo UUID token diễn ra như sau: + - User request tới keystone tạo token với các thông tin: user name, password, project name + - Chứng thực user, lấy User ID từ backend LDAP (dịch vụ Identity) + - Chứng thực project, thu thập thông tin Project ID và Domain ID từ Backend SQL (dịch vụ Resources) + - Lấy ra Roles từ Backend trên Project hoặc Domain tương ứng trả về cho user, nếu user không có bất kỳ roles nào thì trả về Failure(dịch vụ Assignment) + - Thu thập các Services và các Endpoints của các service đó (dịch vụ Catalog) + - Tổng hợp các thông tin về Identity, Resources, Assignment, Catalog ở trên đưa vào Token payload, tạo ra token sử dụng hàm uuid.uuid4().hex + - Lưu thông tin của Token và SQL/KVS backend với các thông tin: TokenID, Expiration, Valid, UserID, Extra + +## 2.2. PKI và PKIZ Token + +PKI token chứa toàn bộ thông tin xác thực nhận được từ Keystone. Điều này có nghĩa là token chứa lượng lớn các thông tin: như là thời gian cấp phát, thời gian hết hạn, định danh user, thông tin project, domain và role cho user, catalog dịch vụ, và nhiều thông tin khác. Chính vì mang quá nhiều thông tin nên nó lại là điểm yếu của loại token này vì khi hệ thống được mở rộng các thông tin user và catalog càng nhiều trong khi đó HTTP Header chỉ giới hạn 8KB. + +Để khác phục điều này thì Openstack cũng đưa ra một loại token PKIZ với khả năng nén token xuống kích thước tối thiểu. Mặc dù đã được nén nhưng PKIZ vẫn bị cộng đồng Openstack đánh giá là kích thước quá lớn. Ưu điểm của loại token này là các OpenStack services có thể cache lại token này để đưa ra quyết định ủy quyền mà không phải liên hệ lại keystone nên đã giải quyết được vấn đề tắc nghẽn cổ chai của UUID token. + +### 2.1. Quá trình sinh token PKI và PKIZ + +![](https://techvccloud.mediacdn.vn/2018/1/Token-Type-4.png) + +Cũng giống như UUID token với PKI và PKIZ token thì User cần gửi các thông tin để Keystone xác thực và cấp token, nhưng có một điểm khác là loại token này sử dụng hệ mật mã khóa bất đối xứng tức là dùng khóa Private Key của keystone để mã hóa Payload token, khi user sử dụng token này thì các service trong Openstack sẽ sử dụng Public Key để giải mã và lấy ra các thông tin. Các bước khởi tạo token PKI được thể hiện rất rõ ở hình ảnh trên. + +### 2.2. Quá trình validate và thu hồi PKI và PKIZ token + +![](https://techvccloud.mediacdn.vn/2018/1/Token-Type-5.png) + +Quá trình này hoàn toàn tương tự vơi UUID token. Quá trình thu hồi cũng hoàn toàn tương tự UUID token. + +## 2.3 : Fernet + +### 2.3.1 . Cơ bản về fernet +- Fernet token được sử dụng đầu tiền tại Openstack Kilo . Không giống như các loại token khác fernet không yêu cầu sử dụng backend +- Fernet token chưa một số lượng dữ liệu nhận dạng và ủy quyền trong [MessagePacked](http://msgpack.org/) . Payload sẽ đóng gói các Fernet token . Dữ liệu trong Fernet token được bảo vệ bởi các thuật toán mã hóa đối xứng hoặc 2 fernet key + + +### 2.3.2 . Fernet key là gì ? +- Fernet key được dùng trong việc mã hóa và giải mã các Fernet token. Trong mỗi kernet key bao gồm 2 khóa hỏ hơn : a 128-bit AES256 encryption key và . 128-bit SHA256 HMAC signing key . Fernet key được lưu tại key respo mà payload có thể chuyển đến thư viện xử lý mã hóa và giải mã mã token +- Fernet sẽ đến thư mục chứa các key, thực hiện tất cả mã hóa bằng cách sử dụng khóa đầu tiên trong danh sách và cố gắng giải mã bằng tất cả các khóa từ danh sách đó. Keystone fernet token trông giống như sau: + +``` +gAAAAABWHXT73mGHg90PE6rmS-6aeYYvdErvO1RCWbDBrM5JV6L-eGEkz9cv8598DWWF5LZH5buzYM6PmUk3w9PHd4j6zs9L0_nvqZAGOrA4gLjhE10MLk00_Qy-IIPMQ6kxjsphYVLP1uBUNyh-s4hq76-KGNUqAcYgLyN8DtgoifDseSZKNl8 + +``` +### 2.3.3 . Fernet key repo +- Key repo là yêu cầu tối thiểu để khởi tạo một fernet token. Những key được lưu trong repo nhăm mục đích mã hóa và giải mã trong quá trình đóng gói fernet token .Mỗi key trong repo có thể có một trong ba trạng thái. Trạng thái của khóa xác định cách keystone sử dụng fernet token. Các loại khác nhau như sau: + + - Loại 1 - Primary Key: sử dụng cho cả 2 mục đích mã hóa và giải mã fernet tokens. Các key được đặt tên theo số nguyên bắt đầu từ 0. Trong đó Primary Key có chỉ số cao nhất. + + - Loại 2 - Secondary Key: chỉ dùng để giải mã. -> Lowest Index < Secondary Key Index < Highest Index + + - Loại 3 - Stagged Key: tương tự như secondary key trong trường hợp nó sử dụng để giải mã token. Tuy nhiên nó sẽ trở thành Primary Key trong lần luân chuyển khóa tiếp theo. Stagged Key có chỉ số 0 +-- Fernet Keys được lưu tại `/etc/keystone/fernet-keys/` +![](https://camo.githubusercontent.com/b48b918b6fba34e75082c704b83efe27c9af896c/687474703a2f2f696d6775722e636f6d2f736962475232522e706e67) + + +### 2.3.4 :Fernet Key Rotation +- Bước đầu chưa có key repo sẽ khởi tạo một key repo bằng `keystone-manager` để tạo 2 khóa trong repo. Khi 2 file được tạo thì sẽ có file tên 1 sẽ là primary key , và file 0 sẽ là staged key và không có một secondary key +- Xem đây là lần đầu xoay vòng , hiện tại đã có 2 file 0, 1 nên index tiếp theo sẽ là 2 . Fernet repo thực hiện , staged key ( 0 ) sẽ trở thành primary key với tên file 2 . và primary key (1 ) sẽ trờ thành secondary file. và thêm mới một strage với tên file là 0 +- Trong lần xoay tiếp theo, index lớn nhất sẽ là 3 , staged key ( 0 ) sẽ trở thành primary key với file 3 , primary key ( 2 ) sẽ trở thành secondary ( 2 ) + + +### 2.3.5.Token Generation Workflow + +[![](https://camo.githubusercontent.com/832a7ee3b895c3ab77254cd8a525af8fd13e6e17/687474703a2f2f696d6775722e636f6d2f535273394c414c2e706e67)](https://camo.githubusercontent.com/832a7ee3b895c3ab77254cd8a525af8fd13e6e17/687474703a2f2f696d6775722e636f6d2f535273394c414c2e706e67) + +### 2.3.6.Token Validation Workflow + +[![](https://camo.githubusercontent.com/b8884cd51610b49b38647194da76097f4d17593f/687474703a2f2f696d6775722e636f6d2f6d3273435835702e706e67)](https://camo.githubusercontent.com/b8884cd51610b49b38647194da76097f4d17593f/687474703a2f2f696d6775722e636f6d2f6d3273435835702e706e67) + +- Gửi yêu cầu xác thực token với phương thức: GET v3/auth/tokens +- Khôi phục lại padding, trả lại token với padding chính xác +- Decrypt sử dụng Fernet Keys để thu lại token payload +- Xác định phiên bản của token payload. (Unscoped token: 1, token trong tầm vực domain: 1, token trong tầm vực project: 2 ) +- Tách các trường của payload để chứng thực. Ví dụ với token trong tầm vực project gồm các trường sau: user id, project id, method, expiry, audit id +- Kiểm tra xem token đã hết hạn chưa. Nếu thời điểm hiện tại lớn hơn so với thời điểm hết hạn thì trả về thông báo "Token not found". Nếu token chưa hết hạn thì chuyển sang bước tiếp theo +- Kiểm tra xem token đã bị thu hồi chưa. Nếu token đã bị thu hồi (tương ứng với 1 sự kiện thu hồi trong bảng revocation_event của database keystone) thì trả về thông báo "Token not found". Nếu chưa bị thu hồi thì trả lại token (thông điệp phản hồi thành công HTTP/1.1 200 OK ) + + +## 3. Tham khảo thêm + +[1] : https://developer.ibm.com/opentech/2015/11/11/deep-dive-keystone-fernet-tokens/ diff --git a/Neutron/1. Introduction-neutron.md b/Neutron/1. Introduction-neutron.md new file mode 100644 index 0000000..3e0b08b --- /dev/null +++ b/Neutron/1. Introduction-neutron.md @@ -0,0 +1,130 @@ + + +# Openstack networking - Neutron + +## 1. Openstack networking - Neutron + +- Trong Openstack, Networking Service cung cấp cho người dùng API cho người dùng có thể cài đặt và định nghĩa các network. Code-name của Openstack Networking là neutron. +- Openstack networking service làm nhiệm vụ tạo và quản lý hạ tầng mạng ảo, bao gồm network, switch, subnet, router +- Openstack networking bao gồm : neutron-server, database storage, plug-in agent, cung cấp một số service khác để giao tiếp với Linux, external devices, or SDN controllers. +- Openstack là hoàn toàn độc lập và có triển khai trên 1 host đọc lập +- Openstack Networking tích hợp với một số copoment khác : + - Openstack Indentify : để xác thực và ủy quyền cho các API Request + - Openstack Compute : liên hệ với compute để gắn mỗi VNIC đến từng máy ảo riêng + - Openstack dashboard : người dùng sử dụng để khởi tạo và quản lý các network + +- Openstack networking bao gồm các thành phần: + - API server: + - OpenStack Networking API bao gồm hỗ trợ **Layer 2 networking** và **IP address management (IPAM)**, cũng như 1 phần mở rộng cho **Layer 3 router** cho phép routing giữa các **Layer 2 networking**. OpenStack Networking bao gồm 1 danh sách các plug-in cho phép tương tác với các công nghệ mạng mã nguồn mở khác nhau, bao gồm routers, virtual switches, và software-defined networking (SDN) controllers. + - OpenStack Networking plug-in và agents: + Plugs và unplugs ports, tạo network hoặc subnets, và cung cấp địa chỉ IP. Plug-in và agents được chọn khác nhau tùy thuộc và nhà cung cấp và công nghệ được sử dụng trong cloud cụ thể. Điều quan trọng cần đề cập là chỉ có thể sử dụng 1 plug-in trong 1 thời điểm. + - Messaging queue: + Cấp nhận và định tuyến các yêu cầu RPC giữa các agents để hoàn thành các hoạt động API. Message queue là được sử dụng trong **Ml2 plug-in** cho RPC giữa neutron server và neutron agents chạy trên mỗi hypervisor, **ML2 mechanism drivers** cho **Open vSwitch** và **Linux bridge**. + +- Network agent : xử lý các tác vụ khác nhau được sử dụng để triển khai mạng ảo. Các agent bao gồm : neutron-dhcp-agent, neutron-l3-agent, neutron-metering-agent, and neutron-lbaas-agent, among others +# 2. OpenStack Networking integrates +Openstack networking được thích hợp với nhiều thành phần khác để thành một hệ thống hoàn chỉnh, bao gồm : + +- Openstack Indentify : dùng để xác thực và cấp quyền để làm việc với API +- Openstack compute : để plug các NIC của máy ảo vào một mạng ảo +- Openstack Dashboard : sử dụng web-based để quản lý vòng đời của một mạng ảo + + +# 3. Các loại network trong Openstack Networking + +Trong Openstack có 3 loại network gồm : provider, Routed provider networks và self-service + + +## 2.1 : Provider Network + +- Provider network cung cấp một network layer 2 tới các instance với sự hỗ trợ của DHCP và metadata. Mạng này kết nối hoặc map tới một network layer 2 có trong datacenter., thường kết hợp với 802.1Q ( VLAN ) +- Provider network thường cung cấp sự đơn giản, hiệu năng và độ tin cậy. Chỉ có admin mới có thể quản lý các mạng này vì nó yêu cầu cấu hình hạng tầng mạng vật lý. Provider network chỉ có thể xử lý các frame layer-2 cho các kết nối đến instance, , do đó thiếu chức răng định tuyến và IP floating +- Nói chung, các thành phần trong Openstack Networking có thể xử lý các hoạt động layer-3 tác động đến hiệu năng và độ tin tưởng, provider network giúp chuyển các hoạt động layer-3 sang hạ tầng mạng vật lý + +## 2.2. Routed Network +- Routed provider networks cung cấp kết nối ở layer 3 cho các máy ảo. Các network này map với những networks layer 3 đã tồn tại. +- Cụ thể hơn , mạng này map tới các các mạng layer 2 đã được chỉ định làm provider network . Mỗi router có một gateway để làm nhiệm vụ định tuyến . . Routed provider networks tất nhiên sẽ có hiệu suất thấp hơn so với provider networks. + +## 2.3. Self-service network ( tenant ) + +- Self-service network cho phép các project quản lý các mạng mà không cần quyền admin. Những mạng này hoàn toàn là mạng ảo và yêu cầu một mạng ảo ,sau đó tương tác với provider network và mạng ngoài ( internet ). Self-service thường sử dụng DHCP và meta cho các instance +- Mong nhiều trường hợp, self-service network sử dụng overload protocol bằng VXLAN, GRE vì chúng có thể hỗ trợ nhiều mạng hơn layer-2 khi sử dụng VLAN ( 802.1q) +- IPv4 trong self-service thường sử dụng IP Private ( RFC 1918 ) và tương tác với provider network bằng Source NAT sử dụng router ảo. Floating IP address cho phép truy cập instance từ provider network bằng Destination NAT sử dụng Router ảo +- IPv6 trong self-service sử dụng IP Public và tương tác với provider network sử dụng các static route thông qua các Router ảo +- Trong openstack networking tích hợp một router layer-3 thường nằm ít nhất trên một node network. Trái ngược với provider network kết nối tới các instance thông qua hạ tầng mạng vật lý layer-2 +- Người dùng có thể tạo các selt-network theo từng project. Bởi vậy các kết nối sẽ không được chia sẻ với các project khác. + +Trong Openstack hỗ trợ các kiểu cô lập và overplay sau : +- Flat : tất cả instance kết nối vào một network chung. Không được tag VLAN_ID vào packet hoặc phân chia vùng mạng +- VLAN : cho phép khởi tạo nhiều provider hoặc tenant network2 sử dụng VLAN (801.2q) , tương ứng với VLAN đang có sẵn trên mạng vật lý. Điều này cho phép instance kết nối tới các thành phần khác trong mạng +- GRE and VXLAN : là mỗi giao thức đóng gói packet , cho phép tạo ra mạng overlay để tạo kết nối giữa các instance. Một router ảo để kết nối từ tenant network ra external network. Một router provider sử dụng để kết nối từ external network vào các instance trong tenant network sử dụng floating IP +![](https://docs.openstack.org/mitaka/networking-guide/_images/NetworkTypes.png) + + +## 2.3 . Một số khái niệm bổ sung + +- **Subnet** : mà một block có thể sử dụng cho host và các địa chỉ liên quan . Subnet được sử dụng để gắn các địa chỉ IP khi một port được khởi tạo +- **Subnet pool** : + - enduser có thể tạo các subnet và các địa chỉ IP hợp lý trong subnet đó. Tuy nhiên, mạng tenant nên được cấu hình các subnet trước mà tự gắn vào các port + - Sử dụng **subnet pools** sẽ hạn chế những địa chỉ nào có thể sử dụng bằng cách yêu cầu mọi subnet phải nằm trong pool được xác định. Sử dụng nhiều subnet pool trên một subnet + - Ports : là một điểm kết nối để gắn vào một thiết bị, chẳng hạn từ một Virtual NIC đến một virtual network. Port cũng mô tả các cấu hình liên quan như MAC và IP sử dụng trên node đó + ![](https://aptira.com/wp-content/uploads/2016/03/2.png) + - Router : cung cấp một thiết bị layer-3 giống như thiết bị định tuyến sử dụng NAT giữa sefl-service và provider network hoặc giữa các sefl-service network trên nhiều project . Networking service sử dụng layer-3 agent để quản lý router thông qua namespace +- **Security Group** : + - **Security groups** cung cấp vùng lưu trữ cho _virtual firewall rules_ để kiểm soát lưu lượng truy cập ingress (inbound to instance) và egress (outbound from instance) mạng ở mức port. **Security groups** sử dụng default deny policy và chỉ chứa các rules đồng ý phép lưu lượng cụ thể. Firewall driver chuyển các _group rule_ đến cấu hình cùng cơ chế lọc gói tin như `iptables`. + - Mỗi project có chứa 1 `default` security group mà cho phép tát cả lưu lượng egress và từ chối tất cả các lưu lượng ingress. Bạn có thể thay đổi rules trong `default` security group. Nó bạn launch instance mà không có security group chỉ định, `default` security group sẽ tự động được áp dụng cho instance đó. Tương tự, nếu bạn tạo 1 port mà không chỉ định security group, `default` security group tự động được áp cho port đó. + - Mặc định khi một gói tin gửi đến không gồm trường IP nhưng default group sẽ ngăn chạn các bản tin ARP + - Mặc định, mọi security groups chứa các rules thực hiện một số hành động sau: + - Cho phép traffic ra bên ngoài chỉ khi nó sử dụng địa chỉ MAC và IP của port máy ảo, cả hai địa chỉ này được kết hợp tại `allowed-address-pairs` + - Cho phép tín hiệu tìm kiếm DHCP và gửi message request sử dụng MAC của port cho máy ảo và địa chỉ IP chưa xác định. + - Cho phép trả lời các tín hiệu DHCP và DHCPv6 từ DHCP server để các máy ảo có thể lấy IP + - Từ chối việc trả lời các tín hiệu DHCP request từ bên ngoài để tránh việc máy ảo trở thành DHCP server + - Cho phép các tín hiệu inbound/outbound ICMPv6 MLD, tìm kiếm neighbors, các máy ảo nhờ vậy có thể tìm kiếm và gia nhập các multicast group. + - Từ chối các tín hiệu outbound ICMPv6 để ngăn việc máy ảo trở thành IPv6 router và forward các tín hiệu cho máy ảo khác. + - Cho phép tín hiệu outbound non-IP từ địa chỉ MAC của các port trên máy ảo . +- **DHCP** : + - quản lý các địa chỉ IP cho provider và sefl-service network . Networking service sử dụng manages ``qdhcp`` namespaces và ``dnsmasq`` service. + +- **L3 Agent** + +L3 agent là một phần của package openstack-neutron. Nó được xem như router layer-3 chuyển hướng lưu lượng và cung cấp dịch vụ gateway cho network lớp 2. Các nodes chạy L3 agent không được cấu hình IP trực tiếp trên một card mạng. Thay vì thế, sẽ có một dải địa chỉ IP từ mạng ngoài được sử dụng cho OpenStack networking. Các địa chỉ này được gán cho các routers mà cung cấp liên kết giữa mạng trong và mạng ngoài. Miền địa chỉ được lựa chọn phải đủ lớn để cung cấp địa chỉ IP duy nhất cho mỗi router khi triển khai cũng như mỗi floating IP gán cho các máy ảo. + +- **DHCP Agent:** OpenStack Networking DHCP agent chịu trách nhiệm cấp phát các địa chỉ IP cho các máy ảo chạy trên network. Nếu agent được kích hoạt và đang hoạt động khi một subnet được tạo, subnet đó mặc định sẽ được kích hoạt DHCP. +- **Plugin Agent:** Nhiều networking plug-ins được sử dụng cho agent của chúng, bao gồm OVS và Linux bridge. Các plug-in chỉ định agent chạy trên các node đang quản lý lưu lượng mạng, bao gồm các compute node, cũng như các nodes chạy các agent +# 3. Cấu trúc thành phần và dịch vụ + +### 3.1 Server + +Cung cấp API, quản lí database,... + +### 3.2 Plug-ins + +Quản lí agents + +### 3.3 Agents + +- Cung cấp kết nối layer 2/3 tới máy ảo +- Xử lý truyền thông giữa mạng ảo và mạng vật lý. +- Xử lý metadata, etc. + +### Layer 2 (Ethernet and Switching) + +- Linux Bridge +- OVS + +#### Layer 3 (IP and Routing) + +- L3 +- DHCP + +### Miscellaneous + +- Metadata + +### Services + +Các dịch vụ Routing + +- VPNaaS: Virtual Private Network-as-a-Service (VPNaaS), extension của neutron cho VPN +- LBaaS: Load-Balancer-as-a-Service (LBaaS), API quy định và cấu hình nên các load balancers, được triển khai dựa trên HAProxy software load balancer. +- FWaaS: Firewall-as-a-Service (FWaaS), API thử nghiệm cho phép các nhà cung cấp kiểm thử trên networking của họ. diff --git a/Neutron/10. OPS-Packet-Provider.md b/Neutron/10. OPS-Packet-Provider.md new file mode 100644 index 0000000..f50f6c2 --- /dev/null +++ b/Neutron/10. OPS-Packet-Provider.md @@ -0,0 +1,80 @@ + +## 3. Mô hình Provider + +### 3.1. Bắc Nam + +![](https://docs.openstack.org/newton/networking-guide/_images/deploy-ovs-provider-flowns1.png) + + +- Trên Compute 1 : + - B1 : instance interface ( 1 ) forward packet đến Linux Bridge port ( 2 ) nhờ `veth` pair + - B2 : Security group ( 3 ) đảm nhiệm filter các packet + - B3 : Security group OVS bridge port ( 4 ) forward packet tới OVS integration bridge port ( 5 ) nhờ `veth` pair + - B4 : OVS integration bridge tag VLAN ID tới packet + - B5 : OVS integration bridge patch port ( 6 ) forward packet đến OVS provider bridge patch port ( 7 ) + - B6 : OVS provider bridge Tag VLAN external cho packet + - B7 : OVS provider bridge port ( 8 ) forward packet tới physcal interface + - B8 : Physical interface ( 9) forward packet tới hạ tầng mạng ( 10 ) + +- Hạ tầng mạng ngoài : + - B1 : Switch bỏ VLAN ID và forward packet lên Router ( 11 ) + - B2 : Router forward forward data ra các mạng ngoài ( 12 ) và forward đến switch ( 13 ) + +### 3.2 : Đông - Tây : cùng mạng + +- Trên Compute 1 : + - instance interface ( 1 ) forward data sang bridge instance port ( 2 )thông qua `veth` pair + - Security group ( 3 ) đảm nhiệm filter các packet + - Linux bridge port ( 4 ) forward packet sang OVS integration bridge port ( 5 ) sử dụng `veth` pair + - OVS integration tag internal VLAN_ID vào các packet + - OVS integration bridge patch port ( 6 ) forward packet sang OVS integration bridge patch port ( 7 ) + - OVS provider bridge sử dụng VLAN_ID external thay thế cho internal VLAN_ID + - OVS provider bridge port ( 8 )forward packet sang physical interface ( 9 ) + - Physical interface forward packet đến switch vật lý ( 10 ) + +- Trên Switch + - Forward packet từ compute node 1 sang compute node 2 + +- Trên Compute 2 : + - Physical interface network interface ( 12 ) forward packet tới OVS provider port ( 13 ) + - OVS provider bridge patch port ( 14 ) forward packet tới OVS intergration bridge patch port ( 15 ) + - OVS integration bridge định nghĩa VLAN_ID + - OVS integration bridge port ( 16 ) forward packet đến Linux Bridge port ( 17 ) sử dụng `veth` pair + - Securtiy group ( 18 ) đảm nhiệm filter các packet + - Linux brige veth port ( 19 ) forward các packet sang instance interface ( 20 ) sử dụng `veth` pair + + +### 3.3: Đông - Tây : khác mạng + +![](https://docs.openstack.org/newton/networking-guide/_images/deploy-ovs-provider-flowew2.png) + + +- Trên Compute Node + - B1 : Instance 1 interface ( 1 ) forward packet sang Linux Bridge veth port ( 2 ) + - B2 : Securtiy group rule ( 3 ) sẽ đảm nhiệm filter package + - B3 : Linux Bridge port ( 4) forward packet đến OVS integration bridge veth port ( 5 ) + - B4 : OVS integration bridge thêm VLAN vào các packet 2 + - B5 : OVS integration bridge + - B6 : OVS provider bridge sử dụng VLAN_ID external thay thế cho local VLAN_ID + - B7 : OVS provider patch port ( 6 ) forward packet sang OVS provider bridge patch port ( 7 ) + - B8 : OVS provider bridge port ( 8 ) forward packet tới physical interface ( 9 ) + - B9 : Physical interface forward packet tới switch vật lý ( 10 ) + +- Trên Switch + - B1 : Switch bỏ các VLAN_ID khỏi packet và forward tới router ( 11 ) + - B2 : Router sẽ forward tới các cổng ( 12) để forward packet sang mạng 2 ( 13 ) + - B3 : Router forward các packet tới switch ( 14 ) + - B4 : Switch tag VLAN vào packet và forward tới Compute Node ( 15 ) + +- Trên Compute Node + - B1 : Physical interface ( 16 ) forward packet tới OVS provider bridge port ( 17 ) + - B2 : OVS provider bridge patch port ( 18 ) forward packet tới OVS integration bridge port ( 19 ) + - B3 : OVS integration bỏ VLAN_ID và tag local VLAN_ID + - B4 : OVS integration port ( 20 ) bỏ VLAN và forward đến Linux Bridge ( 21 ) + - B5 : Linux bridge sẽ đảm nhiệm filter packet ( 22 ) + - B6 : Linux bridge veth port ( 23 ) foreward packet tới instance 2 interface ( 24 + + + +End. + diff --git a/Neutron/11. VXLAN-Tunnel.md b/Neutron/11. VXLAN-Tunnel.md new file mode 100644 index 0000000..01c9b42 --- /dev/null +++ b/Neutron/11. VXLAN-Tunnel.md @@ -0,0 +1,153 @@ + +## LAB VXLAN trên 2 host sử dụng OpenvSwitch + +## 1. Mô hình + +![](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/Untitled%20Diagram.png?raw=true) + +## 2. Cấu hình Host 1 + +- Cài đặt OpenvSwitch +``` +yum install wget openssl-devel python-sphinx gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel python-six -y +useradd ovs +su - ovs +mkdir -p ~/rpmbuild/SOURCES +wget http://openvswitch.org/releases/openvswitch-2.9.2.tar.gz +cp openvswitch-2.9.2.tar.gz ~/rpmbuild/SOURCES/ +tar xfz openvswitch-2.9.2.tar.gz +rpmbuild -bb --nocheck openvswitch-2.9.2/rhel/openvswitch-fedora.spec +exit +yum install -y /home/ovs/rpmbuild/RPMS/x86_64/openvswitch-2.9.2-1.el7.x86_64.rpm +``` + +- Cấu hình IP V4 Fowarding +``` +cat < /etc/sysctl.conf +net.ipv4.ip_forward = 1 +EOF +sysctl -p /etc/sysctl.conf +``` + +- Cấu hình VXLAN Tunnel Endpoint +``` +ovs-vsctl add-br br-extun +ovs-vsctl add-port br-extun tun-vxlan0 -- set interface tun-vxlan0 type=vxlan options:local_ip=192.168.69.135 options:remote_ip=192.168.69.132 +``` + +- Cấu hình IP cho internal interface (VETP )( như một cổng layer 3 ) +``` +cat < /etc/sysconfig/network-scripts/ifcfg-extun +DEVICE=br-extun +BOOTPROTO=yes +ONBOOT=yes +PREFIX=24 +IPADDR=192.168.199.1 +EOF +systemctl restart network +``` + +- Khởi tạo một network mới trong libvirt +```` +cat < /etc/libvirt/qemu/networks/br-tun.xml + + + ovs-tun + + + + + +EOF +virsh net-define br-tun.xml +virsh net-start ovs-tun +virsh net-autostart ovs-tun +```` + + +- Cấu hình network interface cho máy ảo +![](https://i.imgur.com/zTTPvci.png) + +- Cấu hình IP và Gateway cho máy ảo + +![](https://i.imgur.com/pGe5jqr.png) + + +## 3. Cấu hình Host 2 + + +- Cài đặt OpenvSwitch +``` +yum install wget openssl-devel python-sphinx gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel python-six -y +useradd ovs +su - ovs +mkdir -p ~/rpmbuild/SOURCES +wget http://openvswitch.org/releases/openvswitch-2.9.2.tar.gz +cp openvswitch-2.9.2.tar.gz ~/rpmbuild/SOURCES/ +tar xfz openvswitch-2.9.2.tar.gz +rpmbuild -bb --nocheck openvswitch-2.9.2/rhel/openvswitch-fedora.spec +exit +yum install -y /home/ovs/rpmbuild/RPMS/x86_64/openvswitch-2.9.2-1.el7.x86_64.rpm +``` + +- Cấu hình IP V4 Fowarding +``` +cat < /etc/sysctl.conf +net.ipv4.ip_forward = 1 +EOF +sysctl -p /etc/sysctl.conf +``` + +- Cấu hình VXLAN Tunnel Endpoint +``` +ovs-vsctl add-br br-extun +ovs-vsctl add-port br-extun tun-vxlan0 -- set interface tun-vxlan0 type=vxlan options:local_ip=192.168.69.132 options:remote_ip=192.168.69.135 +``` + +- Cấu hình IP cho internal interface - VETP ( như một cổng layer 3 ) +``` +cat < /etc/sysconfig/network-scripts/ifcfg-extun +DEVICE=br-extun +BOOTPROTO=yes +ONBOOT=yes +PREFIX=24 +IPADDR=192.168.199.2 +EOF +systemctl restart network +``` + + + +- Test Ping Tunnel Host 1 +``` +[root@compute2 ~]# ping 192.168.199.1 +PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data. +64 bytes from 192.168.199.1: icmp_seq=1 ttl=64 time=1.93 ms +64 bytes from 192.168.199.1: icmp_seq=2 ttl=64 time=0.585 ms +64 bytes from 192.168.199.1: icmp_seq=3 ttl=64 time=0.573 ms +64 bytes from 192.168.199.1: icmp_seq=4 ttl=64 time=0.524 ms +^C +--- 192.168.199.1 ping statistics --- +4 packets transmitted, 4 received, 0% packet loss, time 3001ms +rtt min/avg/max/mdev = 0.524/0.904/1.936/0.596 ms +``` + + +- Test Ping về máy ảo +``` +[root@compute2 ~]# ping 192.168.199.10 +PING 192.168.199.10 (192.168.199.10) 56(84) bytes of data. +64 bytes from 192.168.199.10: icmp_seq=1 ttl=64 time=2.81 ms +64 bytes from 192.168.199.10: icmp_seq=2 ttl=64 time=1.59 ms +64 bytes from 192.168.199.10: icmp_seq=3 ttl=64 time=1.54 ms +64 bytes from 192.168.199.10: icmp_seq=4 ttl=64 time=1.42 ms +64 bytes from 192.168.199.10: icmp_seq=5 ttl=64 time=1.49 ms +64 bytes from 192.168.199.10: icmp_seq=6 ttl=64 time=0.834 ms +64 bytes from 192.168.199.10: icmp_seq=7 ttl=64 time=1.50 ms +64 bytes from 192.168.199.10: icmp_seq=8 ttl=64 time=1.50 ms +^C +--- 192.168.199.10 ping statistics --- +8 packets transmitted, 8 received, 0% packet loss, time 7008ms +rtt min/avg/max/mdev = 0.834/1.590/2.819/0.518 ms + +``` diff --git a/Neutron/12. VXLAN-Tunnel-Host-pair-OPS.md b/Neutron/12. VXLAN-Tunnel-Host-pair-OPS.md new file mode 100644 index 0000000..0e0a5c9 --- /dev/null +++ b/Neutron/12. VXLAN-Tunnel-Host-pair-OPS.md @@ -0,0 +1,107 @@ + + + +## Cấu hình VLAN Tunnel. Các Physical Host làm việc với VM trong OPS + +## 1. Mô hình + +- Mô hình kết nối +![](https://i.imgur.com/q1wWebm.png) + + +- Mô hình network OVS trên Compute Node +![](https://camo.githubusercontent.com/90a932615b63335581dfafe3ce6274101d15da3d/68747470733a2f2f646f63732e6f70656e737461636b2e6f72672f6e657574726f6e2f717565656e732f5f696d616765732f756e6465722d7468652d686f6f642d7363656e6172696f2d312d6f76732d636f6d707574652e706e67) + +- Mô hình + + +## 2. Tìm VLAN của QVO interface trên các br-int + +### Trên Controller + +```bash + +get_id=`openstack server list | grep 10.20.30.101 | awk '{print $2}'` +get_virsh_name=`openstack server show ${get_id} | awk '/OS-EXT-SRV-ATTR:instance_name/ {print $4}'` +get_host=`openstack server show ${get_id} | awk '/OS-EXT-SRV-ATTR:host/ {print $4}'` + +echo "ID VM :${get_virsh_name} , Compute Host : ${get_host} " +``` + + +### Trên Compute Host +- Sử dụng ID VM và Compute Host được cung cấp trên Controller + +```bash +qbr=`virsh domiflist ${id_domain} | grep "qbr.{0,12}" -o -P | tail -c 13` +get_vlan=`ovs-vsctl show | grep $qbr -b1 | awk '/tag:/ {print $3}'` +echo "VLAN = ${get_vlan}" +``` + + +## 3. Cấu hình VXAN Tunnel + + +### 3.1 : Trên Compute Host + + +```bash + +## Cấu hình VXLAN END POINT +ovs-vsctl add-br br-ex +ovs-vsctl add-port br-ex pair_compute4 -- set interface pair_compute4 type=vxlan options:local_ip=192.168.69.132 options:remote_ip=192.168.69.135 options:in_key=flow options:out_key=flow +ip link set up br-ex +## Cấu hình VETH Pair br-int và br-ex + +ip link add veth0 type veth peer name veth1 +ip link set up veth0 +ip link set up veth1 +ovs-vsctl add-port br-ex veth0 +ovs-vsctl add-port br-int veth1 + + +## Cấu hình VLAN trên interface OVS - sử dụng VLAN trong bước trước + +ovs-vsctl set port br-ex tag=1 + + +``` + + +### 3.2 : Trên Host 4 + +```bash + +# Cấu hình VXLAN END POINT + +ovs-vsctl add-br br-tun +ovs-vsctl add-port br-tun pair_compute3 -- set interface pair_compute3 type=vxlan options:local_ip=192.168.69.135 options:remote_ip=192.168.69.132 options:in_key=flow options:out_key=flow +ip link set up br-tun + +# Cấu hình br-tun interface + +cat < /etc/sysconfig/network-scripts/ifcfg-br-tun +DEVICE=br-tun +BOOTPROTO=yes +ONBOOT=yes +PREFIX=24 +IPADDR=10.20.20.9 +EOF +systemctl restart network + +## Cấu hình VLAN trên interface OVS - sử dụng VLAN trong bước trước + +ovs-vsctl set port br-tun tag=1 + +``` + + +### 4. Kiểm thử + + +- Ping từ Host 4 về máy ảo +![](https://i.imgur.com/LAGQzCk.png) + + +- Ping từ máy ảo về Host 4 +![](https://i.imgur.com/wbnlekh.png) diff --git a/Neutron/2. Install Neutron Linux Bridge.md b/Neutron/2. Install Neutron Linux Bridge.md new file mode 100644 index 0000000..76251f2 --- /dev/null +++ b/Neutron/2. Install Neutron Linux Bridge.md @@ -0,0 +1,303 @@ +# Cài đặt Neutron -- Linux Bridge + +## 1. Cấu hình trên Controller Node + +- Cài đặt `etcd` +```bash +yum install etcd -y +cat < /etc/etcd/etcd.conf +#[Member] +ETCD_DATA_DIR="/var/lib/etcd/default.etcd" +ETCD_LISTEN_PEER_URLS="http://192.168.69.130:2380" +ETCD_LISTEN_CLIENT_URLS="http://192.168.69.130:2379" +ETCD_NAME="controller" +#[Clustering] +ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.69.130:2380" +ETCD_ADVERTISE_CLIENT_URLS="http://192.168.69.130:2379" +ETCD_INITIAL_CLUSTER="controller=http://192.168.69.130:2380" +ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01" +ETCD_INITIAL_CLUSTER_STATE="new" +EOF +systemctl enable etcd +systemctl start etcd +``` + +- Khởi tạo Database +```bash +mysql -u root --password=123@123Aa < /etc/neutron/neutron.conf +[DEFAULT] +core_plugin = ml2 +service_plugins = router +allow_overlapping_ips = true +transport_url = rabbit://openstack:rabbitmq_123@controller +auth_strategy = keystone +notify_nova_on_port_status_changes = true +notify_nova_on_port_data_changes = true +[database] +connection = mysql+pymysql://neutron:neutron_123@controller/neutron + +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:35357 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = neutron +password = neutron_123 + +[nova] +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = nova +password = nova_123 + +[oslo_concurrency] +lock_path = /var/lib/neutron/tmp + +EOF +``` + +- Cấu hình `Layer 2 Plugin` +The ML2 plug-in uses the Linux bridge mechanism to build layer-2 (bridging and switching) virtual networking infrastructure for instances. +```bash +cat < /etc/neutron/plugins/ml2/ml2_conf.ini +[ml2] +type_drivers = flat,vlan,vxlan +tenant_network_types = vxlan +mechanism_drivers = linuxbridge,l2population +extension_drivers = port_security + +[ml2_type_flat] +flat_networks = provider + +[ml2_type_vxlan] +vni_ranges = 1:1000 + +[securitygroup] +enable_ipset = true +EOF +``` + +- Cấu hình `L2 Agent` +The Linux bridge agent builds layer-2 (bridging and switching) virtual networking infrastructure for instances and handles security groups. +```bash +modprobe br_netfilter +cat < /etc/neutron/plugins/ml2/linuxbridge_agent.ini +[linux_bridge] +physical_interface_mappings = provider:ens192 + +[vxlan] +enable_vxlan = true +local_ip = 192.168.69.130 +l2_population = true + +[securitygroup] +enable_security_group = true +firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver + +EOF +``` + +- Cấu hình `L3 Agent` +The Layer-3 (L3) agent provides routing and NAT services for self-service virtual networks. + +```bash +cat < /etc/neutron/l3_agent.ini +[DEFAULT] +interface_driver = linuxbridge +EOF +``` + +- Cấu hình `DHCP Agent` +The DHCP agent provides DHCP services for virtual networks. +```bash +cat < /etc/neutron/dhcp_agent.ini +[DEFAULT] +interface_driver = linuxbridge +dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq +enable_isolated_metadata = true +EOF +``` + +- Cấu hình `Metadata Agent` +```bash +cat </etc/neutron/metadata_agent.ini +[DEFAULT] +nova_metadata_host = controller +metadata_proxy_shared_secret = metadata_123 +EOF +``` + +- Cấu hình Nova sử dụng Neutron trong `/etc/nova/nova.conf` +``` +cat <>/etc/nova/nova.conf +[neutron] +url = http://controller:9696 +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = neutron +password = neutron_123 +service_metadata_proxy = true +metadata_proxy_shared_secret = metadata_123 +EOF +``` + +- Khởi tạo Database +``` +ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini +su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \ + --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron +``` + +- Khởi động dịch vụ +``` +systemctl restart openstack-nova-api.service +systemctl enable neutron-server.service \ + neutron-linuxbridge-agent.service neutron-dhcp-agent.service \ + neutron-metadata-agent.service +systemctl start neutron-server.service \ + neutron-linuxbridge-agent.service neutron-dhcp-agent.service \ + neutron-metadata-agent.service +systemctl enable neutron-l3-agent.service +systemctl start neutron-l3-agent.service +``` +- Cấu hình FirewallD +``` +firewall-cmd --add-port=9696/tcp --permanent +firewall-cmd --reload +``` +## 2. Cấu hình trên Compute Node + + + +- Cài đặt package cho neutron +```bash +yum install openstack-neutron-linuxbridge ebtables ipset +``` + +- Cấu hình file `neutron.conf` +```bash +cat < /etc/neutron/neutron.conf +[DEFAULT] +transport_url = rabbit://openstack:rabbitmq_123@controller +auth_strategy = keystone +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:35357 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = neutron +password = neutron_123 +[oslo_concurrency] +lock_path = /var/lib/neutron/tmp +EOF +``` + +### Cấu hình mạng theo mô hình `Self-service` + +- Cấu hình `Linux Bridge Agent` +```bash +yum install openstack-selinux +modprobe br_netfilter +cat < /etc/neutron/plugins/ml2/linuxbridge_agent.ini +[linux_bridge] +physical_interface_mappings = provider:ens192 +[vxlan] +enable_vxlan = true +local_ip = 192.168.69.131 +l2_population = true +[securitygroup] +enable_security_group = true +firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver +EOF +``` + +- Cấu hình dịch vụ Neutron cho Nova `/etc/nova/nova.conf` +```bash +cat <> /etc/nova/nova.conf +[neutron] +url = http://controller:9696 +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = neutron +password = neutron_123 +EOF +``` + +- Khởi động dịch vụ +```bash +systemctl enable openstack-nova-compute.service +systemctl restart openstack-nova-compute.service +systemctl enable neutron-linuxbridge-agent.service +systemctl start neutron-linuxbridge-agent.service +``` + + +- Trở lại Controller Node , kiểm tra các agent + +```bash +[root@controller ~]# openstack network agent list ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| ID | Agent Type | Host | Availability Zone | Alive | State | Binary | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| b68cd06e-384f-47d7-88e4-dd5a6a85796c | Linux bridge agent | compute1 | None | :-) | UP | neutron-linuxbridge-agent | +| c4eb82a1-d86a-4eb8-a230-f62b567d4df8 | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent | +| ce13fbcc-e0e6-4b55-87cd-7bdfe58ce357 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent | +| e2279058-9cad-4e05-801d-51a8f16b6850 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent | +| f7fc3ab5-35c5-4968-a349-79ba6820d25a | Linux bridge agent | controller | None | :-) | UP | neutron-linuxbridge-agent | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ + +``` diff --git a/Neutron/2.1 . OVS-Self-Services.md b/Neutron/2.1 . OVS-Self-Services.md new file mode 100644 index 0000000..5a756f4 --- /dev/null +++ b/Neutron/2.1 . OVS-Self-Services.md @@ -0,0 +1,402 @@ + +## Cài đặt Neutron - OpenvSwitch - Self Service + + + +## 1. Cấu hình trên Controller Node + +- Tắt các Agent +``` +systemctl stop neutron-linuxbridge-agent neutron-server neutron-dhcp-agent neutron-l3-agent neutron-metadata-agent + +``` + +- Xóa Bridge Provider của Linux Bridge +``` +brctl del-if br19feqwe-eq ens192 +ip link set down br19feqwe-eq +brctl del-br br19feqwe-eq +``` + + +- Cài đặt `etcd` +```bash +yum install etcd -y +cat < /etc/etcd/etcd.conf +#[Member] +ETCD_DATA_DIR="/var/lib/etcd/default.etcd" +ETCD_LISTEN_PEER_URLS="http://192.168.69.130:2380" +ETCD_LISTEN_CLIENT_URLS="http://192.168.69.130:2379" +ETCD_NAME="controller" +#[Clustering] +ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.69.130:2380" +ETCD_ADVERTISE_CLIENT_URLS="http://192.168.69.130:2379" +ETCD_INITIAL_CLUSTER="controller=http://192.168.69.130:2380" +ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01" +ETCD_INITIAL_CLUSTER_STATE="new" +EOF +systemctl enable etcd +systemctl start etcd +``` + +- Khởi tạo Database +```bash +mysql -u root --password=123@123Aa < /etc/neutron/neutron.conf +[DEFAULT] +service_plugins = router +allow_overlapping_ips = True +core_plugin = ml2 +auth_strategy = keystone +transport_url = rabbit://openstack:rabbitmq_123@controller +notify_nova_on_port_status_changes = true +notify_nova_on_port_data_changes = true +[database] +connection = mysql+pymysql://neutron:neutron_123@controller/neutron + +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:35357 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = neutron +password = neutron_123 + +[nova] +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = nova +password = nova_123 + +[oslo_concurrency] +lock_path = /var/lib/neutron/tmp + +EOF +``` + +- Cấu hình L2 Agent +``` +cat << EOF > /etc/neutron/plugins/ml2/ml2_conf.ini +[ml2] +type_drivers = flat,vlan,vxlan +tenant_network_types = vxlan +mechanism_drivers = openvswitch,l2population +[ml2_type_vxlan] +vni_ranges = 1:300 +EOF +``` + +- Cấu hình Openvswitch Agent ( provider ) +``` +cat << EOF > /etc/neutron/plugins/ml2/openvswitch_agent.ini +[ovs] +bridge_mappings = provider:br-provider +local_ip = 192.168.69.130 + +[agent] +tunnel_types = vxlan +l2_population = True + +[securitygroup] +firewall_driver = iptables_hybrid +EOF +``` + +- Cấu hình L3 Agent +``` +cat << EOF > /etc/neutron/l3_agent.ini +[DEFAULT] +interface_driver = openvswitch +external_network_bridge = +EOF +``` + +- Cấu hình FirewallD +``` +firewall-cmd --add-port=9696/tcp --permanent +firewall-cmd --reload +``` + +- Cấu hình `DHCP Agent` +The DHCP agent provides DHCP services for virtual networks. +```bash +cat < /etc/neutron/dhcp_agent.ini +[DEFAULT] +interface_driver = openvswitch +dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq +enable_isolated_metadata = true +EOF +``` + +- Cấu hình `Metadata Agent` +```bash +cat < /etc/neutron/metadata_agent.ini +[DEFAULT] +nova_metadata_host = controller +metadata_proxy_shared_secret = metadata_123 +EOF +``` + +- Cấu hình Nova sử dụng Neutron trong `/etc/nova/nova.conf` +``` +cat <>/etc/nova/nova.conf +[neutron] +url = http://controller:9696 +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = neutron +password = neutron_123 +service_metadata_proxy = true +metadata_proxy_shared_secret = metadata_123 +EOF +``` + +- Khởi tạo file cấu hình network cho interface provider và bridge +``` +cat << EOF > /etc/sysconfig/network-scripts/ifcfg-provider +DEVICE="br-provider" +TYPE="OVSBridge" +SLAVE="yes" +BOOTPROTO="static" +IPADDR=192.168.30.130 +NETMASK=255.255.255.0 +GATEWAY=192.168.30.1 +DNS1=1.1.1.1 +IPV6INIT="no" +NM_CONTROLLED="yes" +ONBOOT="yes" +DEFROUTE="yes" +PEERDNS="yes" +PEERROUTES="yes" +IPV4_FAILURE_FATAL="yes" +EOF + +cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens192 +DEVICE="ens192" +ONBOOT="yes" +TYPE="OVSPort" +DEVICETYPE="ovs" +OVS_BRIDGE="br-provider" +EOF +``` + +- Cấu hình Nova + +``` +cat <> /etc/nova/nova.conf +[neutron] +url = http://controller:9696 +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = neutron +password = neutron_123 +EOF + +systemctl restart openstack-nova-compute + +``` + +- Khởi tạo switch cho L2 Agent ( Provider ) - bridge_mappings = provider:br-provider +``` +systemctl start openvswitch +systemctl enable openvswitch +ovs-vsctl add-br br-provider +ovs-vsctl add-port br-provider ens192 +systemctl restart network +``` + +- Khởi tạo Database + +``` +ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini +su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \ + --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron +``` + +- Khởi động các agent và service +``` +for service in server dhcp-agent l3-agent metadata-agent openvswitch-agent; +do +systemctl start neutron-$service +systemctl enable neutron-$service +done +systemctl restart openstack-nova-** +``` + +- Cấu hình FirewallD + +``` +firewall-cmd --add-port=9696/tcp --permanent +firewall-cmd --reload +``` + +- Kiểm tra các Agent +``` +[root@controller ~]# openstack network agent list ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| ID | Agent Type | Host | Availability Zone | Alive | State | Binary | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| 1330a4b7-6142-4960-8a9a-3e2e92c2cce1 | Open vSwitch agent | controller | None | :-) | UP | neutron-openvswitch-agent | +| 13817d05-5a3a-4ccf-8beb-eba92d01fc1c | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent | +| 4e897eae-29fc-4e55-bd7d-783f9907e627 | Linux bridge agent | controller | None | XXX | UP | neutron-linuxbridge-agent | +| 96b049a4-ca30-4a46-bd0a-c1a062d766c1 | Linux bridge agent | compute1 | None | :-) | UP | neutron-linuxbridge-agent | +| e05b5756-b54a-48a7-8cb8-384f31ed56b8 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent | +| e20dc1c0-85da-427a-987b-a65984d9af42 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +``` + +- Các máy ảo đang sử dụng đường provider trên compute ra ngoài bình thường +``` +[root@controller ~]# openstack network agent list ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| ID | Agent Type | Host | Availability Zone | Alive | State | Binary | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| 1330a4b7-6142-4960-8a9a-3e2e92c2cce1 | Open vSwitch agent | controller | None | :-) | UP | neutron-openvswitch-agent | +| 13817d05-5a3a-4ccf-8beb-eba92d01fc1c | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent | +| 4e897eae-29fc-4e55-bd7d-783f9907e627 | Linux bridge agent | controller | None | XXX | UP | neutron-linuxbridge-agent | +| 96b049a4-ca30-4a46-bd0a-c1a062d766c1 | Linux bridge agent | compute1 | None | :-) | UP | neutron-linuxbridge-agent | +| e05b5756-b54a-48a7-8cb8-384f31ed56b8 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent | +| e20dc1c0-85da-427a-987b-a65984d9af42 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ + +``` + +## 2. Trên Compute Node + + +- Cài đặt package +``` +yum install -y openstack-neutron-openvswitch + +yum remove openstack-neutron-linuxbridge +``` + + +- Cấu hình `/etc/neutron/neutron.conf` +``` +cat << EOF > /etc/neutron/neutron.conf +[DEFAULT] +core_plugin = ml2 +auth_strategy = keystone +transport_url = rabbit://openstack:rabbitmq_123@controller +auth_strategy = keystone +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:5000 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = neutron +password = neutron_123 +[oslo_concurrency] +lock_path = /var/lib/neutron/tmp +EOF +``` + +- Cấu hình OVS Agent +``` + +cat << EOF > /etc/neutron/plugins/ml2/openvswitch_agent.ini +[ovs] +local_ip = 192.168.69.132 + +[agent] +tunnel_types = vxlan +l2_population = True + +EOF +``` + +- Tắt Linux Bridge Agent và khởi động OVS agent +``` +systemctl restart openvswitch.service +systemctl restart neutron-openvswitch-agent.service +systemctl enable openvswitch.service neutron-openvswitch-agent.service + +``` + +- Trở về controller Linux bridge agent và kiểm tra danh sách các Agent hiện tại +``` +[root@controller ~]# openstack network agent list ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| ID | Agent Type | Host | Availability Zone | Alive | State | Binary | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| 1330a4b7-6142-4960-8a9a-3e2e92c2cce1 | Open vSwitch agent | controller | None | :-) | UP | neutron-openvswitch-agent | +| 13817d05-5a3a-4ccf-8beb-eba92d01fc1c | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent | +| 92510ebb-ce51-46a1-aba5-2e83dc05012a | Open vSwitch agent | compute1 | None | :-) | UP | neutron-openvswitch-agent | +| c7383988-54af-4342-90f8-5f71073718ec | Open vSwitch agent | compute2 | None | :-) | UP | neutron-openvswitch-agent | +| e05b5756-b54a-48a7-8cb8-384f31ed56b8 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent | +| e20dc1c0-85da-427a-987b-a65984d9af42 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent | ++--------------------------- +``` diff --git a/Neutron/2.2. OVS Self-Service-&-Provider.md b/Neutron/2.2. OVS Self-Service-&-Provider.md new file mode 100644 index 0000000..bfbf0ba --- /dev/null +++ b/Neutron/2.2. OVS Self-Service-&-Provider.md @@ -0,0 +1,275 @@ + + + + +## Cấu hình bổ sung Provider + +## 1. Cấu hình trên Controller + +- Cài đặt package +``` +yum install -y openstack-neutron openstack-neutron-ml2 +``` + +- Cấu hình `/etc/neutron/neutron.conf` +``` +[DEFAULT] +core_plugin = ml2 +auth_strategy = keystone +dhcp_agents_per_network = 2 +## dhcp_agents_per_network : cho phep cac dhcp agent chay tren cac compute node cung dam nhien cap ip cho mot network +``` + +- Cấu hình Neutron đầy đủ + +``` +cat << EOF > /etc/neutron/neutron.conf +[DEFAULT] +core_plugin = ml2 +service_plugins = +auth_strategy = keystone +dhcp_agents_per_network = 2 +transport_url = rabbit://openstack:rabbitmq_123@controller +notify_nova_on_port_status_changes = true +notify_nova_on_port_data_changes = true +[database] +connection = mysql+pymysql://neutron:neutron_123@controller/neutron + +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:35357 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = neutron +password = neutron_123 + +[nova] +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = nova +password = nova_123 + +[oslo_concurrency] +lock_path = /var/lib/neutron/tmp + +EOF +``` + +- Cấu hình Nova + +``` +cat <> /etc/nova/nova.conf +[neutron] +url = http://controller:9696 +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = neutron +password = neutron_123 +EOF + +systemctl restart openstack-nova-** +``` + +- Cấu hình Agent L2 `/etc/neutron/plugins/ml2/ml2_conf.ini` +``` +cat < /etc/neutron/plugins/ml2/ml2_conf.ini +[ml2] +type_drivers = flat,vlan +tenant_network_types = +mechanism_drivers = openvswitch +extension_drivers = port_security +[ml2_type_flat] +flat_networks = provider + +[ml2_type_vlan] +network_vlan_ranges = provider +EOF +``` + + + +- Update Database +``` + su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \ + --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron +``` + +- Khởi động lại dịch vụ +``` +systemctl restart neutron-server openstack-nova-api +systemctl enable neutron-server openstack-nova-api +``` + + +## 2. Cấu hình trên Compute + +- Cài đặt package +``` +yum -y install openstack-neutron openstack-neutron-ml2 openstack-neutron-openvswitch +``` + + +- Cấu hình `/etc/neutron/neutron.conf` + +``` +[DEFAULT] +core_plugin = ml2 +auth_strategy = keystone +``` + +- Cấu hình Neutron đầy đủ +``` +cat << EOF > /etc/neutron/neutron.conf +[DEFAULT] +core_plugin = ml2 +auth_strategy = keystone +transport_url = rabbit://openstack:rabbitmq_123@controller +auth_strategy = keystone +[keystone_authtoken] +auth_uri = http://controller:5000 +auth_url = http://controller:5000 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = neutron +password = neutron_123 +[oslo_concurrency] +lock_path = /var/lib/neutron/tmp +EOF +``` + +- Cấu hình Nova + +``` +cat <> /etc/nova/nova.conf +[neutron] +url = http://controller:9696 +auth_url = http://controller:35357 +auth_type = password +project_domain_name = default +user_domain_name = default +region_name = RegionOne +project_name = service +username = neutron +password = neutron_123 +EOF + +systemctl restart openstack-nova-compute + +``` +- Cấu hình OVS Agent `/etc/neutron/plugins/ml2/openvswitch_agent.ini` +``` +cat < /etc/neutron/plugins/ml2/openvswitch_agent.ini +[ovs] +bridge_mappings = provider:br-provider + +[securitygroup] +firewall_driver = iptables_hybrid +EOF +``` + +- Cấu hình Metadata Agent `/etc/neutron/metadata_agent.ini` +``` +cat << EOF > /etc/neutron/metadata_agent.ini +[DEFAULT] +nova_metadata_host = controller +metadata_proxy_shared_secret = metadata_123 +EOF +``` + +- Cấu hình DHCP Agent +``` +cat << EOF > /etc/neutron/dhcp_agent.ini +[DEFAULT] +interface_driver = openvswitch +enable_isolated_metadata = True +force_metadata = True +EOF +``` + +- Khởi tạo br_provider +``` +systemctl start openvswitch +ovs-vsctl add-br br-provider + +cat << EOF > /etc/sysconfig/network-scripts/ifcfg-provider +DEVICE="br-provider" +TYPE="OVSBridge" +SLAVE="yes" +BOOTPROTO="static" +IPADDR=192.168.30.132 +NETMASK=255.255.255.0 +GATEWAY=192.168.30.1 +DNS1=1.1.1.1 +IPV6INIT="no" +NM_CONTROLLED="yes" +ONBOOT="yes" +DEFROUTE="yes" +PEERDNS="yes" +PEERROUTES="yes" +IPV4_FAILURE_FATAL="yes" +EOF + +cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens192 +DEVICE="ens192" +ONBOOT="yes" +TYPE="OVSPort" +DEVICETYPE="ovs" +OVS_BRIDGE="br-provider" +EOF +ovs-vsctl add-port br-provider ens192 && systemctl restart network + + + + + +``` + +- Khởi động lại dịch vụ +``` + +for service in metadata-agent dhcp-agent openvswitch-agent +do +systemctl restart neutron-$service +systemctl enable neutron-$service +done +``` + +- Cấu hình FirewallD +``` +firewall-cmd --add-port=9696/tcp --permanent +firewall-cmd --reload +``` + +- Kiểm tra các agent trên controller node +``` +[root@controller ~]# openstack network agent list ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| ID | Agent Type | Host | Availability Zone | Alive | State | Binary | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| 1330a4b7-6142-4960-8a9a-3e2e92c2cce1 | Open vSwitch agent | controller | None | :-) | UP | neutron-openvswitch-agent | +| 13817d05-5a3a-4ccf-8beb-eba92d01fc1c | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent | +| 2cee612d-aaae-49e3-87ed-4ad6ea0ac3a9 | DHCP agent | compute1 | nova | :-) | UP | neutron-dhcp-agent | +| 873b5acb-7c26-495c-be77-a16003322fa9 | DHCP agent | compute2 | nova | :-) | UP | neutron-dhcp-agent | +| 92510ebb-ce51-46a1-aba5-2e83dc05012a | Open vSwitch agent | compute1 | None | :-) | UP | neutron-openvswitch-agent | +| 95218dcd-eb5e-4fe1-9678-8059882aac31 | Metadata agent | compute1 | None | :-) | UP | neutron-metadata-agent | +| a26424d4-9084-42b1-b34a-29d63eb2c5cf | Metadata agent | compute2 | None | :-) | UP | neutron-metadata-agent | +| c7383988-54af-4342-90f8-5f71073718ec | Open vSwitch agent | compute2 | None | :-) | UP | neutron-openvswitch-agent | +| e05b5756-b54a-48a7-8cb8-384f31ed56b8 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent | +| e20dc1c0-85da-427a-987b-a65984d9af42 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ + +``` diff --git a/Neutron/3. Neutron-CLI.md b/Neutron/3. Neutron-CLI.md new file mode 100644 index 0000000..112a27b --- /dev/null +++ b/Neutron/3. Neutron-CLI.md @@ -0,0 +1,410 @@ + +# Làm việc với Neutron + +## 1. Khởi tạo Network , Router, Port, Floating IP + +- Khởi tạo external network +```bash +[root@controller ~]# openstack network create --share --provider-network-type flat --provider-physical-network provider net_ex ++---------------------------+--------------------------------------+ +| Field | Value | ++---------------------------+--------------------------------------+ +| admin_state_up | UP | +| availability_zone_hints | | +| availability_zones | | +| created_at | 2018-11-12T01:30:54Z | +| description | | +| dns_domain | None | +| id | 355f6ca6-15f7-4121-a82b-6ee6f4d5fea3 | +| ipv4_address_scope | None | +| ipv6_address_scope | None | +| is_default | False | +| is_vlan_transparent | None | +| mtu | 1500 | +| name | net_ex | +| port_security_enabled | True | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| provider:network_type | flat | +| provider:physical_network | provider | +| provider:segmentation_id | None | +| qos_policy_id | None | +| revision_number | 2 | +| router:external | Internal | +| segments | None | +| shared | True | +| status | ACTIVE | +| subnets | | +| tags | | +| updated_at | 2018-11-12T01:30:54Z | ++---------------------------+--------------------------------------+ +``` + +- Khởi tạo Subnet cho external network + +``` +[root@controller ~]# openstack subnet create --subnet-range 192.168.30.0/24 --dhcp --gateway 192.168.30.1 --network net_ex --allocation-pool start=192.168.30.140,end=192.168.30.160 --dns-nameserver 1.1.1.1 subnet1_ex_net ++-------------------+--------------------------------------+ +| Field | Value | ++-------------------+--------------------------------------+ +| allocation_pools | 192.168.30.140-192.168.30.160 | +| cidr | 192.168.30.0/24 | +| created_at | 2018-11-12T01:35:51Z | +| description | | +| dns_nameservers | 1.1.1.1 | +| enable_dhcp | True | +| gateway_ip | 192.168.30.1 | +| host_routes | | +| id | a8dea47b-2ba5-492b-94ce-263d0a197b4a | +| ip_version | 4 | +| ipv6_address_mode | None | +| ipv6_ra_mode | None | +| name | subnet1_ex_net | +| network_id | 355f6ca6-15f7-4121-a82b-6ee6f4d5fea3 | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| revision_number | 0 | +| segment_id | None | +| service_types | | +| subnetpool_id | None | +| tags | | +| updated_at | 2018-11-12T01:35:51Z | ++-------------------+--------------------------------------+ +``` + +- Khởi tạo một Sefl-Service Network +``` +[root@controller ~]# openstack network create self_net ++---------------------------+--------------------------------------+ +| Field | Value | ++---------------------------+--------------------------------------+ +| admin_state_up | UP | +| availability_zone_hints | | +| availability_zones | | +| created_at | 2018-11-12T01:41:33Z | +| description | | +| dns_domain | None | +| id | 7aeda55f-6845-4dd1-a9c6-436d4ea5ab09 | +| ipv4_address_scope | None | +| ipv6_address_scope | None | +| is_default | False | +| is_vlan_transparent | None | +| mtu | 1450 | +| name | self_net | +| port_security_enabled | True | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| provider:network_type | vxlan | +| provider:physical_network | None | +| provider:segmentation_id | 78 | +| qos_policy_id | None | +| revision_number | 2 | +| router:external | Internal | +| segments | None | +| shared | False | +| status | ACTIVE | +| subnets | | +| tags | | +| updated_at | 2018-11-12T01:41:33Z | ++---------------------------+--------------------------------------+ +``` + +- Khởi tạo subnet cho self-service network + +``` +[root@controller neutron]# openstack subnet create --subnet-range 172.16.1.0/24 --gateway 172.16.1.1 --dns-nameserver 1.1.1.1 --network self_net subnet_self_net ++-------------------+--------------------------------------+ +| Field | Value | ++-------------------+--------------------------------------+ +| allocation_pools | 172.16.1.2-172.16.1.254 | +| cidr | 172.16.1.0/24 | +| created_at | 2018-11-12T02:24:11Z | +| description | | +| dns_nameservers | 1.1.1.1 | +| enable_dhcp | True | +| gateway_ip | 172.16.1.1 | +| host_routes | | +| id | 5255ad53-bd97-49fa-8bdc-279ff971ca10 | +| ip_version | 4 | +| ipv6_address_mode | None | +| ipv6_ra_mode | None | +| name | subnet_self_net | +| network_id | 7aeda55f-6845-4dd1-a9c6-436d4ea5ab09 | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| revision_number | 0 | +| segment_id | None | +| service_types | | +| subnetpool_id | None | +| tags | | +| updated_at | 2018-11-12T02:24:11Z | ++-------------------+--------------------------------------+ +``` + +- Khởi tạo một router +``` +[root@controller ~]# openstack router create router1 ++-------------------------+--------------------------------------+ +| Field | Value | ++-------------------------+--------------------------------------+ +| admin_state_up | UP | +| availability_zone_hints | | +| availability_zones | | +| created_at | 2018-11-12T01:56:30Z | +| description | | +| distributed | False | +| external_gateway_info | None | +| flavor_id | None | +| ha | False | +| id | 89b1fb9f-0347-46f3-bf08-c5c561a6c7a4 | +| name | router1 | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| revision_number | 1 | +| routes | | +| status | ACTIVE | +| tags | | +| updated_at | 2018-11-12T01:56:30Z | ++-------------------------+--------------------------------------+ +``` + +- Gắn external network làm gateway để truy cập internet , còn các mạng self-service cắm vào các interface để tham gia định tuyến +``` +openstack network set --external net_ex +openstack router set router1 --external-gateway net_ex +openstack router add subnet router1 subnet_self_net + +``` + +- Xem thông tin router vừa khởi tạo + +``` +[root@controller neutron]# openstack router show router1 ++-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Field | Value | ++-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| admin_state_up | UP | +| availability_zone_hints | | +| availability_zones | nova | +| created_at | 2018-11-12T02:04:13Z | +| description | | +| distributed | False | +| external_gateway_info | {"network_id": "355f6ca6-15f7-4121-a82b-6ee6f4d5fea3", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "a8dea47b-2ba5-492b-94ce-263d0a197b4a", "ip_address": "192.168.30.145"}]} | +| flavor_id | None | +| ha | False | +| id | 32fe6f32-5bb6-4a89-a24f-df34124e8c76 | +| interfaces_info | [{"subnet_id": "5255ad53-bd97-49fa-8bdc-279ff971ca10", "ip_address": "172.16.1.1", "port_id": "94e669bc-adde-47d2-9b49-6dd57b1ec189"}] | +| name | router1 | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| revision_number | 13 | +| routes | | +| status | ACTIVE | +| tags | | +| updated_at | 2018-11-12T02:24:39Z | ++-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + +- Liệt kê các port +``` +[root@controller neutron]# openstack port list ++--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+ +| ID | Name | MAC Address | Fixed IP Addresses | Status | ++--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+ +| 9175a03d-7d47-4b57-966c-30bbf1cfa845 | | fa:16:3e:65:f7:8c | ip_address='172.16.1.2', subnet_id='5255ad53-bd97-49fa-8bdc-279ff971ca10' | ACTIVE | +| 94e669bc-adde-47d2-9b49-6dd57b1ec189 | | fa:16:3e:12:2d:c7 | ip_address='172.16.1.1', subnet_id='5255ad53-bd97-49fa-8bdc-279ff971ca10' | ACTIVE | +| ab735c5b-426f-4d69-977b-7c305f772980 | | fa:16:3e:2d:ea:66 | ip_address='192.168.30.145', subnet_id='a8dea47b-2ba5-492b-94ce-263d0a197b4a' | ACTIVE | +| fc83c1c9-13e9-483a-a39f-d98872648c82 | | fa:16:3e:ae:ea:40 | ip_address='192.168.30.140', subnet_id='a8dea47b-2ba5-492b-94ce-263d0a197b4a' | ACTIVE | ++--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+ +``` +- Xem thông tin cụ thể của một Port +``` +[root@controller neutron]# openstack port show 9175a03d-7d47-4b57-966c-30bbf1cfa845 ++-----------------------+-------------------------------------------------------------------------------+ +| Field | Value | ++-----------------------+-------------------------------------------------------------------------------+ +| admin_state_up | UP | +| allowed_address_pairs | | +| binding_host_id | controller | +| binding_profile | | +| binding_vif_details | port_filter='True' | +| binding_vif_type | bridge | +| binding_vnic_type | normal | +| created_at | 2018-11-12T02:24:12Z | +| data_plane_status | None | +| description | | +| device_id | dhcpd3377d3c-a0d1-5d71-9947-f17125c357bb-7aeda55f-6845-4dd1-a9c6-436d4ea5ab09 | +| device_owner | network:dhcp | +| dns_assignment | None | +| dns_name | None | +| extra_dhcp_opts | | +| fixed_ips | ip_address='172.16.1.2', subnet_id='5255ad53-bd97-49fa-8bdc-279ff971ca10' | +| id | 9175a03d-7d47-4b57-966c-30bbf1cfa845 | +| ip_address | None | +| mac_address | fa:16:3e:65:f7:8c | +| name | | +| network_id | 7aeda55f-6845-4dd1-a9c6-436d4ea5ab09 | +| option_name | None | +| option_value | None | +| port_security_enabled | False | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| qos_policy_id | None | +| revision_number | 7 | +| security_group_ids | | +| status | ACTIVE | +| subnet_id | None | +| tags | | +| trunk_details | None | +| updated_at | 2018-11-12T02:24:17Z | ++-----------------------+-------------------------------------------------------------------------------+ + +``` + +- Khởi tạo **Floating IP ** , gắn Floating IP đến cho các instance với các IP từ ISP để có thể truy cập từ ngoài internet sử dụng DNAT +``` +[root@controller neutron]# openstack floating ip create net_ex + +---------------------+--------------------------------------+ +| Field | Value | ++---------------------+--------------------------------------+ +| created_at | 2018-11-12T02:33:25Z | +| description | | +| fixed_ip_address | None | +| floating_ip_address | 192.168.30.142 | +| floating_network_id | 355f6ca6-15f7-4121-a82b-6ee6f4d5fea3 | +| id | 78f10521-fc1d-4f0f-af0e-49b209073261 | +| name | 192.168.30.142 | +| port_id | None | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| qos_policy_id | None | +| revision_number | 0 | +| router_id | None | +| status | DOWN | +| subnet_id | None | +| updated_at | 2018-11-12T02:33:25Z | ++---------------------+--------------------------------------+ + +``` + + +## 2. Xóa Router, Subnet, Network + +### 2.1. Xóa Self-Service Subnet đang Binding Router +- **Để xóa một subnet đang gắn vào một router cần xóa subnet đó khỏi router để xóa các port đang đc binding** + +- Xem router nào đang chứa subnet +``` +[root@controller neutron]# openstack router show router1 ++-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Field | Value | ++-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| admin_state_up | UP | +| availability_zone_hints | | +| availability_zones | nova | +| created_at | 2018-11-12T02:04:13Z | +| description | | +| distributed | False | +| external_gateway_info | {"network_id": "355f6ca6-15f7-4121-a82b-6ee6f4d5fea3", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "a8dea47b-2ba5-492b-94ce-263d0a197b4a", "ip_address": "192.168.30.145"}]} | +| flavor_id | None | +| ha | False | +| id | 32fe6f32-5bb6-4a89-a24f-df34124e8c76 | +| interfaces_info | [{"subnet_id": "5255ad53-bd97-49fa-8bdc-279ff971ca10", "ip_address": "172.16.1.1", "port_id": "94e669bc-adde-47d2-9b49-6dd57b1ec189"}] | +| name | router1 | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| revision_number | 13 | +| routes | | +| status | ACTIVE | +| tags | | +| updated_at | 2018-11-12T02:24:39Z | ++-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +``` +- Xóa Subnet ra khởi router +``` +[root@controller]# openstack router remove subnet router1 5255ad53-bd97-49fa-8bdc-279ff971ca10 + +``` + +- Xóa Subnet +``` +[root@controller neutron]# openstack subnet delete 5255ad53-bd97-49fa-8bdc-279ff971ca10 + +``` + + +## 2.2. Xóa Self-service Network + +- Khi xóa một Network thì sẽ xóa các Subnet đang binding vào +``` +[root@controller]# openstack network list ++--------------------------------------+----------+----------------------------------------------------------------------------+ +| ID | Name | Subnets | ++--------------------------------------+----------+----------------------------------------------------------------------------+ +| 355f6ca6-15f7-4121-a82b-6ee6f4d5fea3 | net_ex | a8dea47b-2ba5-492b-94ce-263d0a197b4a | +| 7aeda55f-6845-4dd1-a9c6-436d4ea5ab09 | self_net | 06dd5897-280a-496c-90ad-0608e2d663ac, d73d8c19-290f-4e59-bb8d-38284136c3ca | ++--------------------------------------+----------+----------------------------------------------------------------------------+ +[root@controller]# openstack network delete 7aeda55f-6845-4dd1-a9c6-436d4ea5ab09 +[root@controller neutron]# + +``` + + +## 3. Quản lý Security Group +- Security Group đảm nhiệm nhiệm vụ filter như `iptables` +``` +[root@controller neutron]# openstack project list ++----------------------------------+---------+ +| ID | Name | ++----------------------------------+---------+ +| 9373ec3c823343de87ae613b972aa4d3 | admin | +| e66cc62b00304934a61f929704ea5320 | service | ++----------------------------------+---------+ + +[root@controller neutron]# openstack security group list ++--------------------------------------+---------+------------------------+----------------------------------+ +| ID | Name | Description | Project | ++--------------------------------------+---------+------------------------+----------------------------------+ +| 3e5cf3f1-1a13-4427-8b5a-d5fcc7d30690 | default | Default security group | | +| 9b14072f-0061-4805-8b18-e87c7c22cb38 | default | Default security group | 9373ec3c823343de87ae613b972aa4d3 | ++--------------------------------------+---------+------------------------+----------------------------------+ + +``` +- Xem thông tin của một security group +``` +[root@controller neutron]# openstack security group show 9b14072f-0061-4805-8b18-e87c7c22cb38 ++-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Field | Value | ++-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| created_at | 2018-11-12T01:30:53Z | +| description | Default security group | +| id | 9b14072f-0061-4805-8b18-e87c7c22cb38 | +| name | default | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| revision_number | 4 | +| rules | created_at='2018-11-12T01:30:53Z', direction='ingress', ethertype='IPv6', id='1d324537-0b8c-4ef4-952d-64f0e698a54f', remote_group_id='9b14072f-0061-4805-8b18-e87c7c22cb38', updated_at='2018-11-12T01:30:53Z' | +| | created_at='2018-11-12T01:30:53Z', direction='egress', ethertype='IPv4', id='4a823012-a991-49bc-a5d9-a0adb4ae524d', updated_at='2018-11-12T01:30:53Z' | +| | created_at='2018-11-12T01:30:53Z', direction='egress', ethertype='IPv6', id='70cfc983-dac3-4113-b0b8-c0e522532e91', updated_at='2018-11-12T01:30:53Z' | +| | created_at='2018-11-12T01:30:53Z', direction='ingress', ethertype='IPv4', id='a421e093-d749-4c10-9cca-12744887bc21', remote_group_id='9b14072f-0061-4805-8b18-e87c7c22cb38', updated_at='2018-11-12T01:30:53Z' | +| updated_at | 2018-11-12T01:30:53Z | ++-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` +Như vậy đã có một sececurity đã được tạo trên project admin + +- Khởi tạo một rule mới + +``` +[root@controller neutron]# openstack security group rule create --protocol tcp --dst-port 22 --project admin 9b14072f-0061-4805-8b18-e87c7c22cb38 ++-------------------+--------------------------------------+ +| Field | Value | ++-------------------+--------------------------------------+ +| created_at | 2018-11-12T03:08:10Z | +| description | | +| direction | ingress | +| ether_type | IPv4 | +| id | a4708c13-7e9e-44fa-904e-4c6a0a9f97f0 | +| name | None | +| port_range_max | 22 | +| port_range_min | 22 | +| project_id | 9373ec3c823343de87ae613b972aa4d3 | +| protocol | tcp | +| remote_group_id | None | +| remote_ip_prefix | 0.0.0.0/0 | +| revision_number | 0 | +| security_group_id | 9b14072f-0061-4805-8b18-e87c7c22cb38 | +| updated_at | 2018-11-12T03:08:10Z | ++-------------------+--------------------------------------+ + +``` diff --git a/Neutron/4. Neutron-Namespace-Agent.md b/Neutron/4. Neutron-Namespace-Agent.md new file mode 100644 index 0000000..c300020 --- /dev/null +++ b/Neutron/4. Neutron-Namespace-Agent.md @@ -0,0 +1,97 @@ + +# TÌm hiểu Namepsace , DHCP, Agent trong OPS + +## 1. Overlapping network trong OPS + +- Overlapping được hiểu là một mạng máy tính được xây dựng trên một nền tảng network mạng sẵn +- Openstack cung cấp môi trường Multi Tenant . Mỗi tenant cung cấp một mạng prviate , router, firewall , loadblancer riêng . Nhờ namepsace cung cấp khả năng tách biết các tài nguyên mạng giữa các tenant - network namespace +- Để xem được namepsace có thể sử dụng +```bash +[root@controller nova]# ip netns list +qrouter-32fe6f32-5bb6-4a89-a24f-df34124e8c76 (id: 2) +qdhcp-355f6ca6-15f7-4121-a82b-6ee6f4d5fea3 (id: 0) +[root@controller nova]# +``` +- Các namespace hiển thị dưới dạng + - qdhcp-* + - qrouter-* + - qlbaas-* +- Để thực hiện một comman trên một namespace có thể sử dụng +``` +[root@controller nova]# ip netns exec qrouter-32fe6f32-5bb6-4a89-a24f-df34124e8c76 ping 1.1.1.1 +PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. +64 bytes from 1.1.1.1: icmp_seq=1 ttl=57 time=37.3 ms +64 bytes from 1.1.1.1: icmp_seq=2 ttl=57 time=37.7 ms +64 bytes from 1.1.1.1: icmp_seq=3 ttl=57 time=38.3 ms +64 bytes from 1.1.1.1: icmp_seq=4 ttl=57 time=38.8 ms +64 bytes from 1.1.1.1: icmp_seq=5 ttl=57 time=37.4 ms +^C +--- 1.1.1.1 ping statistics --- +5 packets transmitted, 5 received, 0% packet loss, time 4001ms +rtt min/avg/max/mdev = 37.317/37.923/38.822/0.601 ms + +``` +Như vậy router đã tạo từ trước, gắn network `net_ex` đã có thể giao tiếp với internet + + +- Khi một namespace khởi tạo , neutron cũng khởi tạo đồng thời một DHCP and routing service cho từng network riêng biệt. +- Namespace qdhcp chứa DHCP Service cung cấp địa chỉ IP cho các instance sử dụng DHCP Protocol . Trong quá thực hiện, ``dnsmasq`` đảm nhiệm xử lý các DHCP Request . qdhcp namespace như một host ảo, được cắm vào một interface trong virtual switch, do đó sẽ có khả năng kết nối với các instance đã được gắn vào network nào đó. +- Namesapce qrouter như một router ảo , và đảm nhiệm routing từ các instance được gắn vào network . Router được gắn vào các network khác nhau có thể routing giữa các mạng2 + + + + +## 2. Neutron Agent + + + + +- Một agent trong neutron đảm nhiệm các nhiệm vụ khác nhau để tác động tới các mạng ảo . Trong neutron gồm các agent cơ bản sau : neutron-dhcp-agent, neutron-l3-agent, neutron-metering-agent, and neutron-lbaas-agent, +- Các agent cơ bản khi khi triển khai ` self-service network` +``` +[root@controller nova]# openstack network agent list ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| ID | Agent Type | Host | Availability Zone | Alive | State | Binary | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +| b68cd06e-384f-47d7-88e4-dd5a6a85796c | Linux bridge agent | compute1 | None | :-) | UP | neutron-linuxbridge-agent | +| c4eb82a1-d86a-4eb8-a230-f62b567d4df8 | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent | +| ce13fbcc-e0e6-4b55-87cd-7bdfe58ce357 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent | +| e2279058-9cad-4e05-801d-51a8f16b6850 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent | +| f7fc3ab5-35c5-4968-a349-79ba6820d25a | Linux bridge agent | controller | None | :-) | UP | neutron-linuxbridge-agent | ++--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+ +``` + +### 2.1 : ML2 plugin , agent + +- Modular Layer 2 (ml2) cung cấp một framework cho phép neutron tương tác với các hạ tầng Layer 2 hiện đang có trong các DC. Ml2 framework gồm có 2 driver riêng biệt + - Type driver : giúp neutron xác đinh được công nghệ sử dụng : Ví dụ như VLAN . Với mỗi kiểu network được quản lý bởi ML2 Type Driver , xác định trạng thái mạng cụ thể và chịu trách nhiệm cho các segment layer 2 + - Mechanism drivers : giúp neutron xác định rõ ràng các làm việc với một loại mạng cụ thể . Type driver cung cấp mạng quản lý sau đó Mechanism driver sẽ đến các device ở ngoài để làm việc với một mạng nào đó . + +![](https://i.imgur.com/Scd4iLz.png) + +- L2 agent serves phục vụ khả năng làm việc với Layer 2. Thường năm trên Network Node và trên mỗi Compute Node + +### 2.2 : L3 Agent +- Cung cấp khả năng làm việc với các dịch vụ Layer 3 : virtual Routers và Floating IP + +- Yêu cầu có sẵn một L2 Agent + + +### 2.3. DHCP agent + +- Đảm nhiệm nhiệm vụ DHCP . +- Yêu cầu có sẵn một L2 Agent + +### 2.4. Meta Data agent + +- Cung cấp khả gửi các cloud init data tới các instance thông tin network +- Yêu cầu có sẵn một L2 Agent + +![](https://i.imgur.com/mpKFxQO.png) + +## 3. Tham khảo thêm + +TÌm hiểu thêm tại : +[1] : https://objects-east.cloud.ca/v1/5ef827605f884961b94881e928e7a250/crivera/AYCE%20Neutron.pdf + +[2] : https://dischord.org/2015/03/09/troubleshooting-openstack-neutron-networking-part-one/ diff --git a/Neutron/5. Packet-Walkthrough-Linux-Bridge.md b/Neutron/5. Packet-Walkthrough-Linux-Bridge.md new file mode 100644 index 0000000..8ad0515 --- /dev/null +++ b/Neutron/5. Packet-Walkthrough-Linux-Bridge.md @@ -0,0 +1,151 @@ + + +# Neutron Traffic Flow trong Linux Bridge + + +## 1. Provider network + +### 1.1 . North - South : instance with IP Floating + +![](https://docs.openstack.org/neutron/pike/_images/deploy-lb-provider-flowns1.png) + +Quá trình truyền tải trên compute node : + +- B1 : Instance interface sẽ gửi packet đến cổng tương ứng của instance trên provider bridge (1) thông qua kết nối `veth` ( 2 ) +- B2 : Security group trên LB sẽ kiểm soát traffic (3) +- B3 : Các sub-interface trên provider bridge sẽ chuyển các frame đến physical interface ( có thể là VLAN subport hoặc flat ) (4 ) +- B4 : Physical interface sẽ (5 ) chuyển tiếp các traffic ra ngoài switch ngoài hạ tầng ( có thể gắn VLAN_ID hoặc no_tag ) (6 ) +- B5.: Khi đến swtich vật lý ( 6 ) các frame sẽ được bỏ VLAN và chuyển đến router ( 7 ) +- B6. Router nhận packet từ provider network sau đó sẽ gửi ra mạng ngoài ( 8 ) + + +### 1.2. East - West - same network + +![](https://docs.openstack.org/neutron/pike/_images/deploy-lb-provider-flowew1.png) + +Các instance thuộc các compute node khác nhau liên hệ với nhau trên cùng một network +Đường đi của của các instance +- B1 : instance interface (1 ) sẽ gửi các packet đến tun port tương ứng trên provider bridge (2) nhờ vào `veth` pair +- B2 : Security group (3 sẽ làm việc kiểm soát các packet +- B3. Các sub_interface (4 ) trên bridge sẽ gửi các packet tới physical interface ( 5 ) - có thể VLAN_port hoặc no_tag +- B4. Physical interface ( 5 ) sẽ gắn VLAN_ID tương ứng với VLAN_PORT hoặc no_tag sau đó gửi frame đến swtich ( 6 ) +- B5. Switch sẽ gửi frame từ compute 1 đến compute 2 ( 7 ) +- B6. Physical interface ( 8 ) trên Compute sẽ bỏ VLAN_ID ( hoặc không ) sau đó gửi đến VLAN_sub interface tương ứng ( 9 ) trên provider bridge +- B7. Security group sẽ kiểm soát packet ( 10 ) +- B8. Provider bridge gửi packet đến instance interface + +### 1.3 . East-west - different network + +![](https://docs.openstack.org/neutron/pike/_images/deploy-lb-provider-flowew2.png) + +Các instance thuộc các compute node khác nhau liên hệ với nhau khác network +- Trên Compute 1 + - B1. instance interface ( 1 ) sẽ gửi packet đến đến port trên provider bridge nhờ `veth` pair ( 2 ) + - B2. Security group ( 3 ) sẽ kiểm soát traffic + - B3. VLAN sub_interface hoặc no_vlan (4 ) trên provider bridge packet đến physical interface + - B4. Physical interface ( 5 ) sẽ thêm VLAN_ID vào frame sau đó gửi frame đến switch vật lý ( 6 ) + +- Trên mạng vật lý + - B1. Switch sẽ bỏ VLAN_ID trên sau đó gửi packet đến router ( 7 ) + - B2. Router gửi packet từ provider network 1 ( 8 ) sang provider network 2 ( 9 ) + - B3. Router sẽ gửi packet đến swtich ( 10 ) + - B4. Swtich thêm VLAN_ID hoặc no_tag sau đó gửi frame đến compute 2 ( 11 ) + +- Trên Compute 2 : + - B1. Trên physical interface ( 12 )sẽ bỏ VLAN_ID và gửi packet đến sub_port trên provider bridge ( 13 + - B2. Security group sẽ kiểm soát traffic ( 14 ) + - B3. Provider bridge (15 ) sẽ gửi packet đến port của instance 2 ( 16 ) + +## 2. Self-service Network + +- Trong self-service các instance sẽ sử dụng IPv4 Private . Để truy cập được interface , networking service sẽ làm nhiệm vụ SNAT ( Source Network Addresss Translation ) để truy cập ra mạng external . . Để từ các mạng có thể truy cập , các instance yêu cầu có một floating IP . Networking service thực hiện DNAT ( desnation network address translation ) từ IP Floating sang IP self-service + + +### 2.1. North-south - instance with Fixed IP V4 +![](https://docs.openstack.org/neutron/pike/_images/deploy-lb-selfservice-flowns1.png) +Với các instance kèm IP v4 Floating, trên network node sẽ thực hiện SNAT để self-service có thể giao tiếp với mạng ngoài + +Đường đi của instance đi ra internet : +- Trên compute node : + - B1 : instance interface ( 1 ) sẽ gửi packet đến port tương ứng đến bridge sử dụng `veth` pair ( 2 ) + - B2 : Security group ( 3 ) sẽ đảm nhiệm filter traffic (3 ) + - B3 : Self-service bridge sẽ chuyển packet tới VXLAN interface trên bridge ( 4 ) kèm VNI + - B4 : Physical interface ( 5 ) cho phép mạng Overlay XVLAN chuyển packet lên network node ( 6 ) + +- Trên network node : + - B1 : Physical network ( 7 ) nhận packet từ Overlay VXLAN Interface sau đó chuyển lên Self-service bridge port ( 8 ) + - B2 : Self-service bridge( 9 ) sẽ gửi packet đến router namespace .( 10 ) Với IPv4. router namespace sẽ thực hiện SNAT, thay đổi IP nguồn thành Router IP của Provider Network ( 11 ) . + - B3 : Router gửi packet đến provider bridge ( 12 ) + - B4 : VLAN sub_interface trên provider bridge sẽ gửi packet đến provider physical network interface . + - B5 : Provider physical network thêm VLAN Tag và đi ra internet + +![](https://docs.openstack.org/mitaka/install-guide-ubuntu/_images/network2-overview.png) + + +### 2.2. North-South : instance with floating IP + +![](https://docs.openstack.org/neutron/pike/_images/deploy-lb-selfservice-flowns2.png) + +Quá trình một host từ internet gửi packet cho instance + +- Trên network node : + - B1: Từ mạng vật lý ( 1 ) gửi packet vào provider physical interface ( 2 ) + - B2: Provider physical interface ( 3 ) sẽ bỏ các VLAN_TAG và sẽ gửi các packet vào VLAN Sub_interface tương ứng trên provider bridge ( 4 ) + - B3 : Provider bridge sẽ chuyển packet sang self-service router gateway port ( 5 ) + - Với IPv4, router đảm nhiệm thực hiện DNAT để thay đổi địa chỉ đích IP thành IP Floating của instance trên self-service network . ( 6 ) + - B4 : Router chuyển gói tin đến tin đến self-service bridge port ( 7 ) + - B5 : Self-service bridge gửi packet đến VXLAN Interface kèm theo VNI ( 8 ) + - B6 : Physical network interface( 9 ) gửi packet đến compute node thông qua Overlay network ( 10 ) + +Trên compute node: + - B1 : Physical interface ( 11 ) send packet tới VXLAN interface ở self-server bridge ( 12 ) + - B2 : Security group đảm nhiệm filter packet ( 13 ) + - B3 : Self-service bridge chuyển packet đến instance port + + + +### 2.3 East-west - same network + + +![](https://docs.openstack.org/neutron/pike/_images/deploy-lb-selfservice-flowew1.png) + +Trên Compute 1 : +- B1 : Instance interface ( 1 ) chuyển packet đến self-service port tương ứng ( 2 ) +- B2 : Security group ( 3 ) đảm nhiệm filter data +- B3 : Self-service bridge ( 4 ) chuyển tiếp packet tới VXLAN Interface kèm theo VNI +- B4 : Physical interface ( 5 ) chuyển tiếp packet tới compute 2 nhờ overlay network ( 6 ) + +Trên Compute 2 : +- B1 : Trên physical ( 7 ) interface cho phép XVLAN interface chuyển tiếp packet tới XVLAN interface ( 8 ) +- B2 : Security group ( 9 ) đảm nhiệm filter data +- B3 : Self-service bridge ( 10 ) chuyển data tới instance interface ( 11 ) + + +### 2.3 East-west - different network + +![](https://docs.openstack.org/neutron/pike/_images/deploy-lb-selfservice-flowew2.png) + +### 3. Một số quy ước trong Neutron OVS + +**Trên compute node** +- Linux bridge: qbr-ID +- Linux bridge nằm giữa VM và br-int, gồm 2 port: + - port tap gắn với VM: tap-ID + - port veth pair gắn với br-int: qvb-ID +- Br-int : + - port veth pair gắn với linux bridge: qvo-ID + - port patch gắn với br-tun + +Trên 1 network thì các port của các thiết bị này có chung ID là ID của network đó. + +**Trên network node** +- Br-int: cung cấp router ảo và DHCP cho instance. gồm các port: + - port tap gắn với DHCP namespace: tap-ID + - port qr gắn với router namespace: qr-ID +- Br-ex: cung cấp external connection. Gồm port qg gắn với router namespace: qg-ID + +![](https://www.rdoproject.org/images/neutron_architecture.png?1495114718) +## 4. Tham khảo thêm + +[1] : https://docs.openstack.org/neutron/pike/admin/deploy-lb-provider.html +[2]: https://docs.openstack.org/neutron/pike/admin/deploy-lb-selfservice.html diff --git a/Neutron/6. Bonding.md b/Neutron/6. Bonding.md new file mode 100644 index 0000000..d54d55d --- /dev/null +++ b/Neutron/6. Bonding.md @@ -0,0 +1,184 @@ + +# Tìm hiểu bonding trong Centos + + +## 1. Linux Bonding + +## 1. Khái niệm +- Linux cho phép quản trị viên bonnding interface từ 2 hoặc nhiều interface kết hợp thành 1 interface ảo có tên `bonding interface` bằng cách sử dụng module kernel "bonding " trên Linux . +- Bằng cách này giúp nhiều interface vật lý hoạt động như một network interface nhằm : tăng bandwidth, tăng tính dự phòng nếu 1 card vật lý chết thì sẽ còn card còn lại + +## 2. Các mode bonding + +| Mode | Chính sách | Hoạt động | Khả năng chịu lỗi | Cân bằng tải | +|--------|---------|-----|------------|--------| +|0 |Round Rubin | Các packet được truyền / nhận tuần tự trên từng giao diện | Không | Có | +|1| Active Backup | khi một NIC active thì NIC khi sẽ ở trạng thái sleep và ngược lại , chỉ hỗ trợ trên x86 | Có | Không| +|2|XOR| Truyền tải dựa trên địa chỉ MAC nguồn mà MAC đích | Có | Có | +| 3 |Broadcast | Truyền packet trên tất cả slave interface | Có|Không | +|4|Dynamic Link Aggregation 802.3ad | Tạo một nhóm các interface cùng tốc độ và duplex . Yêu cầu swtich hỗ trợ IEEE 802.3ad | Yes | Yes | +|5 | Transmit Load Balancing (TLB)| cân bằng tải trên quá trình truyền dữ liệu ra ngoài : lưu lượng packet ra ngoài sẽ phân phối tùy thuộc vào % chịu tải còn rảnh lên các slave interface . Lưu lượng đến sẽ gửi đến một slave , nối bị lỗi sẽ chiếm địa chỉ MAC và đảm nhiệm nhận packet| +|6| Adaptive Load Balancing (ALB)| Cân bằng tải thích ứng: bao gồm cả cân bằng tải truyền (balance-tlb) và cân bằng tải nhận (rlb - receive load balancing) đối với lưu lượng IPv4 Bonding driver sẽ chặn các bản tin phản hồi ARP gửi bởi hệ thống cục bộ trên đường ra và ghi đè địa chỉ MAC nguồn bằng địa chỉ MAC của một trong các slaves trên đường bond.. Chỉ hỗ trợ trên x86 | Có | Có | + + + +## 3. Các parameter trong bonding + +- max_bonds : số lượng bond driver tạo ra +- tx_queues : số lượng packet ở hàng đợi truyền tải +- num_grat_arp : số thông báo ngang hàng để xác định failover ovent +- miimon : milliseconds để xác định failover +- updelay : số milliseconds trì hoãn trước khi cho 1 slave thành thạng tháo up +- downdelay : số milliseconds trì hoãn trước khi hủy 1 slave khi bị down +- arp_interval : ARP monitor làm việc theo chu kì để check slave xem nó gửi hay nhận nhưng traffic gần nhất. Tùy chọn này cho phép kích hoạt ARP monitoring, mặc định nó sẽ bị disabled, giá trị mặc định cũng là 0. +- arp_ip_target : Chỉ ra địa chỉ IP sẽ dược dùng làm ARP monitoring khi mà giá trị `arp_interval` > 0. +- primary : Các card mạng sẽ được lựa chọn để làm primary device. Card mạng nào được chọn thì nó sẽ luôn là active slave nếu thời điểm đó nó available. Tùy chọn này chỉ có tác dụng ở mode 1, 5, và 6. + +## 4. Lab Bonding Centos 7 + + + +- Load module boding +``` +modprobe bonding +``` + +- Khởi tạo một bond interface mới + +``` +cat << EOF > /etc/sysconfig/network-scripts/ifcfg-bond0 +DEVICE=bond0 +NAME=bond0 +TYPE=Bond +BONDING_MASTER=yes +IPADDR=192.168.30.131 +PREFIX=24 +GATEWAY=192.168.30.1 +ONBOOT=yes +BOOTPROTO=none +BONDING_OPTS="mode=1 miimon=100" +EOF +``` + + +- Sửa cấu hình trên 2 interface slave `ens224`, `ens256` + +``` + +cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens224 +TYPE=Ethernet +PROXY_METHOD=none +BROWSER_ONLY=no +BOOTPROTO=none +DEFROUTE=yes +IPV4_FAILURE_FATAL=no +IPV6INIT=yes +IPV6_AUTOCONF=yes +IPV6_DEFROUTE=yes +IPV6_FAILURE_FATAL=no +NAME=ens224 +DEVICE=ens224 +ONBOOT=yes +DNS1=8.8.8.8 +DNS2=8.8.4.4 +MASTER=bond0 +SLAVE=yes + +EOF + +cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens256 +TYPE=Ethernet +PROXY_METHOD=none +BROWSER_ONLY=no +BOOTPROTO=none +DEFROUTE=yes +IPV4_FAILURE_FATAL=no +IPV6INIT=yes +IPV6_AUTOCONF=yes +IPV6_DEFROUTE=yes +IPV6_FAILURE_FATAL=no +NAME=ens256 +DEVICE=ens256 +ONBOOT=yes +DNS1=8.8.8.8 +DNS2=8.8.4.4 +MASTER=bond0 +SLAVE=yes + +EOF + +``` + +- Khởi động lại network service +``` +systemctl restart network +``` + +- Kiểm tra IP trên cổng interface bond + +``` + +[root@compute1 network-scripts]# ip a +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: ens192: mtu 1500 qdisc mq state UP group default qlen 1000 + link/ether 00:0c:29:0a:98:b6 brd ff:ff:ff:ff:ff:ff + inet 192.168.30.131/24 brd 192.168.30.255 scope global noprefixroute ens192 + valid_lft forever preferred_lft forever + inet6 fe80::c787:c683:5333:de24/64 scope link noprefixroute + valid_lft forever preferred_lft forever +3: ens224: mtu 1500 qdisc mq master bond0 state UP group default qlen 1000 + link/ether 00:0c:29:0a:98:c0 brd ff:ff:ff:ff:ff:ff +8: ens256: mtu 1500 qdisc mq master bond0 state UP group default qlen 1000 + link/ether 00:0c:29:0a:98:c0 brd ff:ff:ff:ff:ff:ff +9: bond0: mtu 1500 qdisc noqueue state UP group default qlen 1000 + link/ether 00:0c:29:0a:98:c0 brd ff:ff:ff:ff:ff:ff + inet 192.168.30.131/24 brd 192.168.30.255 scope global noprefixroute bond0 + valid_lft forever preferred_lft forever + inet6 fe80::20c:29ff:fe0a:98c0/64 scope link + valid_lft forever preferred_lft forever + +``` + + +- Kiểm tra thông tin bond interface +``` +[root@compute1 network-scripts]# cat /proc/net/bonding/bond0 +Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) + +Bonding Mode: fault-tolerance (active-backup) +Primary Slave: None +Currently Active Slave: ens224 +MII Status: up +MII Polling Interval (ms): 100 +Up Delay (ms): 0 +Down Delay (ms): 0 + +Slave Interface: ens224 +MII Status: up +Speed: 10000 Mbps +Duplex: full +Link Failure Count: 0 +Permanent HW addr: 00:0c:29:0a:98:c0 +Slave queue ID: 0 + +Slave Interface: ens256 +MII Status: up +Speed: 10000 Mbps +Duplex: full +Link Failure Count: 0 +Permanent HW addr: 00:0c:29:0a:98:ca +Slave queue ID: 0 + +``` + + +## 5. Tham khảo thêm + +[1] : https://www.unixmen.com/linux-basics-create-network-bonding-on-centos-76-5/ + +[2]: https://www.server-world.info/en/note?os=CentOS_6&p=bonding diff --git a/Neutron/7. VXLAN.md b/Neutron/7. VXLAN.md new file mode 100644 index 0000000..52b97d9 --- /dev/null +++ b/Neutron/7. VXLAN.md @@ -0,0 +1,176 @@ + +## Tìm hiểu VXLAN + + + +## 1. Vấn đề với VLAN + +- VLAN được sử dụng chủ yếu để cô lập dữ liệu trên layer 2. Các môi trường mạng lớn yêu cầu mở rộng khả năng cô lập lớn hơn khả năng đáp ứng của VLAN + - Hiện tại VLAN chỉ hỗ trợ tối đa tối đa 12 bit VLAN_ID, bị giới hạn trong 4096 VLAN_ID + - Sử dụng STP cung cấp một topology L2 chống loop và cắt bỏ đi hầu hết những liên kết dư lừa. + - Vấn đề lưu trữ MAC trên các swtich khi số lượng máy ảo quá nhiều, có thể dẫn đến trùng MAC Adress + + +## 2. VXLAN là gì ? + + +- **VXLAN (Virtual eXtensible LANs)**: đây là công nghệ cung cấp dịch vụ để kết nối Ethernet tới các thiết bị cuối như VLAN ngày nay, nhưng có nhiều tính năng mở rộng hơn. So sánh với VLAN, VXLAN được mở rộng hơn về quy mô và khả năng triển khai chúng. + +- Trong chuẩn định nghĩa cho VLAN 802.1q chỉ dành ra 12 bit để đánh VLAN-ID. VXLAN sử dụng 24 bit để đánh địa chỉ VLAN_ID. Nghĩa là nó sẽ hỗ trợ không gian địa chỉ VXLAN_ID lên tới 4 lần so với VLAN, tức là khoảng hơn 16 triệu. Điều này sẽ cung cấp đủ không gian để triển khai các quy mô mạng trong vài năm tới. + +- VXLAN sử dụng IP (cả unicast và multicast) như phương tiện truyền. Sự phổ biến của mạng IP và các thiết bị cho phép đầu cuối sẽ cho phép khả năng mở rộng vượt trội tiến xa hơn rất nhiều so với VLAN sử dụng 802.1q hiện nay. Không gì có thể phủ nhận rằng các công nghệ khác có thể mở rộng được phạm vi của VLAN, nhưng không có gì có thể triển khai phổ biến như mạng IP. + + +## 3. Các khái niệm trong VXLAN ? + +### 1.3.1. VNI + +- VXLAN hoạt động trên cơ sở hạ tầng mạng hiện có và cung cấp một phương tiện để *"kéo dài"* một mạng lớp 2. Tóm lại, VXLAN là một mạng lớp 2 overlay trên mạng lớp 3. Mỗi lớp mạng như vậy được gọi là VXLAN segment. Chỉ các máy ảo trong cùng VXLAN segment mới có thể giao tiếp với nhau. Mỗi VXLAN segment được xác định thông qua ID kích thước 24 bit, gọi là **VXLAN Network Identifier (VNI)**. Điều này cho phép tối đa 16 triệu các VXLAN segment cùng tồn tại trong cùng một domain. + +- VNI xác định phạm vi của inner MAC frame sinh ra bởi máy ảo VM. Do đó, bạn có thể overlapping địa chỉ MAC thông qua segment như không bị lẫn lộn các lưu lượng bởi chúng đã bị cô lập bởi VNI khác nhau. VNI nằm trong header được đóng gói với innere MAC sinh ra bởi VM. + + ![](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.1.png) + +### 1.3.2. Encapsulation và VTEP + +- VXLAN là công nghệ overlay qua lớp mạng. Overlay Network có thể được định nghĩa như là một mạng logic mà được tạo trên một nền tảng mạng vật lý đã có sẵn. +VXLAN tạo một mạng vật lý layer 2 trên lớp mạng IP. Dưới đây là 2 từ khóa được dùng trong công nghệ overlay network: + + - **Encapsulate**: Đóng gói những gói tin ethernet thông thường trong một header mới. Ví dụ: trong công nghệ overlay IPSec VPN, đóng gói gói tin IP thông thường vào một IP header khác. + + - **VTEP**: Việc liên lạc được thiết lập giữa 2 đầu tunnel end points (đường ống). + +- Khi bạn áp dụng vào với công nghệ overlay trong VXLAN, bạn sẽ thấy VXLAN sẽ đóng gói một frame MAC thông thường vào một UDP header. Và tất cả các host tham gia vào VXLAN thì hoạt động như một tunnel end points. Chúng gọi là Virtual Tunnel Endpoints (VTEPs) + +- VTEPs là các node mà cung cấp các chức năng Encalsulation và De-encapsulation. Chúng biết rõ được làm thế nào mà VTEPs encap và de-encap lưu lượng từ bất kì máy ảo kết nối với một mạng VXLAN dựa trên mạng vật lý layer 2. + + ![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.2.png) + +- VXLAN học tất cả các địa chỉ MAC của máy ảo và việc kết nối nó tới VTEP IP thì được thực hiện thông qua sự hỗ trợ của mạng vật lý. Một trong những giao thức được sử dụng trong mạng vật lý là IP multicast. VXLAN sử dụng giao thức của IP multicast để cư trú trong bảng forwarding trong VTEP. + +- Do sự đóng gói (encapsulation) này, VXLAN có thể được gọi là thiết lập đường hầm (tunneling) để kéo dài mạng lớp 2 thông qua lớp 3. Điểm cuối các tunnel này - (VXLAN Tunnel End Point hoặc VTEP) nằm trong hypervisor trên server máy chủ của các VM. Do đó, VNI và VXLAN liên quan tới các khái niệm đóng gói header tunnel được thực hiện bởi VTEP - và trong suốt với VM. + +- ***Lưu ý***: VTEP có thể nằm trên switch hoặc server vật lý và có thể được thực hiện trên phần mềm hoặc phần cứng. + + +### 1.3.3. VXLAN frame format + +![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.3.png) + +Frame Ethernet thông thường bao gồm địa chỉ MAC nguồn, MAC đích, Ethernet type và thêm phần VLAN_ID (802.1q) nếu có. Đây là frame được đóng gói sử dụng VXLAN, thêm các header sau: + +- **VXLAN header**: 8 byte bao gồm các trường quan trọng sau: + + - ***Flags***: 8 but, trong đó bit thứ 5 (I flag) được thiết lập là 1 để chỉ ra rằng đó là một frame có VNI có giá trị. 7 bit còn lại dùng dữ trữ được thiết lập là 0 hết. + + - ***VNI***: 24 bit cung cấp định danh duy nhất cho VXLAN segment. Các VM trong các VXLAN khác nhau không thể giao tiếp với nhau. 24 bit VNI cung cấp lên tới hơn 16 triệu VXLAN segment trong một vùng quản trị mạng. + +- **Outer UDP Header**: port nguồn của Outer UDP được gán tự động và sinh ra bởi VTEP và port đích thông thường được sử dụng là port 4789 hay được sử dụng (có thể chọn port khác). + +- **Outer IP Header**: Cung cấp địa chỉ IP nguồn của VTEP nguồn kết nối với VM bên trong. Địa chỉ IP outer đích là địa chỉ IP của VTEP nhận frame. + +- **Outer Ethernet Header**: cung cấp địa chỉ MAC nguồn của VTEP có khung frame ban đầu. Địa chỉ MAC đích là địa chỉ của hop tiếp theo được định tuyến bởi VTEP. Outer Ethernet header có thể được gắn tag theo chuẩn 802.1q trong quá trình vận chuyển trong mạng. + + +# 2. Cách hoạt động của VXLAN + +VXLAN hoạt động dựa trên việc gửi các frame thông qua giao thức IP Multicast. + +Trong quá trình cấu hình VXLAN, cần cấp phát địa chỉ IP multicast để gán với VXLAN sẽ tạo. Mỗi địa chỉ IP multicast sẽ đại diện cho một VXLAN. + +Sau đây sẽ tìm hiểu hoạt động chi tiết cách frame đi qua VTEP và đi qua mạng vật lý trong VXLAN triển khai trên một mạng logic với mô hình như sau: + + ![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.4.png) + +## 2.1. VM gửi request tham gia vào group multicast + +Giả sử một mạng logic trên 4 host như hình. Topo mạng vật lý cung cấp một VLAN 2000 để vận chuyển các lưu lượng VXLAN. Trong trường hợp này, chỉ IGMP snooping và IGMP querier được cấu hình trên mạng vật lý. Một vài bước sẽ được thực hiện trước khi các thiết bị trên mạng vật lý có thể xử lý các gói tin multicast. + +![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.5.png) + +- IGMP Packet flows: + + - 1) Máy ảo VM (MAC1) trên Host 1 được kết nối tới một mạng logical layer 2 mà có VXLAN 5001 ở đó. + + - 2) VTEP trên Host 1 gửi bản tin IGMP để join vào mạng và join vào nhóm multicast 239.1.1.100 để kết nối tới VXLAN 5001. + + - 3) Tương tự, máy ảo VM (MAC2) trên Host 4 được kết nối tới mạng mà có VXLAN 5001. + + - 4) VTEP trên Host 4 gửi bản tin IGMP join vào mạng và join vào nhóm multicast 239.1.1.100 để kết nối tới VXLAN 5001. + + Host 2 và Host 3 VTEP không join nhóm multicast bởi vì chúng không có máy ảo chạy trên nó và cần kết nối tới VXLAN 5001. Chỉ VTEP nào cần tham gia vào nhóm multicast mới gửi request join vào nhóm + + +![img](../images/4.6.png) + +- Multicast Packet flow: + + - 1) Máy ảo VM (MAC1) trên Host 1 sinh ra một frame broadcast. + + - 2) VTEP trên Host 1 đóng gói frame broadcast này vào một UDP header với IP đích là địa chỉ IP multicast 239.1.1.100 + + - 3) Mạng vật lý sẽ chuyển các gói tin này tới Host 4 VTEP, vì nó đã join vào nhóm multicast 239.1.1.100. Host 2 và 3 VTEP sẽ không nhận được frame broadcast này. + + - 4) VTEP trên Host 4 đầu tiên đối chiếu header được đóng gói, nếu 24 bit VNI trùng với ID của VXLAN. Nó sẽ decapsulated lớp gói được VTEP host 1 đóng vào và chuyển tới máy ảo VM đích (MAC2). + + +## 2.2. VTEP học và tạo bảng forwarding + +Ban đầu, mỗi VTEP sau khi đã join vào nhóm IP multicast đều có một bảng forwarding table như sau: + +![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.6.png) + +Các bước sau sẽ được thực hiện để VTEP học và ghi vào bảng forwarding table: + +- Đầu tiên, một bản tin ARP request được gửi từ VM MAC1 để tìm địa chỉ MAC của máy ảo đích nó cần gửi tin đến VM MAC2 trên Host 2. ARP request là bản tin broadcast. + + ![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.8.png) + + Host 2 VTEP – Forwarding table entry + + - 1) VM trên Host 1 gửi bản tin ARP request với địa chỉ MAC đích là “FFFFFFFFFFF” + + - 2) VTEP trên Host 1 đóng gói vào frame Ethernet broadcast vào một UDP header với địa chỉ IP đích multicast và địa chỉ IP nguồn 10.20.10.10 của VTEP. + + - 3) Mạng vật lý sẽ chuyển gói tin multicast tới các host join vào nhóm IP multicast “239.1.1.10”. + + - 4) VTEP trên Host 2 nhận được gói tin đã đóng gói. Dựa vào outer và inner header, nó sẽ tạo một entry trong bảng forwarding chỉ ra mapping giữa MAC của máy VM MAC1 ứng với VTEP nguồn và địa chỉ IP của nó. VTEP cũng kiểm tra VNI của gói tin để quyết định sẽ chuyển tiếp gói tin vào trong cho máy ảo VM bên trong nó hay không. + + - 5) Gói tin được de-encapsulated và chuyển vào tới VM mà được kết nối tới VXLAN 5001. + +- Hình sau minh họa cách mà VTEP tìm kiếm thông tin trong forwarding table để gửi unicast trả lời lại từ VM từ VTEP 2: + + ![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.9.png) + + - 1) Máy ảo VM MAC2 trên Host 2 đáp trả lại bản tin ARP request bằng cách gửi unicast lại gói tin với địa chỉ MAC đích là địa chỉ MAC1 + + - 2) Sau khi nhận được gói tin unicast đó, VTEP trên Host 2 thực hiện tìm kiếm thông tin trong bảng forwarding table và lấy được thông tin ứng với MAC đích là MAC 1. VTEP sẽ biết rằng phải chuyển gói tin tới máy ảo VM MAC 1 bằng cách gửi gói tin tới VTEP có địa chỉ “10.20.10.10”. + + - 3) VTEP tạo bản tin unicast với địa chỉ đích là “10.20.10.10” và gửi nó đi. + +- Trên Host 1, VTEP sẽ nhận được gói tin unicast và cũng học được vị trí của VM MAC2 như hình sau: + + ![img](https://github.com/hocchudong/thuctap012017/raw/master/TamNT/Virtualization/images/4.10.png) + + Host 1 VTEP – Forwarding table entry + + - 1) Gói tin được chuyển tới Host 1 + + - 2) VTEP trên Host 1 nhận được gói tin. Dựa trên outer và inner header, nó tạo một entry trong bảng forwarding ánh xạ địa chỉ MAC 2 và VTEP trên Host 2. VTEP cũng check lại VNI và quyết định gửi frame vào các VM bên trong. + + - 3) Gói tin được de-encapsulated và chuyển tới chính xác VM có MAC đích trùng và nằm trong VXLAN 5001. + +Các bước trên là quá trình hoạt động trong VXLAN. + +Tham khảo thêm mô hình multiple VXLAN sau: https://blogs.vmware.com/vsphere/2013/05/vxlan-series-multiple-logical-networks-mapped-to-one-multicast-group-address-part-4.html + + +## 4. Tham khảo thêm + +1. ovs-vsctl add-port br0 vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=192.168.30.139 options:key=flow options:dst_port=4789 + +2. ovs-appctl ofproto/trace br-tun in_port=vxlan-c0a84583 + +3. ip link add vxlan0 type vxlan id 38 group 239.30.1.2 dev ens224 dstport 4789 + +4.: https://github.com/hocchudong/thuctap012017/blob/master/TamNT/Virtualization/docs/4.Tim_hieu_VXLAN.md diff --git a/Neutron/8. OpenvSwitch-OPS.md b/Neutron/8. OpenvSwitch-OPS.md new file mode 100644 index 0000000..b41bb94 --- /dev/null +++ b/Neutron/8. OpenvSwitch-OPS.md @@ -0,0 +1,71 @@ + + +# Tìm hiểu OVS trong OPS + +## 1. OpenvSwtich trong OPS + +- Trong OVS gồm các khái niệm sau : + - br-init (integration Bridge) : 2 các VM sử dụng các virtual interface để kết nối đến birdge + - br-eth ( ethernet bridge ) : để xác định frame có sử dụng VLAN_ID trước khi chuyển tiếp các frame + - br-tun ( tunnel interface ) : thêm tunnel type vào header + - br-ex ( external bridge ) : được sử dụng để kết nối ra các mạng external. mạng external này là mạng ngoài với các mạng đứng sau br-ex, không có nghĩa hoàn toàn là IP Public + - veth : sử dụng để kết nối các bridge ( OVS to OVS, LB to OVS ) 2 + +![](https://1.bp.blogspot.com/-1tZkvI1gGPY/VmViLpUnToI/AAAAAAAAWis/j4v0v3ZKlbI/s400/OVS.png) + + + +## 2. OpenVswitch trong Openstack + +### 2.1 : Môi trường Multi VLAN trên Compute Node +![](https://docs.openstack.org/neutron/queens/_images/under-the-hood-scenario-1-ovs-compute.png) + +Trong mô hình trên bao gồm : +- qbr-ID: một Linux Bridge đứng giữa VM và br-init, bao gồm 2 port : + - port tap - vnet : là TAP-driver, gắn trực tiếp với VM Network Card + - port veth - qvb : cầu nối giữa Linux Bridge và Br_intu + +- OVS br-init : gồm có 2 port : + - port veth - qvo : cầu nối với Linux Bridge + - port veth : cầu nối với br-external + +- OVS br-ex : gồm 2 port : + - port br-eth : cầu nối với br-init + - port eth1 : physical interface của compute node + + +### 2.2. Mô hình VXLAN - Self Service + +![](https://www.rdoproject.org/images/neutron_architecture.png?1495114718) + +Trong mô hình trên bao gồm : + +**Trên Compute Node** : +- qbr : Linux Bridge gồm có 2 port + - port TAP - vmet : kết nối với VM + - port veth - qvb : kết nối với br-int + +- br-int : OVS gồm có 2 port + - port veth - qvo : kết nối với Linux Bridge - qbr + - port veth - patch tun: kết nối với br-tun + +- br-tun : OVS gồm có 2 port + - port veth - patch-int : kết nối với br-int + - port vxlan : kết nối đến overlay network + +**Trên Network Node** + +- br-tun : OVS gồm có 2 port + - port vxvlan : kết nối với overlay nework + - br veth - br tun : kết nối đến br init + +- br-init : OVS bao gồm 3 port : + - port TAP : kết nối đến namespace DHCP + - port qr, qg : kết nối đến namespace Router + +![](https://i.imgur.com/guQZsYR.png) +![](https://i.imgur.com/tqeb6ta.png) + +- br-provider : OVS gồm có 2 port + - port veth : kết nối tới router + - por ex : kết nối với Physical Interface diff --git a/Neutron/9. OPS-Packet-Self-Service.md b/Neutron/9. OPS-Packet-Self-Service.md new file mode 100644 index 0000000..90db322 --- /dev/null +++ b/Neutron/9. OPS-Packet-Self-Service.md @@ -0,0 +1,135 @@ + +# Tìm hiểu flow packet khi sử dụng OpenvSwitch trong Openstack + + +## 1. Môi trường giả lập + +- Mô hình Bắc - Nam : liên hệ giữa các instance và mạng ngoài ( hạ tầng mạng vật lý ) +- Mô hình Đông - Tây : liên hệ giữa các instance với nhau cùng mạng hoặc khác mạng. +- Giả định môi trường mạng như sau : + - Provider - VLANID 101 + - Self-service network 1 - VNI 101 + - Self-service network 2 - VNI 102 + - Self-service route + - instance 1,2 + + +## 2. Mô hình Self-Service + +### 2.1 . Bắc - Nam , sử dụng fixed IP + +![](https://docs.openstack.org/newton/networking-guide/_images/deploy-ovs-selfservice-flowns1.png) + +- Trên mô hình này, network node sẽ thực hiện thực hiện Source NAT để gửi traffic của các instance ra mạng external + +- Trên Compute Node + + - B1 : Packet từ instance interface ( 1 ) được chuyển tiếp đến veth pair ( 2 ) trên Linux Bridge + - B2 : Security group trên Linux Bridge sẽ đảm nhiệm filter (3 ) + - B3 : Linux Bridge (4 ) chuyển tiếp các frame đến OVS integration bridge sử dụng veth pair + - B5 : Tại đây ( 5 ) integration bridge thêm tag VNI 101, xác định Tunnel ID + - B6 : OVS integration bridge veth port ( 6 ) sẽ chuyển các packet đến OVS Tunnel Bridge veth port ( 7 ) + - B7 : OVS tunnel bridge sẽ đóng gói các packet với VNI 101 ( 8 ) + - B8 : Physical interface ( 9 ) cho phép mạng overlay chuyển tiếp các packet đến network node ( 10 + +- Trên Network Node + - B1 : Trên physical interface ( 11 ) của network node cho phép các packet từ overlay network đi vào OVS tunnel bridge ( 12 ) + - B2 : OVS Tunnel sẽ thêm Tunnel ID , và gắn một VLAN ID cho các packet này + - B3 : OVS Tunnel veth port ( 13 ) sẽ gửi packet tới OVS integration veth port ( 14 ) + - B4 : OVS integration bridge port ( 15 ) sẽ bỏ các VLAN ID và chuyển tiếp tới router namespace ( 16 ) + - B5 : Đối với IPv4 : SNAT sẽ được thực hiện tại đây , thay đổi địa chỉ IP của self-service network thành IP của provider network ( 17 ) + - B6 : Router ( 18 ) chuyển tiếp packet OVS integration bridge , sau đó sẽ thêm VLAN ID vào packet + - B7 : OVS integration bridge patch port ( 19 ) sẽ forward packet tới OVS provider bridge phy-br-provider ( 20 ) + - B8 : OVS provider bridge port( 21 ) sẽ forward packet ra physical interface ( 22 ) + - B9 : Physical interface sẽ gửi packet ra ngoài ( 23 ) + +### 2.2 : Bắc - Nam sử dụng Floating IP + +![](https://docs.openstack.org/newton/networking-guide/_images/deploy-ovs-selfservice-flowns2.png) + +- Sử dụng SNAT để các máy ảo giao tiếp ra ngoài và DNAT để mạng ngoài giao tiếp với instance +- Trường hợp dưới đây từ một máy từ mạng ngoài liên hệ với instance + +- Trên Nodework Node + + - B1 : Từ mạng ngoài ( 1 ) gửi packet vào provider physical interface ( 2 ) + - B2 : Provider physical interface ( 3 ) chuyển tiếp packet đến OVS provider bridge, sau đó sẽ lấy VLAN ID của packet + - B3 : OVS provider bridge port ( 4 ) sẽ forward packet sang OVS integration bridge port ( 5 ) + - B5 : OVS integration bridge port ( 6 ) sẽ remove internal VLAN và chuyển packet đến router namepsace. Sau đó thực hiện Destination NAT ( 7 ) + - B6 : Router ( 8 ) chuyển tiếp các packet sang OVS integration bridge ( 9 ) + - B7 : Tại OVS intergration bridge sẽ thêm các VLAN ID , sau đó sẽ tìm Tunnel ID tương ứng + - B8 : OVS intergration bridge ( 10 ) chuyển các packet tới OVS tunnel bridge ( 11 ) + - B9 : OVS tunnel bridge ( 12 ) sử dụng VNI cho header các packet + - B10 : Physical interface sẽ cho phép các overlay network ( 13 ) gửi các packet đến compute node ( 14 ) + +- Trên Compute Node : + - B1 : Physical interface ( 15 ) sẽ chuyển tiếp các packet đến overlay network ( 16 ) + - B2 : OVS tunnel bridge sẽ sẽ sử dụng VLAN ID cho Tunnel ID tương ứng + - B3 : OVS tunnel bridge ( 17 ) sẽ chuyển các packet sang OVS ingrateion bridge ( 18 ) sử dụng `patch-int` + - B4 : OVS integration bridge loại bỏ VLAN + - B5 : OVS integration bridge sử dụng securtity group ( 19 ) để filter các packet sau đó gửi sang Linux Bridge ( 20 ) thông qua veth pair + - B6 : Securtiy group sẽ thực hiện filtering ( 21 ) + - B7 : Security group ( 22 ) sẽ chuyển tiếp goi tin đến instance interface ( 23 ) + +## 2.3 : Đông - Tây : các instance cùng 1 mạng + +![](https://docs.openstack.org/newton/networking-guide/_images/deploy-ovs-selfservice-flowew1.png) + +- Trên Compute 1 : + - B1 : instance interface ( 1 ) forward các packet tới security group trên ( Linux Bridge ) ( 2 ) thông qua `veth` pair + - B2 : securtity group ( 3 ) đảm nhiện filter tại đây + - B3 : Linux Bridge port( 4 ) forward packet tới OVS integration ( 5 )nhờ `veth` pair + - B4 : OVS ingration bridge thêm VLAN ID vào packet + - B5 : OVS integration bridge thay VLAN ID bằng Tunnel ID + - B6 : OVS integration bridge patch port ( 6 ) forward packet tới OVS Tunnel bridge patch port ( 7 ) + - B7 : OVS tunnel bridge ( 8 ) gắn VNI vào packet + - B8 : Underlay nework ( 9 ) cho phép overlay network ( 10 ) chuyển packet đến network node + + - Trên Compute 2 + - B1 : Underlay network ( 11) cho phép overlay networking ( 12 ) forward tới OVS bridge tunnel + - B2 : OVS tunnel bridge thêm một Tunnel ID vào packet + - B3 : OVS tunnel bridge thay đổi Tunnel ID bằng VLAN ID tương ứng. + - B4 : OVS tunnel bridge patch port ( 13 ) forward packet tới OVS integratation bridge `patch tun` port ( 14 ) + - B5 : OVS integration bridge bỏ VLAN ( 15 ) forward packet đến Linux bridge `veth` port ( 16 ) + - B6 : Security Group đảm nhiệm filter packet ( 17 ) + - B7 : Linux bridge veth port ( 18 ) forward packet đến instance interface ( 19 ) + + + +### 2.4 : Đông - Tây : các instance khác mạng + + +![](https://docs.openstack.org/newton/networking-guide/_images/deploy-ovs-selfservice-flowew2.png) + +- Trên Compute Node : + - B1 : instance interface ( 1 ) forward packet đến Linux Bridge port ( 2 ) thông qua `veth` pair + - B2 : Security group ( 3 ) sẽ đảm nhiệm filter các packet + - B3 : Linux bridge port ( 4 ) sẽ forward packet đến OVS integration ( 5 ) thông qua `veth` pair + - B4 : OVS integration bridge sẽ thêm VLAN ID vào các packet + - B5 : OVS integration bridge thay đổi các VLAN ID thành Tunnel ID + - B6 : OVS integration bridge `patch-tun` ( 6 ) forward packet tới OVS tunnel bridge ( 7 ) `patch-int` + - B7 : OVS tunnel bridge ( 8 ) gán VNI vào các packet + - B8 : Underlay network ( 9 ) sẽ cho phép overlay network gửi các packet đến network node ( 10 ) + + +- Trên Network Node + - B1 : Underlay network interface ( 11 ) cho phép overlay network forward packet tới OVS tunnel bridge ( 12 ) + - B2 : OVS tunnel bridge loại bỏ VNI và tag Tunnel ID cho packet + - B3 : OVS tunnel bridge loại bỏ tag Tunnel ID bằng VLAN ID + - B4 : OVS tunnel bridge `patch port` ( 13 ) forward packet tới OVS integration bridge `patch-tun` ( 14 ) + - B5 : OVS intergation bridge ( 15 ) xóa bỏ VLAN ID các packet và forward lên interface của self-service router ( 15 ) + - B6 : Router forward packet sang next-hop , gateway của mạng thứ 2 thông qua router interface( 17 ) + - B7 : Router forward packet đến OVS integration bridge port self-service ( 2 ) + - B8 : OVS integration bridge `patch-tun` ( 19 ) forward packet sang OVS tunnel bridge `patch-ini ` patch port ( 20 ) + - B9 : OVS tunnel bridge ( 21 ) tag VNI cho các packet + - B10 : Underlay network ( 22 ) sẽ cho phép overlay network ( 23 ) forward packet về compute node + +- Trên Compute Node + - B1 : Underlay network ( 24 ) cho phép overlay network forward packet ( 25 ) tới các OVS Tunnel Bridge + - B2 : OVS Tunnel Bridge gở bỏ VNI và tag Tunnel ID + - B3 : OVS Tunnel Bridge thay thế Tunnel ID thay thế bằng VLAN ID + - B4 : OVS Tunnel Bridge port ( 26 ) forward packet tới OVS integration bridge sử dụng patch port ( 27 ) + - B5 : OVS integration sẽ remove VLAN trên các packet + - B6 : OVS integration bridge port ( 28 ) forward packet tới tới Linux Bridge ( 29 ) sử dụng `veth` pair + - B7 : Security group ( 30 ) sẽ filer các packet + - B8 : Linux Bridge ( 31 ) sẽ forward packet tới các instance interface ( 32 ) sử dụng `veth` pair diff --git a/Neutron/Untitled Diagram.png b/Neutron/Untitled Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a931bfd23c71c0e163b440c21f3152324e2b74ad GIT binary patch literal 23717 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 K8(iJs6!{ /dev/nul +echo "allow 192.168.69.0/24" >> /etc/chrony.conf +systemctl enable chronyd.service +systemctl start chronyd.service + +``` + +- Một soos NTP Server + +``` +server 0.asia.pool.ntp.org +server 1.asia.pool.ntp.org +server 2.asia.pool.ntp.org +server 3.asia.pool.ntp.org +``` + +- Cấu hình FirewallD + +``` +firewall-cmd --add-service=ntp --permanent +firewall-cmd --reload + +``` + +- Sau khi cài đặt NTP trên các node khác + +``` +chronyc sources + chronyc tracking + +``` +## 3. Cài đặt Nova Service trên Controller Node + + + +### 3.1. Khởi tạo DB , Keystone User và Service +- Khởi tạo DB cho nova +```bash +mysql -u root --password=123@123Aa < /etc/nova/nova.conf +[DEFAULT] +transport_url = rabbit://openstack:rabbitmq_123@controller +enabled_apis = osapi_compute,metadata +use_neutron = True +firewall_driver = nova.virt.firewall.NoopFirewallDriver +[api_database] +connection = mysql+pymysql://nova:nova_123@controller/nova_api +[database] +connection = mysql+pymysql://nova:nova_123@controller/nova +[api] +auth_strategy = keystone +[keystone_authtoken] +auth_url = http://controller:5000/v3 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = nova +password = nova_123 +[vnc] +enabled = true +server_listen = 0.0.0.0 +server_proxyclient_address = 192.168.69.130 +[glance] +api_servers = http://controller:9292 +[oslo_concurrency] +lock_path = /var/lib/nova/tmp +[placement] +os_region_name = RegionOne +project_domain_name = Default +project_name = service +auth_type = password +user_domain_name = Default +auth_url = http://controller:5000/v3 +username = placement +password = placement_123 +EOF + +echo " + + = 2.4> + Require all granted + + + Order allow,deny + Allow from all + + +" >> /etc/httpd/conf.d/00-nova-placement-api.conf + systemctl restart httpd +``` + +- Khởi tạo dữ liệu trên Database +```bash +su -s /bin/sh -c "nova-manage api_db sync" nova +su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova +su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova +su -s /bin/sh -c "nova-manage db sync" nova +``` + +Note : nếu đã config đúng password , user mà vẫn xuất hiện lỗi thì bỏ qua lỗi đó . + +- Kiểm trang bảng cell host connector +``` +[root@localhost nova]# nova-manage cell_v2 list_cells +/usr/lib/python2.7/site-packages/oslo_db/sqlalchemy/enginefacade.py:332: NotSupportedWarning: Configuration option(s) ['use_tpool'] not supported + exception.NotSupportedWarning ++-------+--------------------------------------+------------------------------------+-------------------------------------------------+ +| Name | UUID | Transport URL | Database Connection | ++-------+--------------------------------------+------------------------------------+-------------------------------------------------+ +| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@controller/nova_cell0 | +| cell1 | 75e677d7-2250-4efc-b720-21e9a17219a1 | rabbit://openstack:****@controller | mysql+pymysql://nova:****@controller/nova | ++-------+--------------------------------------+------------------------------------+-------------------------------------------------+ +``` + + +- Khởi động dịch vụ +```bash +systemctl enable openstack-nova-api.service \ + openstack-nova-consoleauth.service openstack-nova-scheduler.service \ + openstack-nova-conductor.service openstack-nova-novncproxy.service +systemctl start openstack-nova-api.service \ + openstack-nova-consoleauth.service openstack-nova-scheduler.service \ + openstack-nova-conductor.service openstack-nova-novncproxy.service + ``` + +- Cấu hình FirewallD +``` +firewall-cmd --add-port={11211/tcp,5672/tcp} --permanent +firewall-cmd --add-port=8778/tcp --permanent +firewall-cmd --add-port={6080/tcp,6081/tcp,6082/tcp,8774/tcp,8773/tcp,8775/tcp} --permanent +firewall-cmd --add-port=5900-5999/tcp --permanent +firewall-cmd --reload +``` + +## 4. Cài đặt trên Compute Node + + +- Kiểm tra ảo hóa trên Compute Node +```bash +[root@localhost ~]# egrep -c '(vmx|svm)' /proc/cpuinfo +2 +``` + +- Cấu hình file hosts +``` +echo " +192.168.69.130 controller +192.168.69.131 compute1 +192.168.69.132 compute2 +192.168.69.133 cinder +" >> /etc/hosts +``` + +- Đồng bộ NTP +``` +yum install chrony +sed -i "s/server.*/server controller iburst/g" /etc/chrony.conf +systemctl enable chronyd.service +systemctl restart chronyd.servic +``` + +- Cài đặt Openstack Package và Nova +```bash +yum install centos-release-openstack-queens -y +yum install openstack-nova-compute -y +``` + +- Cấu hình Nova ( chú ý option : server_proxyclient_address : ) +```bash +cat < /etc/nova/nova.conf +[DEFAULT] +enabled_apis = osapi_compute,metadata +transport_url = rabbit://openstack:rabbitmq_123@controller +use_neutron = True +firewall_driver = nova.virt.firewall.NoopFirewallDriver +[api] +auth_strategy = keystone +[keystone_authtoken] +auth_url = http://controller:5000/v3 +memcached_servers = controller:11211 +auth_type = password +project_domain_name = default +user_domain_name = default +project_name = service +username = nova +password = nova_123 +[vnc] +enabled = True +server_listen = 0.0.0.0 +server_proxyclient_address = 192.168.69.131 +novncproxy_base_url = http://192.168.30.130:6080/vnc_auto.html +[glance] +api_servers = http://controller:9292 +[oslo_concurrency] +lock_path = /var/lib/nova/tmp +[placement] +os_region_name = RegionOne +project_domain_name = Default +project_name = service +auth_type = password +user_domain_name = Default +auth_url = http://controller:5000/v3 +username = placement +password = placement_123 +[libvirt] +virt_type = kvm +hw_machine_type = x86_64=pc-i440fx-rhel7.2.0 + +EOF +``` + +- Khởi động dịch vụ +``` +systemctl enable libvirtd.service openstack-nova-compute.service +systemctl start libvirtd.service openstack-nova-compute.service +``` + +- Trở về Controller Node thêm Host vào Cell Table +``` +openstack compute service list --service nova-compute +root@localhost ~]# openstack compute service list --service nova-compute ++----+--------------+-----------------------+------+---------+-------+----------------------------+ +| ID | Binary | Host | Zone | Status | State | Updated At | ++----+--------------+-----------------------+------+---------+-------+----------------------------+ +| 6 | nova-compute | localhost.localdomain | nova | enabled | up | 2018-11-07T06:40:46.000000 | ++----+--------------+-----------------------+------+---------+-------+----------------------------+ + + +su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova +``` + + diff --git a/Nova/3.Nova-Client&Curl.md b/Nova/3.Nova-Client&Curl.md new file mode 100644 index 0000000..0f60f16 --- /dev/null +++ b/Nova/3.Nova-Client&Curl.md @@ -0,0 +1,171 @@ + +# Sử dụng Nova + +## 1. Sử dụng Nova thông qua Openstack CLI + + +`openstack flavor create --id auto --ram --disk --vcpu --public ` + +dung lượng ram tính theo đơn vị MB dung lượng disk tính theo đơn vị GB + +- Liệt kê flavors + +`openstack flavor list` + +- show chi tiết 1 flavor + +`openstack flavor show ` + +- Xóa bỏ 1 flavor + +`openstack flavor delete ` + +- Tạo keypair +``` +openstack keypair create + [--public-key | --private-key ] + +``` +- List tất cả các key pair có trong openstack. + +`openstack keypair list` + +- Xóa bỏ 1 keypair + +`openstack keypair delete ` + +- Tạo máy ảo từ image +``` +openstack server create --flavor --image \ +--nic net-id= --security-group \ +--key-name +``` +- Tạo máy ảo từ volume +``` +openstack server create --flavor --volume \ +--nic net-id= --security-group \ +--key-name +``` +- Xóa máy ảo + +`openstack server delete ` + +- Tắt máy ảo + +`openstack server stop ` + +- Bật máy ảo + +`openstack server start ` + +- reboot một VM đang chạy. + +`openstack server reboot ` + +- List tất cả VM + +`openstack server list` + +- Tạo mới snapshot + +`openstack snapshot create ` + +- Hiển thị danh sách các snapshot + +`openstack snapshot list` + +- Xóa snapshot + +`openstack snapshot delete ` + +- Xem danh sách các hypervisor + +`openstack hypervisor list` + + +## 2 . Làm việc với Nova qua CURL + +- Lấy mã token từ Keystone +``` +curl -i \ +-H "Content-Type: application/json" \ +-d ' +{ "auth": { +"identity": { +"methods": ["password"], +"password": { +"user": { +"name": "admin", +"domain": { "id": "default" }, +"password": "keystone_123@123Aa" +} +} +}, +"scope": { +"project": { +"name": "admin", +"domain": { "id": "default" } +}}}}' \ +"http://localhost:5000/v3/auth/tokens" ; echo +``` + +- Liệt kê danh sách Flavor +``` +[root@localhost nova]# curl -s -H "X-Auth-Token: $TOKEN" \ +> http://controller:8774/v2.1/flavors | python -mjson.tool + +{ + "flavors": [ + { + "id": "57488dbd-a0f7-4a7f-ac55-687d85e7f4e4", + "links": [ + { + "href": "http://controller:8774/v2.1/flavors/57488dbd-a0f7-4a7f-ac55-687d85e7f4e4", + "rel": "self" + }, + { + "href": "http://controller:8774/flavors/57488dbd-a0f7-4a7f-ac55-687d85e7f4e4", + "rel": "bookmark" + } + ], + "name": "small" + } + ] +} +``` + +- Xem thông tin các Hypervisor +``` +[root@localhost nova]# curl -s -H "X-Auth-Token: $TOKEN" \ +> http://controller:8774/v2.1/os-hypervisors/detail | python -mjson.tool +{ + "hypervisors": [ + { + "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"SandyBridge\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"tsc_adjust\", \"tsc-deadline\", \"msr\", \"xsave\", \"vmx\", \"cmov\", \"fpu\", \"pat\", \"arat\", \"lm\", \"tsc\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"pcid\", \"vme\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"aes\", \"mca\", \"pse\", \"lahf_lm\", \"popcnt\", \"apic\", \"sse\", \"ds\", \"invtsc\", \"pni\", \"rdtscp\", \"sse2\", \"ss\", \"hypervisor\", \"ssse3\", \"cx16\", \"pse36\", \"mtrr\", \"x2apic\"], \"topology\": {\"cores\": 1, \"cells\": 1, \"threads\": 1, \"sockets\": 2}}", + "current_workload": 0, + "disk_available_least": 33, + "free_disk_gb": 35, + "free_ram_mb": 3583, + "host_ip": "192.168.30.131", + "hypervisor_hostname": "localhost.localdomain", + "hypervisor_type": "QEMU", + "hypervisor_version": 2010000, + "id": 1, + "local_gb": 35, + "local_gb_used": 0, + "memory_mb": 4095, + "memory_mb_used": 512, + "running_vms": 0, + "service": { + "disabled_reason": null, + "host": "localhost.localdomain", + "id": 6 + }, + "state": "up", + "status": "enabled", + "vcpus": 2, + "vcpus_used": 0 + } + ] +} +``` diff --git a/Nova/4. Nova-Instance-Work-flow.md b/Nova/4. Nova-Instance-Work-flow.md new file mode 100644 index 0000000..a2b5cf4 --- /dev/null +++ b/Nova/4. Nova-Instance-Work-flow.md @@ -0,0 +1,63 @@ + + + +## 1. Mỗi quan hệ giữa các Nova Service + +![](https://docs.openstack.org/nova/latest/_images/architecture.svg) + + + +- Nova-compute chạy trên cách compute node 2. Compute service tương tác tới các Hypervisor để quản lý vòng đời các instance và đảm bảo state instance được lưu trong Compute Database . Các instance mặc định đc lưu tại filesystem Compute Node tại `/var/lib/nova/instances` +![](https://i.imgur.com/NxFXuHD.png) + +![](https://i.imgur.com/TWLo89D.png) +![](https://i.imgur.com/09C7bMP.png) + + +## 2. Khởi tạo máy ảo + + +![](https://i.imgur.com/1tXS9br.png) + + +Workflow khi khởi tạo máy ảo: + +1. Client (có thể là Horizon hoặc CLI) hỏi tới keystone-api để xác thực và generate ra token. + +2. Nếu quá trình xác thực thành công, client sẽ gửi request khởi chạy máy ảo tới nova-api. Giống câu lệnh `nova boot`. + +3. Nova service sẽ kiểm tra token và nhận lại header với roles và permissions từ keystone-api. + +4. Nova API gửi lệnh tới nova conductor kiểm tra trong database conflicts hay không để khởi tạo một entry mới. + +5. Nova-api gửi RPC tới nova-scheduler service để lên lịch cho máy ảo. + +6. Nova-scheduler lấy request từ message queue + +7. Nova-scheduler service sẽ tìm compute host thích hợp trong database thông qua filters và weights. Lúc này database sẽ cập nhật lại entry của máy ảo với host ID phù hợp nhận được từ nova-scheduler. Sau đó scheduler sẽ gửi RPC call tới nova-compute để khởi tạo máy ảo. + +8. nova-compute lấy request từ message queue. + +9. nova-compute hỏi nova-conductor để lấy thông tin về máy ảo như host ID, flavor. (nova-compute lấy các thông tin này từ database thông qua nova-conductor vì lý do bảo mật, tránh trường hợp nova-compute mang theo yêu cầu bất hợp lệ tới instance entry trong database) + +10. nova-conductor lấy request từ message queue. + +11. nova-conductor lấy thông tin máy ảo từ database. sau đó gửi về cho nova-compute + +12. nova-compute lấy thông tin máy ảo từ queue. Tại thời điểm này, compute host đã biết được image nào sẽ được sử dụng để chạy máy ảo. nova-compute sẽ hỏi tới glance-api để lấy url của image. + +13. Glance-api sẽ xác thực token và gửi lại metadata của image trong đó bao gồm cả url của nó. + +14. Nova-compute sẽ đưa token tới neutron-api và hỏi nó về network cho máy ảo. + +15. Sau khi xác thực token, neutron sẽ tiến hành cấu hình network. + +16. Nova-compute tương tác với cinder-api để gán volume vào máy ảo. + +17. Nova-compute sẽ generate dữ liệu cho Hypervisor và gửi thông tin thông qua libvirt. + + +## 3. Các kiến trúc liên quan tới máy ảo +![](https://i.imgur.com/2aHAjb7.png) + +![](https://i.imgur.com/LhCYdNg.png) diff --git a/Nova/5. Debug.md b/Nova/5. Debug.md new file mode 100644 index 0000000..1aed4c2 --- /dev/null +++ b/Nova/5. Debug.md @@ -0,0 +1,12 @@ + +## Debug trong Nova + +- LIVE MIGRATION : virsh qemu-monitor-command, virsh qemu-monitor-eve +- If the instance crashes – coredump : virsh dump +- Enable libvirt logging for understanding lower level interactions between libvirt and qemu + - libvirtd.conf + - log_filters="1:libvirt 1:qemu 1:conf 1:security 3:event 3:json 3:file 3:object 1:util 1:qemu_monitor" + - log_outputs="1:file:/var/log/libvirt/libvirtd.log +- sed -i 's/debug=False/debug=True/g' /etc/nova/nova.conf +- sed -i 's/verbose=False/verbose=True/g' /etc/nova/nova.conf + - Get compute.log, conductor.log, scheduler.log for analysis diff --git a/Nova/6. Config-section.md b/Nova/6. Config-section.md new file mode 100644 index 0000000..c05ca66 --- /dev/null +++ b/Nova/6. Config-section.md @@ -0,0 +1,39 @@ + + +# Một số tùy chọn khác trong nova.conf + + +## 1. [Default] +|Parameter = Value| Description| +|------------------|-----------| +|#password_length = 12| độ dài password tối thiểu của các tài khoản admin trong instance| +|#compute_driver = | driver làm việc với các hypervisor | +|#default_ephemeral_format = |cấu hình định dạng ổ đĩa trên local cho các instance| +|#dhcp_lease_time = 86400| Thời gian lease cho DHCP +|#dns_server =|Cấu hình DNS Server| +| #metadata_host = $my_ip| Metadata Server | + + +## 2. [wsgi] +|Parameter = Value| Description| +|------------------|-----------| +|#wsgi_log_format = %(client_ip)s "%(request_line)s" status: %(status_code)s len: %(body_length)s time: %(wall_seconds).7f| Format cho các API request | +|#ssl_ca_file = | CA cho SSL| +|#ssl_cert_file = | CE cho SSL | + + +## 3. [vnc] + +|Parameter = Value| Description| +|------------------|-----------| +|#enabled = true | Khởi động VNC | +|#server_listen = 127.0.0.1 | IP trong instance sẽ nhận request VNC | + +## 4. [key_manager] +|Parameter = Value| Description| +|------------------|-----------| +|#fixed_key = | sử dụng secret key trong nova | +|#backend = barbican | cấu hình backend cho fixed_key| +|#auth_type = | Loại chứng chỉ xác thực để tạo| +|#token = | token để xác thực | +| | | diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..f97eef9 --- /dev/null +++ b/Readme.md @@ -0,0 +1,68 @@ + + +Ghi chép quá trình tìm hiểu OpenStack + +- Môi trường : Centos 7.5 +- Phiên bản : Openstack Queens +- Hypervisor : KVM/QEMU + + +## Mục Lục + +## 1. Giới thiệu + +- [Giới thiệu về Cloud Computing và Openstack](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/1.%20Intro%20Cloud%20Computing.md) + +- [Cài thử nghiệm Openstack sử dụng Packstack](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/2.install-pack-stack.md) +### 2. Keystone + +- [Giới thiệu về Openstack Identity](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Keystone/1.%20Introduction-Keystone.md) +- [Cài đặt Keystone ](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Keystone/1.%20Introduction-Keystone.md) +- [Các tùy chọn trong Keystone](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Keystone/4.%20Config-Keystone.md) +- [Làm việc với Keystone](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Keystone/5.%20Keystone-Openstack-CLI.md) +- [Làm việc với Keystone (2) ]( https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Keystone/6.%20Keystone-CURL.md) +- [Token trong Keystone](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Keystone/7.%20Token-Keystone.md) + +### 3. Glance + +- [Giới thiệu về Openstack Image Service](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Glance/1.%20Introduction-Glance.md) +- [Cài đặt Glance](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Glance/2.%20Install%20Glance.md) +- [Làm việc với Glance](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Glance/3.%20Openstack-Glance-%26-CURL.md) +- [Các tùy chọn trong Glance](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Glance/4.%20Config.md) +- [Các quá trình trong Glance](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Glance/5.%20Glance-Advanced.md) + +### 4. Nova + +- [Giới thiệu về Openstack Compute Service](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Nova/1.Introduction-nova.md) +- [Cài đặt Nova](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Nova/2.%20Install-nova.md) +- [Làm việc với Nova](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Nova/3.Nova-Client%26Curl.md) +- [Các quá trình trong Nova](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Nova/4.%20Nova-Instance-Work-flow.md) +- [Debug](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Nova/5.%20Debug.md) + +### 5. Neutron + +- [Giới thiệu về Neutron](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/1.%20Introduction-neutron.md) +- [Cài đặt Neutron Linux Bridge - Self-Service](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/2.%20Install%20Neutron%20Linux%20Bridge.md) +- [Cài đặt Neutro OVS - Self-Service](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/2.1%20.%20OVS-Self-Services.md) +- [Cài đặt Neutron OVS - Provider](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/2.2.%20OVS%20Self-Service-%26-Provider.md) +- [Làm việc với Neutron ](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/3.%20Neutron-CLI.md) +- [Tìm hiểu các Namespace, Agent trong Neutron](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/4.%20Neutron-Namespace-Agent.md) +- [Packet Flow sử dụng Linux Bridge](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/5.%20%20Packet-Walkthrough-Linux-Bridge.md) +- [Cấu hình Bonding](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/6.%20Bonding.md) +- [Tìm hiểu VXLAN](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/7.%20VXLAN.md) +- [Tìm hiểu OpenvSwitch trong OPS](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Neutron/8.%20OVS.md) +### 10. Mở rộng + +- [Key Rorate và Decrypt trong Keystone](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/1.%20Key-Rotate-%26-Decrypt.md) +- [Sử dụng RabbitMQ và Endpoint trong Openstack](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/2.RabbitMQ-%26-API-Endpoint.md) +- [Log trong Openstack](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/3.%20Log.md) +- [Cấu hình noVNC Node](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/4.%20Setup-noVNC.md) +- [Liên hệ giữa Nova-Compute và RabbitMQ](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/5.%20Nova-Compute-Serice-%26-RabbitMQ.md) +- [Placment API và Nova Conductor trong Openstack](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/6.%20Placement-API-%26-Nova-Conductor.md) +- [Quản lý tài nguyên trong Nova](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/7.1.%20%20Resource-Management-OPS.md) +- [Nova-Scheduler và Filter trong Nova](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/7.2%20.%20Nova-Scheduler-%26-Host-Aggreaggregate.md) +- [Host Aggregate trong Nova-Scheduler](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/7.3.%20Lab-Filter-Scheduler.md) +- [Resize instance](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/8.%20Resize-instance.md) +- [Recuse instnace](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/9.%20Rescue-instance.md) +- [Giới hạn CPU Resource trong Nova](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/10.%20Limit-CPU-Resource.md) +- [Metadata](https://github.com/nguyenhungsync/Report-Intern-Meditech/blob/master/Openstack/Advance/11.%20Metadata.md)