1. Trang chủ
  2. » Giáo Dục - Đào Tạo

luận văn thạc sĩ nghiên cứu và triển khai hệ thống private cloud cho các ứng dụng đào tạo và thực hành dựa trên giải pháp mã nguồn mở openstack​

89 24 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 89
Dung lượng 544,35 KB

Nội dung

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TRẦN ANH TUẤN NGHIÊN CỨU VÀ TRIỂN KHAI HỆ THỐNG PRIVATE CLOUD CHO CÁC ỨNG DỤNG ĐÀO TẠO VÀ THỰC HÀNH DỰA TRÊN GIẢI PHÁP MÃ NGUỒN MỞ OPENSTACK LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN Hà nội, 11/2019 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TRẦN ANH TUẤN NGHIÊN CỨU VÀ TRIỂN KHAI HỆ THỐNG PRIVATE CLOUD CHO CÁC ỨNG DỤNG ĐÀO TẠO VÀ THỰC HÀNH DỰA TRÊN GIẢI PHÁP MÃ NGUỒN MỞ OPENSTACK Quyết định số: 655/QĐ-CTSV Ngành: Mạng máy tính truyền thơng liệu Chun ngành: Mạng máy tính truyền thông liệu Mã số: 8480102.01 Giảng viên hướng dẫn: TS Hồng Xn Tùng LUẬN VĂN THẠC SĨ CƠNG NGHỆ THÔNG TIN Hà nội, tháng 11/2019 LỜI CẢM ƠN Trước tiên em xin dành lời cảm ơn chân thành đến thầy Hoàng Xuân Tùng, thầy hướng dẫn, khuyến khích, bảo tạo cho em điều kiện tốt từ bắt đầu hoàn thành cơng việc Em xin dành lời cảm ơn chân thành tới thầy cô giáo khoa Công nghệ thông tin, trường Đại học Công nghệ, ĐHQGHN tận tình đào tạo, cung cấp cho em kiến thức vô quý giá tạo điều kiện tốt cho em suốt trình học tập, nghiên cứu trường để em hồn thành khố luận hành trang cho em sau Cuối em xin cảm ơn đến bạn bè, đồng nghiệp, người thân động viên, giúp đỡ, tạo điều kiện vấp phải khó khăn để em hồn thành luận văn Mặc dù cố gắng kiến thức nhiều hạn chế nên luận văn em khơng thể tránh khỏi sai sót Em mong nhận góp ý thầy bạn để em hồn thiện khắc phục thiếu sót Em xin chân thành cảm ơn! LỜI CAM ĐOAN Tôi Trần Anh Tuấn, học viên K23 trường Đại học Công Nghệ - ĐHQGHN, xin cam đoan luận văn thạc sĩ công nghệ thông tin “Nghiên cứu triển khai hệ thống Private Cloud cho ứng dụng đào tạo thực hành dựa giải pháp mã nguồ n mở Openstack” luận văn nghiên cứu tôi, thầy Hồng Xn Tùng hướng dẫn khơng chép lại người khác Tất tài liệu trích dẫn có nguồn gốc rõ ràng Nếu có sai phạm, tơi xin chịu hồn tồn trách nhiệm chịu hình thức kỷ luật theo quy định cho lời cam đoan Hà Nội, ngày … tháng 11 năm 2019 Tác giả luận văn Trần Anh Tuấn MỤC LỤC LỜI CẢM ƠN LỜI CAM ĐOAN DANH MỤC HÌNH VẼ DANH MỤC BẢNG BIỂU ĐẶT VẤN ĐỀ CHƯƠNG GIỚI THIỆU CHUNG Tổ ng quan Cloud computing: Tổ ng quan Private Cloud: Tổ ng quan Virtualization: Tổ ng quan Hypervisor: CHƯƠNG GIỚI THIỆU VỀ LIBVIRT- KVM, OPENSTACK, CLOUDSTACK17 I LIBVIRT- KVM KVM LIBVIRT II CLOUDSTACK: III OPENSTACK: Tổ ng quan Openstack: Cấu trúc dịch vụ: Các module cung cấp tron Các thành phần chức CHƯƠNG TRIỂN KHAI CÀI ĐẶT HỆ THỐNG PRIVATE CLOUD CHO CÁC ỨNG DỤNG ĐÀO TẠO VÀ THỰC HÀNH DỰA TRÊN GIẢI PHÁP MÃ NGUỒN MỞ OPENSTACK I Hệ thống phần c ứng có II Bài toán quy hoạch máy chủ Mô hình triển khai tham chiế u Bài tốn quy hoạch máy chủ III Quy trình triển khai quy hoạch máy chủ theo mơ hình PhyComp-VirCon Triể n khai Openstack tảng c Triể n khai Controller node theo mô h Triể n khai Compute node theo mơ hì IV Sử dụng Openstack quản trị hệ thống Private Cloud cho trường đại học 44 CHƯƠNG KẾT QUẢ ĐẠT ĐƯỢC VÀ KẾT LUẬN 49 TÀI LIỆU THAM KHẢO 50 PHỤ LỤC 1: CÁC BƯỚC TRIỂN KHAI OPENSTACK 51 DANH MỤC HÌNH VẼ Hình 1-1 Mơ hình Cloud Computing Hình 1-2 Sự khác biệt kiến trúc máy tính cơng nghệ truyền thống với cơng nghệ ảo hóa 13 Hình 1-3 Hai chế ảo hóa phần cứng 14 Hình 1-4 Phân loại hypervisor 15 Hình 2-1 Mơ hình KVM 17 Hình 2-2 Mơ hình mơ tả vai trị Libvirt Hypervisor 18 Hình 3-1: Mơ hình triển khai tham chiếu Openstack 32 Hình 3-2.Mơ hình PhyComp-VirCon 37 Hình 3-3 Triển khai máy ảo cho Controller node theo mơ hình PhyComp-VirCon 38 Hình 3-4 Sơ đồ quy trình cài đặt Controller node 39 Hình 3-5 Các module triển khai cho Controller node 40 Hình 3-6 Sơ đồ quy trình cài đặt Compute node 42 Hình 3-7 Các module triển khai cho Compute node 43 Hình 3-8 Mơ hình quản trị Openstack 44 DANH MỤC BẢNG BIỂU Bảng 1-1 Các loại ảo hóa 13 Bảng 2-1 Lịch sử hình thành phát triển Openstack .20 Bảng 2-2 Các phiên Openstack 23 Bảng 2-3 Các dịch vụ Openstac 24 Bảng 2-4 Các API Openstack Compute (Nova) 26 Bảng 3-1: Các dịch vụ cài đặt Controller node 33 Bảng 3-2: Các dịch vụ Compute node 33 Bảng 3-3: Các dịch vụ Storage node 33 Bảng 3-4 Bảng so sánh mơ hình quy hoạch máy chủ 37 ĐẶT VẤN ĐỀ Trong phát triển công nghệ thông tin, đặc biệt phát triển điện toán đám mây (Cloud Computing) ứng dụng sống chưa phổ biến tiện lợi Việc ứng dụng điện toán đám mây doang nghiệ p, đơn vị hành nghiệp, sở giáo dục nhu cầu cấp thiết việc xây dựng, thiết lập sở hạng tầng lực lưu trữ hệ thống Trên giới, điện tốn đám mây cơng nghệ phát triển lâu đẩy mạnh nhứng năm trở lại công ty công nghệ Amazon, Google, Microsoft Ngoài ra, nhiều doanh nghiệp tự xây dựng tạo dự án Opensource liên quan tới điện toán đám mây Openstack, Cloudstack, Eucalyptus, PetiteCloud Ở Việt Nam, doang nghiệp triển khai hệ thống điện toán đám mây nhằm khai thác dịch vụ Viettel, FPT, CMC… Chính nhu cầu ứng dụng cao xây dựng, triển khai vận hành điện tồn đám mây có chất lượng cao nhu cầu đào tạo nguồn nhân lực có kiến thức kỹ liên quan đến điện tốn đám mây Để đào tạo nguồ n nhân lực có trình độ cao, cở sở giáo dục cần nghiên cứu, giảng dạy, đào tạo xây dựng ứng dụng liên quan tới điện tồn đám mây Đó mối quan tâm đặc biệt mơi trường giáo dục đại học sở nghiên cứu, đào tạo thực hành Chúng nghiên cứu triển khai hệ thống Private Cloud Bộ môn mạng trường Đại học Công nghệ - Đại học Quốc gia Hà Nội Do ứng dụng đào tạo thực hành ứng dụng đặc thù giáo dục (đặc biệt áp dụng cho trường đại học) nên đòi hỏi việc triển khai cho đơn vị khác Các ứng dụng cho đào tạo thực hành thường sử dụng để phục vụ cho công tác quản lý, giảng dạy học tập đối tượng sử dụng đa dạng cán quán lý phòng ban, cán quán lý khoa nhà trường hay giảng viên, sinh viên… dẫn tới nhu cầu bảo mật phục vụ cho đối tượng hay nhóm đối tượng khác nên triển khai Private cloud, hệ thống cần hoạt động ổn định, đảm bảo tính bảo mật khơng gây nhiều khó khăn cho quản trị viên vận hành phát triển Ngoài ra, ứng dụng đào tạo thực hành phục vụ cho mục đích đối tượng người dùng khác nên cần quy hoạch hệ thống hạ tầng sở cách tối ưu thách thức khó khăn triển khai hệ thống mạng truyền thống nên triển khai Private cloud, đặc biệt dựa mà nguồ n mở Openstack, hệ thống cần quy hoạch cách hiệu tối ưu đáp ứng nhu cầu tảng sở hạ tầng cho công tác quản lý, giảng dạy học tập Luận văn giới thiệu khái niệm chung, hệ thống thực tế triển khai toàn triển khai, cụ thể quy hoạch hệ thống server đồng thời giải quyế t toán quản trị kết nối mạng nhằm phục vụ cho hoạt động đào tạo thực hành username=placement password=PLACEMENT_PASS } oSửa file 00-nova-placement-api.conf vi /etc/httpd/conf.d/00-nova-placement-api.conf { = 2.4> Require all granted Order allow,deny Allow from all } systemctl restart httpd 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 109e1d4b-536a-40d0-83c6-5f121b82b650 su -s /bin/sh -c "nova-manage db sync" nova su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova systemctl enable openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service systemctl start openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service oThêm compute node vào cell database admin-openrc openstack compute service list service nova-compute oTìm kiếm compute hosts su -s /bin/sh -c "nova-manage cell_v2 discover_hosts verbose" nova 61 vi /etc/nova/nova.conf { [scheduler] discover_hosts_in_cells_interval=300 } e Cài đặt Neutron oTạo database user "neutron" Gán quyền cho neutron CREATE DATABASE neutron; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS'; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS'; oConfig tài khoản ADMIN admin-openrc oTạo user openstack user create domain default password-prompt neutron oThêm role “admin” cho user “nova” openstack role add project service user neutron admin oTạo service openstack service create name neutron description "OpenStack Networking" network oTạo API endpoint openstack endpoint create region RegionOne network public http://controller:9696 openstack endpoint create region RegionOne network internal http://controller:9696 openstack endpoint create region RegionOne network admin http://controller:9696  o PROVIDER NETWORK Cài đặt cấu hình thành phần yum install openstack-neutron openstack-neutron-ml2 openstack-neutronlinuxbridge ebtables o Sửa file neutron.conf 62 vi /etc/neutron/neutron.conf { [database] connection=mysql+pymysql://neutron:NEUTRON_DBPASS@controll er/neutron [DEFAULT] core_plugin=ml2 service_plugins = [DEFAULT] transport_url=rabbit://openstack:RABBIT_PASS@controller [DEFAULT] auth_strategy=keystone [keystone_authtoken] www_authenticate_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_PASS } oSửa file ml2_conf.ini vi /etc/neutron/plugins/ml2/ml2_conf.ini { ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini 63 } 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 oKhởi động Compute API service systemctl restart openstack-nova-api.service oChạy Networking 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 f Cài đặt Dashboard oCài đặt cấu hình thành phần yum install openstack-dashboard oSửa file local_settings.py vi /etc/openstack-dashboard/local_settings.py { OPENSTACK_HOST="controller" ALLOWED_HOSTS=['one.example.com', 'two.example.com'] SESSION_ENGINE='django.contrib.sessions.backends.cache ' CACHES={ 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedC ache', 'LOCATION': 'controller:11211', } } OPENSTACK_KEYSTONE_URL="http://%s:5000/v3" % OPENSTACK_HOST OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT=True OPENSTACK_API_VERSIONS={ "identity": 3, 64 "image": 2, "volume": 2, } OPENSTACK_KEYSTONE_DEFAULT_DOMAIN="Default" OPENSTACK_KEYSTONE_DEFAULT_ROLE="user" OPENSTACK_NEUTRON_NETWORK={ 'enable_router': False, 'enable_quotas': False, 'enable_distributed_router': False, 'enable_ha_router': False, 'enable_lb': False, 'enable_firewall': False, 'enable_vpn': False, 'enable_fip_topology_check': False, } TIME_ZONE="TIME_ZONE" } oSửa file openstack-dashboard.conf vi /etc/httpd/conf.d/openstack-dashboard.conf { WSGIApplicationGroup %{GLOBAL} } oKhởi động lại web server session storage service systemctl restart httpd.service memcached.service o Verify operation http://controller/dashboard Xác thực user admin hay demo mặc định tên miền g Cài đặt Cinder o Tạo database user " cinder" Gán quyền cho cinder CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS'; 65 GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS'; oConfig tài khoản ADMIN admin-openrc oTạo user openstack user create domain default password-prompt cinder oThêm role “admin” cho user “cinder” openstack role add project service user cinder admin oTạo service openstack service create name cinderv2 description "OpenStack Block Storage" volumev2 openstack service create name cinderv3 description "OpenStack Block Storage" volumev3 oTạo API endpoint openstack endpoint create region RegionOne volumev2 public http://controller:8776/v2/%\(project_id\)s openstack endpoint create region RegionOne volumev2 internal http://controller:8776/v2/%\(project_id\)s openstack endpoint create region RegionOne volumev2 admin http://controller:8776/v2/%\(project_id\)s openstack endpoint create region RegionOne volumev3 public http://controller:8776/v3/%\(project_id\)s openstack endpoint create region RegionOne volumev3 internal http://controller:8776/v3/%\(project_id\)s openstack endpoint create region RegionOne volumev3 admin http://controller:8776/v3/%\(project_id\)s oCài đặt cấu hình thành phần yum install openstack-cinder oSửa file cinder.conf vi /etc/cinder/cinder.conf { [database] 66 connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder [DEFAULT] transport_url = rabbit://openstack:RABBIT_PASS@controller [DEFAULT] auth_strategy = keystone [keystone_authtoken] www_authenticate_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_PASS [DEFAULT] my_ip = 10.0.0.11 [oslo_concurrency] lock_path = /var/lib/cinder/tmp } oSửa file cinder.conf vi /etc/nova/nova.conf { [cinder] os_region_name = RegionOne 67 } oKhởi động lại service systemctl restart openstack-nova-api.service systemctl enable openstack-cinder-api.service openstack-cinderscheduler.service systemctl start openstack-cinder-api.service openstack-cinderscheduler.service Triển khai Compute node a Chuẩn bị oCài đặt Openstack Repository (Rocky) yum install centos-release-openstack-rocky oCài đặt Openstack client yum install python-openstackclient oCentOS enable SELinux by default Install the openstack-selinux package to automatically manage security policies for OpenStack services yum install openstackselinux b Cài đặt Nova oCài đặt cấu hình thành phần yum install openstack-nova-compute oSửa file nova.conf vi /etc/nova/nova.conf { [DEFAULT] enabled_apis=osapi_compute,metadata [DEFAULT] transport_url=rabbit://openstack:RABBIT_PASS@controller [api] auth_strategy=keystone 68 [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_PASS [DEFAULT] my_ip=MANAGEMENT_INTERFACE_IP_ADDRESS [DEFAULT] use_neutron=true firewall_driver=nova.virt.firewall.NoopFirewallDriver [vnc] enabled=true server_listen=0.0.0.0 server_proxyclient_address=$my_ip novncproxy_base_url=http://controller:6080/vnc_auto.html [glance] api_servers=http://controller:9292 [oslo_concurrency] lock_path=/var/lib/nova/tmp [placement] 69 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_PASS [libvirt] virt_type=qemu } egrep -c '(vmx|svm)' /proc/cpuinfo systemctl enable libvirtd.service openstack -nova-compute.service systemctl start libvirtd.service openstack -nova-compute.service o Thêm compute node vào cell database (nêu Cài đặt Controller node) c Cài đặt Neutron oCài đặt cấu hình thành phần yum install openstack-neutron-linuxbridge ebtables ipset oSửa file neutron.conf vi /etc/neutron/neutron.conf { [DEFAULT] transport_url=rabbit://openstack:RABBIT_PASS@controller [DEFAULT] auth_strategy=keystone [keystone_authtoken] www_authenticate_uri=http://controller:5000 auth_url=http://controller:5000 70 memcached_servers=controller:11211 auth_type=password project_domain_name=default user_domain_name=default project_name=service username=neutron password=NEUTRON_PASS [oslo_concurrency] lock_path=/var/lib/neutron/tmp } oSửa file linuxbridge_agent.ini vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini { [linux_bridge] physical_interface_mappings=provider:PROVIDER_INTERFACE_N AME [vxlan] enable_vxlan=false [securitygroup] enable_security_group=true firewall_driver=neutron.agent.linux.iptables_firewall.IptablesFirewall Driver } modprobe br_netfilter sysctl -p sysctl net.bridge oSửa file nova.conf vi /etc/nova/nova.conf { [neutron] 71 url=http://controller:9696 auth_url=http://controller:5000 auth_type=password project_domain_name=default user_domain_name=default region_name=RegionOne project_name=service username=neutron password=NEUTRON_PASS } systemctl enable openstack-nova-compute.service systemctl restart openstack-nova-compute.service systemctl enable neutron-linuxbridge-agent.service systemctl start neutron-linuxbridge-agent.service  PROVIDER NETWORK o Sửa file neutron.conf vi /etc/neutron/neutron.conf { [DEFAULT] notify_nova_on_port_status_changes=true notify_nova_on_port_data_changes=true [nova] auth_url=http://controller:5000 auth_type=password project_domain_name=default user_domain_name=default region_name=RegionOne project_name=service username=nova password=NOVA_PASS 72 [oslo_concurrency] lock_path=/var/lib/neutron/tmp } Triển khai Storage node a Chuẩn bị oCài đặt gói phần mềm LVM yum install lvm2 device-mapper-persistent-data oKhởi động dịch vụ LVM systemctl enable lvm2-lvmetad.service systemctl start lvm2-lvmetad.service o Tạo volume LVM pvcreate /dev/sdb vgcreate cinder-volumes /dev/sdb oSửa file lvm.conf vi /etc/lvm/lvm.conf { devices { filter = [ "a/sdb/", "r/.*/"] } } b Cài đặt Storage oCài đặt cấu hình thành phần yum install openstack-cinder targetcli python-keystone oSửa file cinder.conf vi /etc/cinder/cinder.conf { [database] connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder [DEFAULT] 73 transport_url = rabbit://openstack:RABBIT_PASS@controller [DEFAULT] auth_strategy = keystone [keystone_authtoken] www_authenticate_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_PASS [DEFAULT] my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS [lvm] volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver volume_group = cinder-volumes iscsi_protocol = iscsi iscsi_helper = lioadm [DEFAULT] enabled_backends = lvm [DEFAULT] glance_api_servers = http://controller:9292 74 [oslo_concurrency] lock_path = /var/lib/cinder/tmp [DEFAULT] backup_driver = cinder.backup.drivers.swift backup_swift_url = SWIFT_URL } oĐể hiển thị SWIFT_URL openstack catalog show object-store oKhởi động lại service systemctl enable openstack-cinder-volume.service target.service systemctl start openstack-cinder-volume.service target.service systemctl enable openstack-cinder-backup.service systemctl start openstack-cinder-backup.service oVerify operation admin-openrc openstack volume service list 75 ... TRIỂN KHAI CÀI ĐẶT HỆ THỐNG PRIVATE CLOUD CHO CÁC ỨNG DỤNG ĐÀO TẠO VÀ THỰC HÀNH DỰA TRÊN GIẢI PHÁP MÃ NGUỒN MỞ OPENSTACK Chương trình bày cách thức triển khai hệ thống Private cloud cho ứng dụng. .. GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TRẦN ANH TUẤN NGHIÊN CỨU VÀ TRIỂN KHAI HỆ THỐNG PRIVATE CLOUD CHO CÁC ỨNG DỤNG ĐÀO TẠO VÀ THỰC HÀNH DỰA TRÊN GIẢI PHÁP MÃ NGUỒN MỞ OPENSTACK Quyết định số: 655/QĐ-CTSV... CLOUD CHO CÁC ỨNG DỤNG ĐÀO TẠO VÀ THỰC HÀNH DỰA TRÊN GIẢI PHÁP MÃ NGUỒN MỞ OPENSTACK I Hệ thống phần c ứng có II Bài toán quy hoạch máy chủ Mơ hình triển khai

Ngày đăng: 21/02/2021, 09:56

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w