목적 : 물리 네트워크 장비(L2 스위칭, L3 라우팅)에 의존적인 Provider Networks 모드가 아닌 Self-Service Network 모드 환경에서
 내부 테넌트 네트워크가 SNAT를 통한 외부 연결과 SNAT 없이 직접 라우팅을 통한 외부 연결에 대한 비교를 함

결론)
 - SNAT을 제외하고 라우팅을 통한 처리가 가능함, 단 오픈스택과 연동되는 물리 네트워크 장비에 수동으로 테넨트 내부 대역에 대한 라우팅을 직접 넣어주어야됨
 - 테넌트 내부 대역이 변동이 자주 있을 시 상단 물리 네트워크 장비에 설정을 같이 변동 설정이 필요함, 운영자가 다를 경우 긴밀한 업무 협조가 필요함
 - 그래서 위 처럼 수동으로 라우팅을 지정하는 것이 아닌 BGP를 통한 자동으로 네트워크 대역을 생성/전파/교환 할 수 있음
 - 장점 : 내외부간 NAT가 없는 환경이므로 application 서비스및 운영서버들의 경우 관리에 용이함(e.g 일부 서비스 경우 NAT 환경 시 인지 불가능)
 - 고려사항 : 가상라우터를 이중화/삼중화 구성 시(=HA/VRRP)는 아직 테스트 진행해보지 않았음


# 환경 : Linux Bridge Driver 사용, Openstack Ocata 버전, 테스트 PC(테스트PC - Controller - Compute 총 3대)
1 . SNAT Enable(default) 환경
1.1 네트워크 토폴로지 확인
# 아래 처럼 vRouter와 내부 네트워크가 연결되어 있음


# vRouter 확인 : 맨 하단에 'SNAT 활성화됨' 즉, 인스턴스가 외부에 통신 시 Source IP가 192.168.254.178로 SNAT 됨, 단 Floating 는 제외


# Controller 에서 Namespace의 vRouter의 NAT Table 확인 : snat 정책이 확인됨
# FIP사용 인스턴스 확인 : 172.17.1.6 IP를 소유하고 있는 인스턴스는 192.168.254.173 Floating 를 가지고 있고 1:1 NAT 정책을 확인됨


# 라우터 상세 정보 확인 : 'enable_snat: true' 를 확인함


# 테스트
Ubuntu(172.17.1.11 -> 192.168.254.45) ---> vRouter(SNAT 192.168.254.178 -> 192.168.254.45) ---> HomeLinux(192.168.254.178 -> 192.168.254.45)
- 내부 Ubuntu 인스턴스에서 192.168.254.45로 ping(icmp) 1개 송수신 완료


# 외부에 HomeLinux 에서 패킷덤프(icmp 필터링)에서 확인하면 오픈스택vRouter가 SNAT하여 출발지IP가 192.168.254.178로 보이는 것을 알 수 있음



# 환경 : Linux Bridge Driver 사용, Openstack Ocata 버전, 테스트 PC(공유기 - Controller - Compute 총 3대)
2 . SNAT Disable 환경
# 내부 테넌트 네트워크 생성 
. demo-openrc
openstack network create selfservice
openstack subnet create --network selfservice --dns-nameserver 168.126.63.1 --gateway 172.17.1.1 --subnet-range 172.17.1.0/24 selfservice

# 가상 라우터 생성 및 내부네트워크 연결
. demo-openrc
openstack router create router
neutron router-interface-add router selfservice

# 아래 실행 시 실패, demo-openrc 권한으로는 'disable-snat' 라우터생성 불가능, admin권한 부여
openstack router set --external-gateway cf09ae59-95fd-4d8a-b2b5-671d1af7e447 \
 --fixed-ip subnet=d7716b2e-e894-44e2-b4d7-09c29dcb7f2b,ip-address=192.168.254.175 \
 --disable-snat router


# admin권한 부여 후 'disable-snat' 라우터생성 가능.
# 라우터에 외부 네트워크 연결, 라우터의 IP 지정.
. admin-openrc
openstack router set --external-gateway cf09ae59-95fd-4d8a-b2b5-671d1af7e447 \
 --fixed-ip subnet=d7716b2e-e894-44e2-b4d7-09c29dcb7f2b,ip-address=192.168.254.175 \
 --disable-snat router


# vRouter 확인 : 맨 하단에 'SNAT 비활성화됨' 즉, 인스턴스가 외부에 통신 시 Source IP가 변경되지 않고 그대로 라우팅 통신함, 단 FIP 경우는 1:1 SNAT 됨


# Controller 에서 Namespace의 vRouter의 NAT Table 확인 : 기존에 anywhere 의 snat 정책이 존재하지 않음
# FIP사용 인스턴스 확인 : 172.17.1.11 IP를 소유하고 있는 인스턴스는 192.168.254.176 Floating 를 가지고 있고 1:1 NAT 정책을 확인됨(=float-snat)


# 테스트 : 단 공유기에 172.16.0.0/16 next-hop 192.168.254.175 static routing 설정함
Ubuntu1(172.17.1.6 -> 192.168.254.254) ---> vRouter(라우팅 처리 192.168.254.254)/패킷캡처 ---> 공유기(172.17.1.6 -> 192.168.254.254)
Ubuntu2(172.17.1.11/FIP소유 -> 192.168.254.254) ---> vRouter(float-snat 192.168.254.176 -> 192.168.254.254)/패킷캡처 ---> 공유기(192.168.254.176 -> 192.168.254.254)

# 내부 인스턴스(Ubuntu1,2) : ping 성공 확인



# 가상라우터의 외부NIC에 tcpdump 확인
 - Ubuntu1 경우 : 외부로 ping 나갈때 출발지IP인 172.17.1.6이 변경되지 않고 나가는 것을 확인
 - Ubuntu2 경우 : FIP로 인해 외부로 ping 나갈때 float-snat 되어서 출발지IP가 192.168.254.176으로 변경되어 나가는 것을 확인


# 공유기에서 확인
 - 아래 처럼 172.17.0.0/16을 가상라우터의 IP를 Next-hop 으로 설정함


 - 공유기에서도 172.16.1.6 인 Ubuntu1과 통신됨을 확인



# 참고링크
저작자 표시
신고
Posted by 쏠라구구
# 목적 : CentoS7에 메뉴얼로 오픈스택 Ocata 를 설치해보기
# 고충사항)
 - *.conf 파일 내용 수정 시 default 내용 자체에 오타(?)아닌 오타가 있어 설치가 제대로 안되는 경우 발생 => 그냥 맘편히 주석처리하고 직접 copy & pasty 넣자.
 - 네트워킹 부분에 설명이 너무 애매하고 복잡하게 설명이 나와서 3번 정도 설치 이후 이해를 하게됨 => 특히 provider 용어가 2가지 의미로 사용 되는 것으로 보임 등;
 - CentOS와 Ubuntu 둘 다 설치해보았을때 공식 메뉴얼이 CentOS는 거의 오류 없이 설치가 가능하며, Ubuntu의 경우 일부 부분 오류대응이 필요함;


# 설치링크

# 각 노드 기본 정보 : 계정(root/krdag), 모든 암호는 krdag 로 통일 - PC2대 사용함
Controller: NIC1(enp0s20f0u2, 192.168.254.151, 인스턴스 외부연동 시 사용 NIC), NIC2(enp0s20f0u1u4, x, VXLAN연동)
Compute: NIC1(enp5s1f0, 192.168.254.152), NIC2(enp5s1f1, x, VXLAN연동)


0. CentOS 기본 환경 설정
yum update
yum -y install nano wget net-tools tcpdump

0.1 NIC 설정
nmtui
systemctl restart network

0.2 SSH 설정
nano /etc/ssh/sshd_config

0.3 저장소 한국으로 변경 (2017.08.06 - yum 사용 시 기본적으로 ftp.daumkakao.com 을 사용해서 skip)
yum -y install bzip2
ll /etc/yum.repos.d/
yum repolist
bzip2 /etc/yum.repos.d/CentOS-*.repo
ll /etc/yum.repos.d/
yum repolist

echo '[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.daumkakao.com/centos/$releasever/os/$basearch/
gpgcheck=0
[updates]
name=CentOS-$releasever - Updates
baseurl=http://ftp.daumkakao.com/centos/$releasever/updates/$basearch/
gpgcheck=0
[extras]
name=CentOS-$releasever - Extras
baseurl=http://ftp.daumkakao.com/centos/$releasever/extras/$basearch/
gpgcheck=0' > /etc/yum.repos.d/Daum.repo

yum repolist
yum update
yum install -y nano wget


0.4 보안관련 설정
iptables -F
systemctl disable firewalld
systemctl stop firewalld

nano /etc/selinux/config
----------
SELINUX=disabled
----------
reboot


1. 기본환경설정 Environment


1.1 보안(암호키) Security 
각 서비스에 대한 암호를 사용 시 'pwgen' 이나 'openssl rand -hex 10' 으로 생성하여 사용하기를 권장
전 그냥 제가 사용하는 암호 1개를 공통으로 사용하였음


1.2 기본 네트워킹 Host networking
mgmt nic을 통한 각 서버들간 통신 및 /etc/hosts 를 통한 도메인 주소로 통신 설정

# DNS resolv(Local) 설정
(All nodes)
nano /etc/hosts
----------
127.0.0.1       localhost
192.168.254.151 Controller
192.168.254.152 Compute
----------
ping Controller
ping Compute


1.3 NTP 설정
(All nodes)
yum -y install chrony
nano /etc/chrony.conf
----------
server 0.asia.pool.ntp.org
server 1.kr.pool.ntp.org
server 2.asia.pool.ntp.org
----------
systemctl enable chronyd.service
systemctl start chronyd.service
systemctl status chronyd.service
chronyc sources


1.4 오픈스택패키지 설치 OpenSTack packages
(All nodes)
yum install -y centos-release-openstack-ocata
yum upgrade
y
y
reboot

yum install -y python-openstackclient
yum install -y openstack-selinux


1.5 SQL DB 설치 SQL database
(Controller node)
yum install -y mariadb mariadb-server python2-PyMySQL

# 아래 파일을 생성하면서 설정함
nano /etc/my.cnf.d/openstack.cnf
---------------
[mysqld]
bind-address = 192.168.254.151
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
---------------

systemctl enable mariadb.service
systemctl start mariadb.service
systemctl status mariadb.service

# mysql 기초설정(root 암호 설정 등, 실행하기를 권장함)
mysql_secure_installation

mysql -uroot -p
mysql> exit


1.6 Message queue 설정
(Controller node)
yum -y install rabbitmq-server
systemctl enable rabbitmq-server.service
systemctl start rabbitmq-server.service
systemctl status rabbitmq-server.service

rabbitmqctl add_user openstack krdag
rabbitmqctl set_permissions openstack ".*" ".*" ".*"


1.7 Memcached 설정
(Controller node)
yum -y install memcached python-memcached
nano /etc/sysconfig/memcached
---------------
OPTIONS="-l 127.0.0.1,::1,192.168.254.151"
---------------

systemctl enable memcached.service
systemctl start memcached.service
systemctl status memcached.service


2. 인증서비스 Identity Service (=Keystone)

2.1 설치 및 설정 Install and Configure
(Controller node)
mysql -u root -pkrdag
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'krdag';
exit

yum install -y openstack-keystone httpd mod_wsgi

nano /etc/keystone/keystone.conf
---------------
[database]
connection = mysql+pymysql://keystone:krdag@192.168.254.151/keystone

[token]
provider = fernet
---------------
grep ^[^#] /etc/keystone/keystone.conf

su -s /bin/sh -c "keystone-manage db_sync" keystone
mysql -u root -pkrdag
show DATABASES;
exit

keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

keystone-manage bootstrap --bootstrap-password krdag \
  --bootstrap-admin-url http://192.168.254.151:35357/v3/ \
  --bootstrap-internal-url http://192.168.254.151:5000/v3/ \
  --bootstrap-public-url http://192.168.254.151:5000/v3/ \
  --bootstrap-region-id RegionOne


nano /etc/httpd/conf/httpd.conf
---------------
ServerName 192.168.254.151
---------------

ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
systemctl enable httpd.service
systemctl start httpd.service
systemctl status httpd.service

export OS_USERNAME=admin
export OS_PASSWORD=krdag
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_DOMAIN_NAME=default
export OS_AUTH_URL=http://192.168.254.151:35357/v3
export OS_IDENTITY_API_VERSION=3
export


2.2 도메인/프로젝트/유저/역활 설정 Create a domain, projects, users, and roles
(Controller node)
openstack project create --domain default --description "Service Project" service
openstack project create --domain default --description "Demo Project" demo
openstack user create --domain default --password-prompt demo
demo유저의 암호 2번 입력(krdag)
openstack role create user
openstack role add --project demo --user demo user


2.3 동작 확인 Verify operation
(Controller node)
인증 토큰 방식을 disable 하자(=admin_token)
export
unset OS_AUTH_URL OS_PASSWORD

nano /etc/keystone/keystone-paste.ini
keystone-paste.ini  에서 [pipeline:public_api], [pipeline:admin_api], and [pipeline:api_v3] sections 에서 "admin_token_auth"을 제거

openstack --os-auth-url http://192.168.254.151:35357/v3 \
  --os-project-domain-name default --os-user-domain-name default \
  --os-project-name admin --os-username admin token issue
krdag 암호입력함

openstack --os-auth-url http://192.168.254.151:5000/v3 \
  --os-project-domain-name default --os-user-domain-name default \
  --os-project-name demo --os-username demo token issue
krdag 암호입력함


2.4 계정권한스크립트 Create OpenStack client environment scripts
(Controller node)
nano admin-openrc
---------------
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=krdag
export OS_AUTH_URL=http://192.168.254.151:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
---------------

nano demo-openrc
---------------
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=krdag
export OS_AUTH_URL=http://192.168.254.151:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
---------------

테스트(Controller 및 Compute1) : admin 계정권한부여
. admin-openrc
openstack token issue

테스트(Controller 및 Compute1)  : demo 계정권한부여
. demo-openrc
openstack token issue


3. 이미지서비스 Image Service (=glance)

3.1 설치 및 설정 Install and Configure
(Controller node)
이미지 저장 기본 : 컨트롤러 노드 /var/lib/glance/images/
환경설정 변경하여 오브젝트 스토리지 서비스 Swift 에도 저장 가능

mysql -u root -pkrdag
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'krdag';
exit

openstack user create --domain default --password-prompt glance
krdag 암호입력함

. admin-openrc
openstack role add --project service --user glance admin
openstack service create --name glance --description "OpenStack Image" image
openstack endpoint create --region RegionOne image public http://192.168.254.151:9292
openstack endpoint create --region RegionOne image internal http://192.168.254.151:9292
openstack endpoint create --region RegionOne image admin http://192.168.254.151:9292

yum install -y openstack-glance
nano /etc/glance/glance-api.conf
---------------
[database]
connection = mysql+pymysql://glance:krdag@192.168.254.151/glance

[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = krdag

[paste_deploy]
flavor = keystone
---------------
grep ^[^#] /etc/glance/glance-api.conf

nano /etc/glance/glance-registry.conf
---------------
[database]
connection = mysql+pymysql://glance:krdag@192.168.254.151/glance

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = krdag

[paste_deploy]
flavor = keystone
---------------
grep ^[^#] /etc/glance/glance-registry.conf

su -s /bin/sh -c "glance-manage db_sync" glance
mysql -u root -pkrdag
show DATABASES;
exit

systemctl enable openstack-glance-api.service openstack-glance-registry.service
systemctl start openstack-glance-api.service openstack-glance-registry.service
systemctl status openstack-glance-api.service openstack-glance-registry.service


3.2 동작 확인 Verify operation
(Controller node)
. admin-openrc
openstack image create "cirros" \
  --file cirros-0.3.5-x86_64-disk.img \
  --disk-format qcow2 --container-format bare \
  --public

openstack image list


4. 컴퓨트서비스 Compute Service(=Nova)

4.1 Controller Node 설치 및 설정 Install and Configure controller node
(Controller node)
mysql -uroot -pkrdag
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'krdag';
exit


openstack user create --domain default --password-prompt nova
openstack role add --project service --user nova admin
openstack service create --name nova --description "OpenStack Compute" compute
openstack endpoint create --region RegionOne compute public http://192.168.254.151:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://192.168.254.151:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://192.168.254.151:8774/v2.1


openstack user create --domain default --password-prompt placement
openstack role add --project service --user placement admin
openstack service create --name placement --description "Placement API" placement
openstack endpoint create --region RegionOne placement public http://192.168.254.151:8778
openstack endpoint create --region RegionOne placement internal http://192.168.254.151:8778
openstack endpoint create --region RegionOne placement admin http://192.168.254.151:8778


yum install -y openstack-nova-api openstack-nova-conductor \
  openstack-nova-console openstack-nova-novncproxy \
  openstack-nova-scheduler openstack-nova-placement-api

nano /etc/nova/nova.conf
---------------
[DEFAULT]
enabled_apis = osapi_compute,metadata
my_ip = 192.168.254.151
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
transport_url = rabbit://openstack:krdag@192.168.254.151
# CPU, Ram, Disk Overcommit 설정
cpu_allocation_ratio=8.0
ram_allocation_ratio=4.0
disk_allocation_ratio=8.0

[api]
auth_strategy = keystone

[api_database]
connection = mysql+pymysql://nova:krdag@192.168.254.151/nova_api

[database]
connection = mysql+pymysql://nova:krdag@192.168.254.151/nova

[glance]
api_servers = http://192.168.254.151:9292

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = krdag

[placement]
os_region_name = RegionOne
project_domain_name = default
project_name = service
auth_type = password
user_domain_name = default
auth_url = http://192.168.254.151:35357/v3
username = placement
password = krdag

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[vnc]
enabled = true
vncserver_listen = 192.168.254.151
vncserver_proxyclient_address = 192.168.254.151
---------------
grep ^[^#] /etc/nova/nova.conf


nano /etc/httpd/conf.d/00-nova-placement-api.conf
---------------
<Directory /usr/bin>
   <IfVersion >= 2.4>
      Require all granted
   </IfVersion>
   <IfVersion < 2.4>
      Order allow,deny
      Allow from all
   </IfVersion>
</Directory>
---------------

systemctl restart httpd
systemctl status 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
# 아래 실행 후 일부 에러 출력되는것은 무시 하자
su -s /bin/sh -c "nova-manage db sync" nova

mysql -u root -pkrdag
show DATABASES;
exit

nova-manage cell_v2 list_cells

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

systemctl status openstack-nova-api.service \
  openstack-nova-consoleauth.service openstack-nova-scheduler.service \
  openstack-nova-conductor.service openstack-nova-novncproxy.service


4.2 Compute Node 설치 및 설정 Install and Configure compute node
(Compute node)
yum install -y openstack-nova-compute

nano /etc/nova/nova.conf
---------------
[DEFAULT]
enabled_apis = osapi_compute,metadata
# 아래 IP는 컴퓨트노드의 각각 IP를 기입
my_ip = 192.168.254.152
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
transport_url = rabbit://openstack:krdag@192.168.254.151
# CPU, Ram, Disk Overcommit 설정
cpu_allocation_ratio=8.0
ram_allocation_ratio=4.0
disk_allocation_ratio=8.0

[api]
auth_strategy = keystone

[glance]
api_servers = http://192.168.254.151:9292

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = krdag

[libvirt]
virt_type = kvm

[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://192.168.254.151:35357/v3
username = placement
password = krdag

[vnc]
enabled = true
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 192.168.254.152
novncproxy_base_url = http://192.168.254.151:6080/vnc_auto.html
---------------
grep ^[^#] /etc/nova/nova.conf


systemctl enable libvirtd.service openstack-nova-compute.service
systemctl start libvirtd.service openstack-nova-compute.service
systemctl status libvirtd.service openstack-nova-compute.servic


# Compute Node 추가 시 Controller Node에서 확인
(Controller node)
. admin-openrc
openstack hypervisor list
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
컴퓨트 노드가 추가되면 바로 위 명령어를 수동 실행해서 노드를 추가해야 됨
이를 안하기 위해서 아래 내용을 추가함

nano /etc/nova/nova.conf
---------------
[scheduler]
discover_hosts_in_cells_interval = 300
---------------


4.3 Compute Node 설치 및 설정 Install and Configure compute node
(Controller node)
openstack compute service list
openstack catalog list
openstack image list
nova-status upgrade check



4.4 (추가) 1대의 컴퓨트 노드로 인스턴스 2대 이상 생성 시 RetryFilter 로 생성이 되지 않을 경우
기본적으로 인스턴스 배포 시 컴퓨트노드들에 대한 스케줄링 정책들(=필터)이 존재함.
아래 처럼 nova 관련 로그를 확인하여 혹시 필터정책으로 신규배포가 안될 때에는 해당 필터를 삭제하고 서비스 재시작하고 재배포할것

tail -f /var/log/nova/nova-scheduler.log
nova /etc/nova/nova.conf
cat /etc/nova/nova.conf | grep scheduler_default_filters
----------------(변경전)
# Deprecated group;name - DEFAULT;scheduler_default_filters
enabled_filters=RetryFilter, AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

# Deprecated group;name - DEFAULT;scheduler_available_filters
#available_filters=nova.scheduler.filters.all_filters
----------------(변경후)
enabled_filters=AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

systemctl restart openstack-nova-api.service \
  openstack-nova-consoleauth.service openstack-nova-scheduler.service \
  openstack-nova-conductor.service openstack-nova-novncproxy.service

systemctl status openstack-nova-api.service \
  openstack-nova-consoleauth.service openstack-nova-scheduler.service \
  openstack-nova-conductor.service openstack-nova-novncproxy.service



5. 네트워킹서비스 Networking service(=Neutron)

5.1 Controller Node 설치 및 설정 Install and Configure controller node
(Controller node)
mysql -uroot -pkrdag
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'krdag';
exit


openstack user create --domain default --password-prompt neutron
krdag 암호입력함
openstack role add --project service --user neutron admin

openstack service create --name neutron --description "OpenStack Networking" network
openstack endpoint create --region RegionOne network public http://192.168.254.151:9696
openstack endpoint create --region RegionOne network internal http://192.168.254.151:9696
openstack endpoint create --region RegionOne network admin http://192.168.254.151:9696


# 아래 네트워크모드 중 선택하여 설치하자, 전 Self-Service Networks 로 설치를 진행함
5.1.1 Networking Option 1: Provider networks
(Controller node)

5.1.2 Networking Option 2: Self-service networks
(Controller node)
yum install -y openstack-neutron openstack-neutron-ml2 \
  openstack-neutron-linuxbridge ebtables


nano /etc/neutron/neutron.conf
---------------
[DEFAULT]
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
transport_url = rabbit://openstack:krdag@192.168.254.151
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true

[database]
connection = mysql+pymysql://neutron:krdag@192.168.254.151/neutron

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = krdag

[nova]
auth_url = http://192.168.254.151:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = krdag

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
---------------
grep ^[^#] /etc/neutron/neutron.conf


nano /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
---------------
grep ^[^#] /etc/neutron/plugins/ml2/ml2_conf.ini


nano /etc/neutron/plugins/ml2/linuxbridge_agent.ini
---------------
[linux_bridge]
physical_interface_mappings = provider:enp0s20f0u2

[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

[vxlan]
enable_vxlan = true
local_ip = 192.168.254.151
l2_population = true
---------------
grep ^[^#] /etc/neutron/plugins/ml2/linuxbridge_agent.ini


nano /etc/neutron/l3_agent.ini
---------------
[DEFAULT]
interface_driver = linuxbridge
---------------

nano /etc/neutron/dhcp_agent.ini
---------------
[DEFAULT]
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
---------------


nano /etc/neutron/metadata_agent.ini
---------------
[DEFAULT]
nova_metadata_ip = 192.168.254.151
metadata_proxy_shared_secret = sharedsecretkrdag
---------------


nano /etc/nova/nova.conf
---------------
[neutron]
url = http://192.168.254.151:9696
auth_url = http://192.168.254.151:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = krdag
service_metadata_proxy = true
metadata_proxy_shared_secret = sharedsecretkrdag
---------------

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

mysql -u root -pkrdag
show DATABASES;
exit

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 status 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
systemctl status neutron-l3-agent.service



5.2 Compute Node 설치 및 설정 Install and Configure compute node
(Compute node)
yum install -y openstack-neutron-linuxbridge ebtables ipset

nano /etc/neutron/neutron.conf
---------------
[DEFAULT]
auth_strategy = keystone
transport_url = rabbit://openstack:krdag@192.168.254.151

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = krdag

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
---------------
grep ^[^#] /etc/neutron/neutron.conf


# 아래 네트워크모드 중 선택하여 설치하자, 전 Self-Service Networks 로 설치를 진행함
5.2.1 Networking Option 1: Provider networks
(Compute node)

5.2.2 Networking Option 2: Self-service networks
(Compute node)
nano  /etc/neutron/plugins/ml2/linuxbridge_agent.ini
---------------
[linux_bridge]
physical_interface_mappings = provider:enp5s1f1

[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

[vxlan]
enable_vxlan = true
# 아래 IP는 컴퓨트노드의 각각 IP를 기입
local_ip = 192.168.254.152
l2_population = true
---------------
grep ^[^#] /etc/neutron/plugins/ml2/linuxbridge_agent.ini


nano  /etc/nova/nova.conf
---------------
[neutron]
url = http://192.168.254.151:9696
auth_url = http://192.168.254.151:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = krdag
---------------

systemctl restart openstack-nova-compute.service
systemctl status openstack-nova-compute.service

systemctl enable neutron-linuxbridge-agent.service
systemctl start neutron-linuxbridge-agent.service
systemctl status neutron-linuxbridge-agent.service


5.3 동작 확인 Verify operation
(Controller node)
. admin-openrc
openstack extension list --network
openstack network agent list


6. 대쉬보드서비스 Dashboard service(=Horizon)
6.1 설치 및 설정 Install and Configure
(Controller node)
yum install -y openstack-dashboard

nano /etc/openstack-dashboard/local_settings
---------------[기존 항목내용에 틀린것 있으니 다 주석처리하고 아래 내용을 새로 넣어서 하자 e.g v3.0 오타 -> v3 해야됨 등]
OPENSTACK_HOST = "192.168.254.151"
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
ALLOWED_HOSTS = ['*', ]

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {
    'default': {
         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
         'LOCATION': '192.168.254.151:11211',
    }
}

OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}

TIME_ZONE = "Asia/Seoul"
---------------
grep ^[^#] /etc/openstack-dashboard/local_settings


systemctl restart httpd.service memcached.service
systemctl status httpd.service memcached.service


6.2 동작 확인 Verify operation
http://192.168.254.151/dashboard
(default 도메인에 admin/demo 유저로 로그인, 암호는 krdag)



7. 블록스토리지서비스 Block Storage service(=Cinder)
7.1 설치 및 설정 Install and Configure Controller Node
(Controller node)

작성중~~~~

# 블록스토리지서비스 설치
Controller)
mysql -uroot -pkrdag

CREATE DATABASE cinder;
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'krdag';

openstack user create --domain default --password-prompt cinder
krdag 암호입력함

openstack role add --project service --user cinder admin
openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3

openstack endpoint create --region RegionOne volumev2 public   http://192.168.254.151:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 internal http://192.168.254.151:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 admin    http://192.168.254.151:8776/v2/%\(project_id\)s

openstack endpoint create --region RegionOne volumev3 public   http://192.168.254.151:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 internal http://192.168.254.151:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 admin    http://192.168.254.151:8776/v3/%\(project_id\)s

apt install -y cinder-api cinder-scheduler

nano /etc/cinder/cinder.conf
---------------
[DEFAULT]
transport_url = rabbit://openstack:krdag@192.168.254.151
auth_strategy = keystone
my_ip = 192.168.254.151

[database]
connection = mysql+pymysql://cinder:krdag@192.168.254.151/cinder

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = krdag

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
---------------

su -s /bin/sh -c "cinder-manage db sync" cinder


nano /etc/nova/nova.conf
---------------
[cinder]
os_region_name = RegionOne
---------------

service nova-api restart
service cinder-scheduler restart
service apache2 restart


Block)
apt install -y lvm2

pvcreate /dev/sdb
pvdisplay

/etc/init.d/lvm2 start
pvdisplay

vgcreate cinder-volumes /dev/sdb
pvscan

nano /etc/lvm/lvm.conf
---------------
filter = [ "a/sdb/", "r/.*/"]
---------------

apt install -y cinder-volume

nano /etc/cinder/cinder.conf
---------------
[DEFAULT]
transport_url = rabbit://openstack:krdag@192.168.254.151
auth_strategy = keystone
my_ip = 192.168.254.154
enabled_backends = lvm
glance_api_servers = http://192.168.254.151:9292

[database]
connection = mysql+pymysql://cinder:krdag@192.168.254.151/cinder

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = krdag

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = tgtadm

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
---------------

service tgt restart
service cinder-volume restart


서비스정상동작확인 : Controller)
openstack volume service list


8. 오케스트레이션서비스 Orchestration Service(=Heat)

8.1 설치 및 설정 Install and Configure
(Controller node)
mysql -uroot -pkrdag

CREATE DATABASE heat;
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'krdag';
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'krdag';
exit

openstack user create --domain default --password-prompt heat
krdag 암호입력함

openstack role add --project service --user heat admin

openstack service create --name heat --description "Orchestration" orchestration
openstack service create --name heat-cfn --description "Orchestration"  cloudformation

openstack endpoint create --region RegionOne orchestration public http://192.168.254.151:8004/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne orchestration internal http://192.168.254.151:8004/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne orchestration admin http://192.168.254.151:8004/v1/%\(tenant_id\)s

openstack endpoint create --region RegionOne cloudformation public http://192.168.254.151:8000/v1
openstack endpoint create --region RegionOne cloudformation internal http://192.168.254.151:8000/v1
openstack endpoint create --region RegionOne cloudformation admin http://192.168.254.151:8000/v1


openstack domain create --description "Stack projects and users" heat
openstack user create --domain heat --password-prompt heat_domain_admin
krdag 암호입력함

openstack role add --domain heat --user-domain heat --user heat_domain_admin admin
openstack role create heat_stack_owner
openstack role add --project demo --user demo heat_stack_owner
openstack role create heat_stack_user


yum -y install openstack-heat-api openstack-heat-api-cfn openstack-heat-engine

nano /etc/heat/heat.conf
---------------
[DEFAULT]
transport_url = rabbit://openstack:krdag@192.168.254.151
heat_metadata_server_url = http://192.168.254.151:8000
heat_waitcondition_server_url = http://192.168.254.151:8000/v1/waitcondition
stack_domain_admin = heat_domain_admin
stack_domain_admin_password = krdag
stack_user_domain_name = heat

[database]
connection = mysql+pymysql://heat:krdag@192.168.254.151/heat

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = heat
password = krdag

[trustee]
auth_type = password
auth_url = http://192.168.254.151:35357
username = heat
password = krdag
user_domain_name = default

[clients_keystone]
auth_uri = http://192.168.254.151:35357

[ec2authtoken]
auth_uri = http://192.168.254.151:5000
---------------
grep ^[^#] /etc/heat/heat.conf

su -s /bin/sh -c "heat-manage db_sync" heat

mysql -u root -pkrdag
show DATABASES;
exit

systemctl enable openstack-heat-api.service \
  openstack-heat-api-cfn.service openstack-heat-engine.service

systemctl start openstack-heat-api.service \
  openstack-heat-api-cfn.service openstack-heat-engine.service

systemctl status openstack-heat-api.service \
  openstack-heat-api-cfn.service openstack-heat-engine.service


8.2 동작 확인 Verify operation
(Controller node)
. admin-openrc
openstack orchestration service list


9. 텔레매트리데이터수집서비스 Telemetry Data Collection service (=Ceilometer)


9.1 설치 및 설정 Install and Configure Compute Node
(Compute node)
yum -y install openstack-ceilometer-compute

nano /etc/ceilometer/ceilometer.conf
---------------
[DEFAULT]
transport_url = rabbit://openstack:krdag@192.168.254.151
auth_strategy = keystone

[keystone_authtoken]
auth_uri = http://192.168.254.151:5000
auth_url = http://192.168.254.151:35357
memcached_servers = 192.168.254.151:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = ceilometer
password = krdag

[service_credentials]
auth_url = http://192.168.254.151:5000
project_domain_id = default
user_domain_id = default
auth_type = password
username = ceilometer
project_name = service
password = krdag
interface = internalURL
region_name = RegionOne
---------------
grep ^[^#] /etc/ceilometer/ceilometer.conf


nano /etc/nova/nova.conf
---------------
[DEFAULT]
instance_usage_audit = True
instance_usage_audit_period = hour
notify_on_state_change = vm_and_task_state

[oslo_messaging_notifications]
driver = messagingv2
---------------
grep ^[^#] /etc/nova/nova.conf


systemctl enable openstack-ceilometer-compute.service
systemctl start openstack-ceilometer-compute.service
systemctl status openstack-ceilometer-compute.service

# compute 서비스 재시작
systemctl restart openstack-nova-compute.service
systemctl status openstack-nova-compute.service


9.2 설치 및 설정 Install and Configure Controller Node

9.2.1 Ceilometer 설치 사전 준비


# Gnocchi 설치(권장 DB)
(Controller node)
# 설치 실패 2017.08.06 gnocchi.conf 가 pip 로  설치시에는 잘 안됨, config-genetor 잘 안됨 => 일단 skip
# 위 링크 처럼 소스로 설치하자~


10. 인스턴스 실행 Launch an instance

10.1 가상 네트워크 생성
https://printf.kr/archives/307  <- 너무나 설정이 잘 나와있어서 참고가 많이 되었습니다

10.1.1 가상 네트워크 생성: Provider network



(Controller node)
. admin-openrc
아래 명령어 실행 시 아래 ini 파일에 저정한 provider 과 물리nic 을 사용하게 됨
openstack network create  --share --external --provider-physical-network provider --provider-network-type flat provider
---------------
nano /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2_type_flat]
flat_networks = provider

nano /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = provider:enp0s20f0u2
---------------

아래 명령어로 provider 네트워크에 사용할 IP 대역 정보를 지정함
openstack subnet create --network provider \
  --allocation-pool start=192.168.254.170,end=192.168.254.190 \
  --dns-nameserver 168.126.63.1 --gateway 192.168.254.254 \
  --subnet-range 192.168.254.0/24 provider

# Controller의 네트워크구성 정보
# Provider Bridge 생성됨 : brqcf09ae59-95 => 물리NIC1(=enp0s20f0u2)와 Tap(=tapbe75ac86-ec)으로 연결되어 있음
# Namespace 로 확인 시 provider 네트워크에 자동 할당될 dhcp 데몬이 생성됨(=192.168.254.170 IP 할당받았음)
ifconfig
brctl show
ip netns
ip netns "qdhcp.." ip a


# veth 로 연결된 상대방은 ethtool -S 로 ifindex 를 확인할 수 있다. 이후 ip a 로 ifindex 를 보면 됨
# 즉 아래 dhcpd 경우 ns... nic 이 bridge의 tap~ 과 연결 되어 있는 것을 알 수 있음
# ns-be75ac86-ec@if6 이름에서 '@if6' 이부분은 즉 peer_ifindex: 6을 의미함


openstack subnet list
openstack subnet show "포트ID"
Floating IP를 자동으로 할당하기 위한 dhcp를 사용하며(qdhcp, IP1개 할당 받음),
MTU 사이즈는 1500 이 기본값임


10.1.2 가상 네트워크 생성: Self-service network



(Controller node)
# Controller의 네트워크구성 정보
# Selfservice Bridge 생성됨 :brq9a539565-47 => '물리NIC2(=enp0s20f0u1u4)와 연결된 vxlan-90'과 Tap(=tap9d001fb0-31)으로 연결되어 있음
# Namespace 로 확인 시 self-service 네트워크에 자동 할당될 dhcp 데몬이 생성됨(=172.17.1.2 IP 할당받았음)
. demo-openrc
openstack network create selfservice
openstack subnet create --network selfservice --dns-nameserver 168.126.63.1 --gateway 172.17.1.1 --subnet-range 172.17.1.0/24 selfservice
내부 네트워크 생성 시 MTU는 1450이 기본값임
---------------
/etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
tenant_network_types = vxlan

[ml2_type_vxlan]
vni_ranges = 1:1000
---------------

 




# 내부 가상라우터 생성
각각 라우터를 생성하고,
해당 라우터에 내부가상네트워크를 연결하고,
해당 라우터에 외부 네트워크를 연동하는 명령어임, neutron cli 는 이제 openstack ~~ 로 변경하라고 함
. demo-openrc
openstack router create router
neutron router-interface-add router selfservice
neutron router-gateway-set router provider

ifconfig
ip netns

# qrouter 와 연결되는 tap 인터페[이스 2개가 생성됨( tapbca83bda-a1 , tapc1bf5a64-c3 )


# 생성된 L3-Agent(qrouter) Namespace 확인
# 해당 L3-Agent 의 NIC 정보 확인 ( qr-bca83bda-a1 = 내부연결 , qg-c1bf5a64-c3 = 외부연결 )


# qr/qg 가 각각 tap과 veth 로 연결된 것을 확인 (ethtool -S "")


# qrouter 의 SNAT 정보 확인



# 대쉬보드에서 확인(demo 계정)



10.2 flaver 생성하기 Create Flavor
. admin-openrc
openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1
openstack flavor create --id 1 --vcpus 1 --ram 1024 --disk 10 m2
openstack flavor create --id 2 --vcpus 1 --ram 2048 --disk 20 m3
openstack flavor create --id 3 --vcpus 2 --ram 2048 --disk 40 m4
openstack flavor create --id 4 --vcpus 2 --ram 4096 --disk 40 m5
openstack flavor create --id 5 --vcpus 2 --ram 8192 --disk 80 m6
openstack flavor create --id 6 --vcpus 4 --ram 8192 --disk 80 m7
openstack flavor create --id 7 --vcpus 8 --ram 4192 --disk 80 m8
openstack flavor create --id 8 --vcpus 8 --ram 8192 --disk 100 m9


10.3 데모유저용 키 페어 생성하기 Generate a key pair
. demo-openrc
ssh-keygen -q -N ""
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

openstack keypair list


10.4 Security rules 생성 Add security group rules
디폴트 룰에 icmp 와 ssh 허용하기
openstack security group rule create --proto icmp default
openstack security group rule create --proto tcp --dst-port 22 default
openstack security group rule create --proto tcp --dst-port 80 default


10.5.1 Provider Network 에 인스턴스 생성

10.5.2 Self-service Network 에 인스턴스 생성
. demo-openrc
# 각각 Name 이나 ID  확인하기
openstack flavor list
openstack image list
openstack network list
openstack security group list

# 위에서 확인한 정보를 기입하여 인스턴스 생성하기
openstack server create --flavor m1 --image cirros \
  --nic net-id=9a539565-47a9-429d-bc03-07226697f92f --security-group default \
  --key-name mykey selfservice-instance

openstack server list
openstack console url show selfservice-instance

# FIP 1개 생성
openstack floating ip create provider

# 할당된 FIP를 해당 인스턴스에 맵핑
openstack server add floating ip selfservice-instance 192.168.254.177
openstack server list

# FIP로 직접 접속
ssh cirros@192.168.254.177

# qrouter 에서 nat 확인 : 192.168.254.177 에 대해서 172.17.1.12 로 1:1 NAT 설정 확인



# Controller 과 Compute 간 vxlan 으로 default 경로 확인



# 컴퓨트 노드에 self-service 를 위한 bridge(=brq9a539565-47) 생성되며, vxlan-90 과 tapf6b72849-b5 이 연결됨
# namespace 는 보이지 않는 것을 알 수 있음
# ebtables 라는 이더넷처리 테이블을 통한 경로 통신 확인



# 기본적으로 Instance 당 tap 인터페이스가 1개씩 생성됨
즉 해당 vm(=instance)에 패킷 덤프를 뜰 경우 해당 컴퓨트노드에서 tap 인터페이스를 통한 tcpdump 등을 하면 됨
compute) tcpdump -i tapXX icmp

1) Compute Node에서 먼저 확인
brq 라는 bridge 이외에 특별한 정보가 없음
ifconfig
brctl show
brctl showmacs "brq~"
ebtables -L


2) Instance1개 생성함
해당 Compute Node에 Instance 당 1개의 tap 인터페이스가 생성됨, 확인은 "tap + 'Port ID의 앞자리 11자리'"로 확인, (openstack port list)
즉, 해당 tap 을 tcpdump 시 연결된 1개의 인스턴스의 NIC 송수신 트래픽을 켭쳐하여 확인 할 수 있음
brctl showmacs 'brq~~' 로 해당 브리지(=가상스위치?)에 학습된 MAC 주소 정보를 알 수 있음
vxlan 으로 통신을 하며 L2 local/remote table 정보인 ebtables 에 정보 확인 가능, 해당 정보로 mac과 IP, tap 이름도 확인 가능함
ifconfig tap8c841f25-aa
brctl show
brctl showmacs brq9a539565-47
ebtables -L
bridge fdb


3) Instance 1개 추가 더 생성함(1개의 컴퓨트 노드에 총 2대의 VM 생성함)
1개의 tap~ 더 생성됨, 각각 인스턴스1번과 2번에 연결되어 있음
brq 브릿지에 tap~ 1개 더 연결됨을 확인(=brctl show), 그외 mac table 정보도 확인함
ifconfig | grep tap
brctl show
brctl showmacs brq9a539565-47
ebtables -L
bridge fdb


# port list 와 tap 이름간 맵핑 (각각 Controller Node 와 Compute Node)




(2017.08.08 추가) 운영 서비스 환경에서는 아래 ebtables 와 bridge 초기화 하지 말것 : 잘못 초기화 시 loop 발생 가능
4) Instance 2(=172.16.1.6)번을 오픈스택 대쉬보드에서 강제로 삭제(=Termination)
ifconfing 와 brctl 에서는 tap 1개가 삭제되었음, 하지만 ebtables 에는 해당 tap 정보가 남아있음;;;
간혹 인스턴스에 IP를 할당하고 삭제 후 재할당 후 통신이 안되는 경우가 있는데 혹시 이게 문제는 아닌지 의심스러움
ifconfig | grep tap
brctl show
brctl showmacs brq9a539565-47
ebtables -L
bridge fdb


ebtables 를 초기화하자(= ebtables --init-table) 이후 다시 확인하면 tap이 정상적으로 삭제되었음


brctl mac table 초기화하자
brctl showmacs "bridge이름"
echo "1" > /sys/class/net/"bridge이름"/bridge/flush
echo "1" > /sys/class/net/brq9a539565-47/bridge/flush
brctl showmacs "bridge이름"



# 인스턴스에 지정된 Fixed IP를 할당하여 생성해보자
반드시 해당 인스턴스를 소유한 계정으로 권한 부여를 먼저 할 것
네트워크, 서브넷 ID를 먼저 확인 후 지정된 IP를 소유한 포트를 생성하자
. demo-openrc
openstack network list
openstack subnet list
openstack port list
openstack port create --network "네트웍ID" --fixed-ip subnet="서브넷ID",ip-address=172.17.1.200 "포트이름"
openstack port create --network 9a539565-47a9-429d-bc03-07226697f92f --fixed-ip subnet=5f743fd0-ba6f-458c-a70c-585af92b6be0,ip-address=172.17.1.200 172_17_1_200

# 이후 인스턴스 생성 시 '네트워크' 메뉴가 아닌 '네트워크포트'를 클릭하면 할당 가능한 포트(=IP)가 있고, 선택하면됨


# 포트 삭제 시
openstack port delete "포트이름"



10.6 네트워크 트래픽 flow

10.6.1 Provider networks with Linux bridge




10.6.2 Self-service Network with Linux Bridge



10.6.3 HA with VRRP







10.7 그외 OS 이미지 다운 및 설치하기

10.7.1 우분투 다운 및 설치 (16.04 LTS Cloud Image)
# 해당 이미지 업로드 후 keypair 지정 후 ubuntu 로 로그인



CentOS 다운 및 설치 (GenericCloud Image)

윈도우 다운 및 설치 (KVM 용 다운)


10.8 템플릿으로 인스턴스 생성하기 (=Heat)
GUI 설정)
demo 계정 로그인 - Orchestration - Stack(스택) => 스택 시작(새창에 입력)
# 아래 처럼 템플릿 데이터에 전체 설정 값 입력
heat_template_version: 2015-10-15
description: Launch a basic instance with CirrOS image using the
             ``m1.tiny`` flavor, ``mykey`` key,  and one network.

parameters:
  NetID:
    type: string
    description: Network ID to use for the instance.

resources:
  server:
    type: OS::Nova::Server
    properties:
      image: cirros
      flavor: m1
      key_name: mykey
      networks:
      - network: { get_param: NetID }

outputs:
  instance_name:
    description: Name of the instance.
    value: { get_attr: [ server, name ] }
  instance_ip:
    description: IP address of the instance.
    value: { get_attr: [ server, first_address ] }


# 아래 처럼 stack 이름과 timout 값, 롤백, 그리고 demo 계정의 암호와 해당 instance가 사용할 네트워크ID를 입력


# 생성된 Stack 확인


# 아래 처럼 Stack-Test-XX 이름으로 Instance 생성을 확인함



CLI설정)
openstack stack list
저작자 표시
신고
Posted by 쏠라구구
iperf3 네트워크 대역폭 측정 및 트래픽 제너레이터 사용법
 
* iperf3 를 이용하며 간단하게 네트워크 통신 구간에 가용한 네트워크 대역폭을 측정해보자
 
 
1. iperf3 소개
> 간단하게 PC(혹은 핸드폰)의 유/무선 네트워크 통신 구간에서 최대전송능력(대역폭)을 측정해줌
> 이를 위해서 송신단말(=Client PC)에서 최대트래픽을 수신단말(=Server PC)에 전송하고 이에 대한 결과치를 표출해줌
> 기존 iperf 에서 현재 iperf3 업그레이드됨
> 이외에도 CLI 결과 출력된 부분은 GUI로 보여주는 툴들도 존재함(=jperf 등)
> 리눅스, 윈도우, 안드로이드 이외 다양한 OS 제공
> TCP, UDP, SCTP with IPv4/IPv6 지원, 멀티캐스트
 
* iperf3 사이트
 
 
2. 설치
> 위 다운로드 사이트에서 windows 64bit 용 다운로드 후 CMD창에서 iperf3 사용
> VMware VM 2대에서 테스트함 : PC1(192.168.11.133)---(VMware가상네트워크)---PC2(192.168.11.134)
# iperf3 -h  : 도움말
 
 
3. 각 예제별 사용
> 기본 예제부터 옵션을 하나씩 테스트 하면서 트래픽 모니터링 하면 쉽게 이해 할 수 있음
> PC1=서버, PC2=클라이언트
 
3.1 기본 테스트 (클라이언트 -> 서버)
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V
=> (클라이언트) 디폴트옵션값 : tcp, port 5201, 윈도우 사이즈 8kbyte, 시간 10초 동안, 1초간격으로 모니터링, 1개 스트림
=> 클라이언트에서 전송 가능한 tcp 최대치의 트래픽을 10초동안 서버로 보냄
=> -V 옵션 : 상세한 정보를 출력
 
PC1#
=> 10초동안 총 4.89 GBytes 트래픽을 PC2(=클라이언트)로부터 받음
=> PC1(=서버)가 보낸 트래픽은 없음

 
PC2#
=> 10초동안 총 4.89 GBytes 트래픽을 PC1에게 보냄
=> 1초 간격으로 전송 트래픽 및 전송속도값 출력함
=> 받은것이 없는데 Summary 에 receiver 에 값이 나오는것 오류인듯...

 
 
3.2 리버스 (클라이언트 <- 서버)
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V -R
=> 3.1 번 테스트 트래픽을 서버에서 클라이언트로 전송함
 
PC1#
=> 10초동안 총 5.19 GBytes 트래픽을 PC2(=클라이언트)에게로 보냄

 
PC2#
=> 10초동안 총 5.19 GBytes 트래픽을 PC1에게서 받음

 
 
3.3 특정 파일 보내기 or 받기 (=비권장 측정 방법)
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V -F 1.GHO
=> 7기가 용량의 파일을 전송하면서 트래픽을 측정함
=> 다만, 실제 파일을 프로세싱하여 전송하다보니 앞 선 테스트보다는 성능이 떨어지게 측정됨
=> 또한, 전체 파일을 보내는 것이 아니고 일부 용량만 전송함, time 옵션을 증가해도 동일함
=> 최대 대역폭 측정 시 비권장 방식임
* -R 옵션 사용 시 클라이언트가 받을 수 있음
 
PC1#
PC1과 상동으로 스샷 skip
 
PC2#
=> 아래처럼 6.93 GByte 파일 1개의 용량 중 1.86 GByte만 4.34초 동안 서버에게 보냄

 
 
3.4 지정한 시간 동안 최대 트래픽 전송
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V -t 5
=> 5초 동안 클라이언트에서 서버로 보냄
 
PC1#

 
PC2#
PC1과 상동으로 스샷 skip
 
 
3.5 지정한 용량만큼 최대 트래픽 전송
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V -n 1024000000
=> 1024,000,000 byte = 1024,000 Kbyte = 1024 Mbyte = 대략 1 Gbyte 보냄
 
PC1#
PC2과 상동으로 스샷 skip
 
PC2#
=> 1024,000,000 bytes 를 보냄, 기본 단위 byte 임

 
 
3.6 동시 여러개 스트림(Stream)으로 전송
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V -t 5 -P 2
=> 5초 동안 2개의 Stream 을 동시에 서버에 전송
 
PC1#
=> 각각 ID가 5번과 7번의 Stream 이 측정됨

 
PC2#
=> 역시 2개의 Stream 확인됨

 
 
3.7 UDP 트래픽 전송하여 테스트 하기
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V -u
=> 기본 1Mbit/sec 로 udp 트래픽을 전송함, 3.8의 -b 옵션으로 전송 속도를 변경하길 권장함
=> 지터(=Jitter, 지연)과 로스(=Lost, 손실) 표현됨
 
PC1#
=> 처음 1초 동안 11Mbit/s(=1.35Mbyte)를 받고 그 다음부터는 80KBytes 를 받음
=> summary 에 지터와 Total Datagrams 확인됨
=> Transfer 는 받았기 때문에 0으로 나오며 -R 옵션 사용 시 값 표현됨

 
PC2#
=> 전체 2.10MBytes 를 전송하였고, 평균 1.76Mbit/sec 이며 269개 Datagrams 를 로스(손실)없이 전송하였음

 
 
3.8 UDP 트래픽 전송하여 테스트 하기
PC1(서버)# iperf3 -s -V
PC2(클라이언트)# iperf3 -c 192.168.11.133 -V -u -t 5 -b 1G
=> 1GBit/s 전송속도로 5초 동안 UDP를 전송함
 
PC1#
=> 5.21 초 동안 75746개의 UDP datagrams 를 받았고 301개 로스(손실) 결과 확인

 
PC2#
=> 1Gbit/sec 전송속도로 5초간 UDP 트래픽을 전송함

 
 
4. GUI 화면으로 테스트 하기(=jperf)
> 위 CLI 결과값을 자바로 GUI 로 볼 수 있도록 제공함
> java runtime 설치 필요함
> jperf2폴더에서 jperf.bat 실행
=> 단 iperf 버전은 2.0 버전임
 
PC1#
=> 세부 옵션은 commond 창에 확인
=> PC1은 서버 모드임
=> 그래프에 표출되는 단위 변경 가능 : Mbits 등등
=> 오른쪽 상단에 선택으로 start 함

 
 
PC2#
=> 클라이언트를 선택 후 서버의IP를 지정함
=> 역시 오른쪽 상단에 선택으로 트래픽 전송 시작함

 
 
* jperf 다운로드 사이트
 
 
* 참고링크
http://www.openmaniak.com/iperf.php  : 영문, 예제 별 설명 잘 나옴
http://dreamlog.tistory.com/430 : 국문, 간단 명료하게 설명 잘 나옴
저작자 표시
신고
Posted by 쏠라구구


티스토리 툴바