KOSSLAB 컨트리뷰톤 2018 - OpenStack Team 2

KOSSLAB 컨트리뷰톤 2018년도 OpenStack Team 을 진행하면서 2팀 컨트리뷰톤 참여자들이 정리한 문서입니다.

목차

OpenStack Document - api Team

  • 강상규
  • 조정연
  • 이재연

OpenStack의 개념과 구성요소

Openstack이란?

OpenStack은 클라우드 환경에서 컴퓨팅 자원과 스토리지 인프라를 셋업하고 구동하기 위해 사용하는 Opensource Software Project의 집합이다.

IaaS 형태의 클라우드 컴퓨팅 오픈소스 프로젝트로 컴퓨팅, 스토리지, 네트워킹 자원을 관리하는 여러개의 하위 프로젝트들로 이루어져있다.

OpenStack 구성요소
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/openstack%20%E1%84%89%E1%85%A5%E1%86%AF%E1%84%80%E1%85%A8%E1%84%83%E1%85%A9.png
Nova (Compute)

서버 가상화를 지원하는 것으로 여러 가상화 SoftWare를 제어하고 Virtual Machine을 관리한다.

Swift (Object Storage)

Rest API를 이용하여 필요한 OS 이미지를 관리한다. 파일 단위로 데이터를 저장하며, HTTP/HTTPS 프로토콜을 사용하는 서버이므로, 외부에서 URL을 이용하여 접근할 수 있다.

Glance (Image)

Nova에서 VM을 만들 때, 필요한 OS 이미지를 관리한다.

Keystone

서비스를 허용된 사용자만 사용할 수 있도록 인증하는 과정을 통합적으로 관리한다.

논리 아키텍처에서는 Keystone은 다음으로 구성된다.

  1. Token Backend : 사용자별 Token 관리
  2. Catalog Backend : OpenStack의 모든 서비스의 Endpoint URL을 관리
  3. Policy Backend : Tenant, 사용자 계정 및 룰을 관리
  4. Identity Backend : 사용자 인증 관리
Neutron

네트워크 서비스를 지원하며, SDN(Software Define Network)의 첫 번째 사례이다.

Telemetry

OpenStack에서 제공되는 자원의 사용량을 관리하며, 최근에는 모니터링 용도로 확장되고 있다.

API 연습하기

API URL은 openstack horizon > 관리자 > 시스템 > 시스템 정보 에 가면 각 Component별 url이 정의되어있다. 각 component에 맞는 url을 참고하면서 api를 테스트하면 된다.

현재 api는 pike version 3 을 사용하여 테스트하였다.

1. Keystone
Token 발급하기

Request

URL :  {ip:port}/identity/v3/auth/tokens
Method : Post
body :
{ "auth": {
    "identity": {
      "methods": ["password"],
      "password": {
        "user": {
          "name": "{user id}",
          "domain": { "id": "{domain id}" },
          "password": "{password}"
        }
      }
    },

   "scope": {
     "domain": {
       "id": "{domain id}"
     }
   }
  }
}

Response

Header :
X-Subject-Token gAAAAABbyvJjfU7efP0Un_Npeg0Pbkp94z_7QFeOWv4wOwrrFm4YMTmKR3jQdVg5sgTjVzjD0sL9Qmu8Lw6np0UELfTGZZeUMccw1llea52UOSQj0Af151MAXGaLseQv8k3tDepewPRjpw60IkfatuEesxcYnzT6yg

X-Subject-Token 의 값이 Token이므로 이 값을 저장해 놓아야한다.

Body :
{
    "token": {
        "domain": {
            "id": "default",
            "name": "Default"
        },
        "methods": [
            "password"
        ],
        "roles": [
            {
                "id": "18ecfac73b224145bbf4766be03e75a0",
                "name": "admin"
            }
        ],
        "expires_at": "2018-10-20T10:16:19.000000Z",
        "catalog": [
            {
                "endpoints": [
                    {
                        "url": "http://10.0.2.15/placement",
                        "interface": "public",
                        "region": "RegionOne",
                        "region_id": "RegionOne",
                        "id": "e758f953821c43fe9c61aef60209fd05"
                    }
                ],
                "type": "placement",
                "id": "2617104fc12e40618bb5e4e0d7553672",
                "name": "placement"
            }
        ],
        "user": {
            "password_expires_at": null,
            "domain": {
                "id": "default",
                "name": "Default"
            },
            "id": "0120ff52b86143a4a96c9fbed9cf3fa8",
            "name": "admin"
        },
        "audit_ids": [
            "EggrBIhgThGIrxRXRYFvqg"
        ],
        "issued_at": "2018-10-20T09:16:19.000000Z"
    }
}
Name Description
audit_ids 랜덤으로 생성되는 유일한 번호이고, token을 track하기 위해서 사용할 수 있는 Url-Safe한 string이다.
2. Project
Project List 가져오기

Openstack에서 Project는 tenant(사용자 그룹)을 의미한다.

Request

URL : {ip:port}/identity/v3/projects
Method : GET
Header : X-Auth-Token : {token}

Response

{
    "links": {
        "self": "http://10.0.2.15/identity/v3/projects",
        "previous": null,
        "next": null
    },
    "projects": [
        {
            "is_domain": false,
            "description": "",
            "links": {
                "self": "http://10.0.2.15/identity/v3/projects/d5ceca181f6b4398aef52183bf4521f1"
            },
            "enabled": true,
            "id": "d5ceca181f6b4398aef52183bf4521f1",
            "parent_id": "default",
            "domain_id": "default",
            "name": "demo"
        }
    ]
}
  • links
Name Description
self 리소스의 버전을 포함하고 있는 url로 해당 url을 바로 사용해야할 때 사용한다.
bookmark 영원히 사용되는 url로 기간이 긴 storage에서 사용한다.
alternate 리소스를 대체하는 링크를 포함한다.
  • pagination

list가 많을 경우 pagination을 하여 subset만 보여주는 경우가 있다.

Name Description
next 이후의 리스트가 있는 링크이다.
previous 이전의 리스트가 있는 링크이다.
3. Glance
Glance List

이미지 리스트를 불러오는 API이다.

Request

URL : {ip:port}/compute/v2.1/images
Method : GET
Header : X-Auth-Token : {token}

Response

{
    "images": [
        {
            "id": "871b6c50-794e-4381-8da3-636de524b41a",
            "links": [
                {
                    "href": "http://110.10.129.22:8080/compute/v2.1/images/871b6c50-794e-4381-8da3-636de524b41a",
                    "rel": "self"
                },
                {
                    "href": "http://110.10.129.22:8080/compute/images/871b6c50-794e-4381-8da3-636de524b41a",
                    "rel": "bookmark"
                },
                {
                    "href": "http://10.0.2.15/image/images/871b6c50-794e-4381-8da3-636de524b41a",
                    "type": "application/vnd.openstack.image",
                    "rel": "alternate"
                }
            ],
            "name": "cirros-0.3.5-x86_64-disk" # 이미지 이름
        }
    ]
}
Glance Detail List (All Image)

전체 이미지의 상세 정보를 불러오는 API이다.

Request

URL : {ip:port}/compute/v2.1/images/detail
Method : GET
Header : X-Auth-Token : {token}

Response

{
  "image": {
      "status": "ACTIVE",
      "updated": "2018-08-31T13:20:04Z",
      "links": [
          {
              "href": "http://110.10.129.22:8080/compute/v2.1/images/871b6c50-794e-4381-8da3-636de524b41a",
              "rel": "self"
          },
          {
              "href": "http://110.10.129.22:8080/compute/images/871b6c50-794e-4381-8da3-636de524b41a",
              "rel": "bookmark"
          },
          {
              "href": "http://10.0.2.15/image/images/871b6c50-794e-4381-8da3-636de524b41a",
              "type": "application/vnd.openstack.image",
              "rel": "alternate"
          }
      ],
      "id": "871b6c50-794e-4381-8da3-636de524b41a",
      "OS-EXT-IMG-SIZE:size": 13267968,
      "name": "cirros-0.3.5-x86_64-disk",
      "created": "2018-08-31T13:20:04Z",
      "minDisk": 0,
      "progress": 100,
      "minRam": 0,
      "metadata": {}
  }
}
Name Description
S-EXT-IMG-SIZE:size 이미지 사이즈
minDisk 이미지를 부팅하기 위해 필요한 disk 공간
progress 이미지가 저장되는 과정의 Percentage (Active : 100 / Saving : 25 or 50)
minRam 이미지가 기능을 위한 최소한의 Ram 공간
metadata Metadata의 key, value 쌍
  • status
Name Description
ACTIVE 사용할 수 있는 상태
SAVING queue 또는 저장 중인 상태
DELETED 삭제되었거나, 삭제 중인 상태
ERROR 에러인 상태
UNKNOWN 알수 없는 상태
Glance Detail Information (Specific Image)

특정 이미지의 상세 정보를 불러오는 API이다.

Request

URL : {ip:port}/compute/v2.1/images/{image id}
Method : GET
Header : X-Auth-Token : {token}

Response

{
  "image": {
      "status": "ACTIVE",
      "updated": "2018-08-31T13:20:04Z",
      "links": [
          {
              "href": "http://110.10.129.22:8080/compute/v2.1/images/871b6c50-794e-4381-8da3-636de524b41a",
              "rel": "self"
          },
          {
              "href": "http://110.10.129.22:8080/compute/images/871b6c50-794e-4381-8da3-636de524b41a",
              "rel": "bookmark"
          },
          {
              "href": "http://10.0.2.15/image/images/871b6c50-794e-4381-8da3-636de524b41a",
              "type": "application/vnd.openstack.image",
              "rel": "alternate"
          }
      ],
      "id": "871b6c50-794e-4381-8da3-636de524b41a",
      "OS-EXT-IMG-SIZE:size": 13267968,
      "name": "cirros-0.3.5-x86_64-disk",
      "created": "2018-08-31T13:20:04Z",
      "minDisk": 0,
      "progress": 100,
      "minRam": 0,
      "metadata": {}
  }
}
4. Flavor
Flavor List

VM의 스펙을 규격화한 정보의 리스트를 보여준다.

Request

URL : {ip:port}/compute/v2.1/flavors
Method : GET
Header : X-Auth-Token : {token}

Response

{
  "flavors": [
      {
          "id": "1",
          "links": [
              {
                  "href": "http://110.10.129.22:8080/compute/v2.1/flavors/1",
                  "rel": "self"
              },
              {
                  "href": "http://110.10.129.22:8080/compute/flavors/1",
                  "rel": "bookmark"
              }
          ],
          "name": "m1.tiny"
      }, ...
  ]
}
5. Neutron
Neutron list

Request

URL : {ip:port}/v2.0/networks
Method : GET
Header : X-Auth-Token : {token}

Response

{
  "networks": [
      {
          "provider:physical_network": "public",
          "ipv6_address_scope": null,
          "revision_number": 5,
          "port_security_enabled": true,
          "mtu": 1500,
          "id": "1ab2d6c5-3618-47f1-99b3-77fcc1a39294",
          "router:external": true,
          "availability_zone_hints": [],
          "availability_zones": [
              "nova"
          ],
          "ipv4_address_scope": null,
          "shared": false,
          "project_id": "ffc5bce644674cd984f3e0ff67ebe40e",
          "status": "ACTIVE",
          "subnets": [
              "4c8326e8-7a21-4b15-a727-c611b2cf8ff5",
              "d22d8d5e-b9ff-457a-831e-03ee1b34c0ab"
          ],
          "description": "",
          "tags": [],
          "updated_at": "2018-08-31T13:20:40Z",
          "is_default": true,
          "provider:segmentation_id": null,
          "name": "public",
          "admin_state_up": true,
          "tenant_id": "ffc5bce644674cd984f3e0ff67ebe40e",
          "created_at": "2018-08-31T13:20:30Z",
          "provider:network_type": "flat"
      }, ...
  ]
}
Name Description
revision_number 자원의 revision number를 이용해서 list 결과를 필터링
provider:network_type flat / vlan / vxlan / gre
status ACTIVE / DOWN / BUILD / ERROR
Neutron Delete

Request

URL : {ip:port}/v2.0/networks/{Network id}
Method : DELETE
Header : X-Auth-Token : {token}
Neutron Create

Request

URL : {ip:port}/v2.0/networks
Method : GET
Header : X-Auth-Token : {token}
body :
{
    "network": {
        "admin_state_up": true,
        "name": "net1",
        "provider:network_type": "vlan",
        "provider:physical_network": "public",
        "provider:segmentation_id": 2,
        "qos_policy_id": "6a8454ade84346f59e8d40665f878b2e"
    }
}
Name Description
admin_state_up 네트워크의 관리자 상태. (true / false)
provider:network_type flat / vlan / vxlan / gre
provider:physical_network 네트워크가 실행되어야하는 물리적 네트워크

Response

{
  "network": {
      "admin_state_up": true,
      "availability_zone_hints": [],
      "availability_zones": [
          "nova"
      ],
      "created_at": "2016-03-08T20:19:41",
      "dns_domain": "my-domain.org.",
      "id": "4e8e5957-649f-477b-9e5b-f1f75b21c03c",
      "ipv4_address_scope": null,
      "ipv6_address_scope": null,
      "l2_adjacency": true,
      "mtu": 1400,
      "name": "net1",
      "port_security_enabled": true,
      "project_id": "9bacb3c5d39d41a79512987f338cf177",
      "qos_policy_id": "6a8454ade84346f59e8d40665f878b2e",
      "revision_number": 1,
      "router:external": false,
      "shared": false,
      "status": "ACTIVE",
      "subnets": [],
      "tags": ["tag1,tag2"],
      "tenant_id": "9bacb3c5d39d41a79512987f338cf177",
      "updated_at": "2016-03-08T20:19:41",
      "vlan_transparent": false,
      "description": "",
      "is_default": false
  }
}
Name Description
availability_zone_hints 네트워크를 위한 후보 가용존
availability_zones 네트워크를 위한 가용존
l2_adjacency 네트워크를 통해서 L2연결이 가능여부를 나타내준다.
mtu maximum transmission unit (MTU)
port_security_enabled 네트워크에서 포트 Security 상태
qos_policy_id 네트워크에 할당된 QOS 정책 아이디
6. Nova
Nova List

인스턴스의 리스트를 볼 수 있는 api이다.

Request

- URL : {ip:port}/compute/v2.1/servers
- Method : GET
- Header : X-Auth-Token : {token}

Response

{
  "servers": [
      {
          "id": "acdfbbe2-7c64-4643-9211-cf38c604b1ff",
          "links": [
              {
                  "href": "http://110.10.129.22:8080/compute/v2.1/servers/acdfbbe2-7c64-4643-9211-cf38c604b1ff",
                  "rel": "self"
              },
              {
                  "href": "http://110.10.129.22:8080/compute/servers/acdfbbe2-7c64-4643-9211-cf38c604b1ff",
                  "rel": "bookmark"
              }
          ],
          "name": "contributhon_practice"
      }
  ]
}
Nova Detail

인스턴스의 자세한 정보를 볼 수 있는 api이다.

Request

- URL : {ip:port}/compute/v2.1/servers/detail
- Method : GET
- Header : X-Auth-Token : {token}

Response

{
  "servers": [
      {
          "OS-EXT-STS:task_state": null,
          "addresses": {
              "contributhon-network": [
                  {
                      "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:15:f1:b7",
                      "version": 4,
                      "addr": "172.31.0.39",
                      "OS-EXT-IPS:type": "fixed"
                  }
              ]
          },
          "links": [
              {
                  "href": "http://110.10.129.22:8080/compute/v2.1/servers/acdfbbe2-7c64-4643-9211-cf38c604b1ff",
                  "rel": "self"
              },
              {
                  "href": "http://110.10.129.22:8080/compute/servers/acdfbbe2-7c64-4643-9211-cf38c604b1ff",
                  "rel": "bookmark"
              }
          ],
          "image": {
              "id": "871b6c50-794e-4381-8da3-636de524b41a",
              "links": [
                  {
                      "href": "http://110.10.129.22:8080/compute/images/871b6c50-794e-4381-8da3-636de524b41a",
                      "rel": "bookmark"
                  }
              ]
          },
          "OS-EXT-STS:vm_state": "active",
          "OS-EXT-SRV-ATTR:instance_name": "instance-00000004",
          "OS-SRV-USG:launched_at": "2018-10-06T12:49:27.000000",
          "flavor": {
              "id": "c1",
              "links": [
                  {
                      "href": "http://110.10.129.22:8080/compute/flavors/c1",
                      "rel": "bookmark"
                  }
              ]
          },
          "id": "acdfbbe2-7c64-4643-9211-cf38c604b1ff",
          "security_groups": [
              {
                  "name": "default"
              }
          ],
          "user_id": "0120ff52b86143a4a96c9fbed9cf3fa8",
          "OS-DCF:diskConfig": "MANUAL",
          "accessIPv4": "",
          "accessIPv6": "",
          "progress": 0,
          "OS-EXT-STS:power_state": 1,
          "OS-EXT-AZ:availability_zone": "nova",
          "config_drive": "",
          "status": "ACTIVE",
          "updated": "2018-10-19T12:03:19Z",
          "hostId": "65a62bb5476213565d51414880d5181943017fb9954b4249ad81e23f",
          "OS-EXT-SRV-ATTR:host": "ubuntu-xenial",
          "OS-SRV-USG:terminated_at": null,
          "key_name": null,
          "OS-EXT-SRV-ATTR:hypervisor_hostname": "ubuntu-xenial",
          "name": "contributhon_practice",
          "created": "2018-10-06T12:49:23Z",
          "tenant_id": "ffc5bce644674cd984f3e0ff67ebe40e",
          "os-extended-volumes:volumes_attached": [],
          "metadata": {}
      }
  ]
}
Name Description
OS-EXT-STS:power_state 0: NOSTATE / 1: RUNNING / 3: PAUSED / 4: SHUTDOWN / 6: CRASHED / 7: SUSPENDED
Nova Delete

인스 삭제를 하는 API이다.

Request

- URL : {ip:port}/compute/v2.1/servers/{image id}
- Method : DELETE
- Header : X-Auth-Token : {token}
Nova Create

Request

URL : {ip:port}/compute/v2.1/servers
Method : POST
Header : X-Auth-Token : {token}
body :
{
    "server": {
        "name": "auto-allocate-network",
        "imageRef": "70a599e0-31e7-49b7-b260-868f441e862b",
        "flavorRef": "http://openstack.example.com/flavors/1",
        "networks": "auto"
    }
}
Name Description
flavorRef flavor UUID 값
networks Tenant에 정의된 여러 개의 네트워크 object list
imageRef Image UUID 값

Response

{
  "server": {
      "OS-DCF:diskConfig": "AUTO",
      "adminPass": "6NpUwoz2QDRN",
      "id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb",
      "links": [
          {
              "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
              "rel": "self"
          },
          {
              "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
              "rel": "bookmark"
          }
      ],
      "security_groups": [
          {
              "name": "default"
          }
      ]
  }
}
  • OS-DCF:diskConfig
Name Description
AUTO flavor disk의 단일 partition 서버를 빌드한다.
MANUAL API는 server 부분 스키마를 사용하고 source image가 있는 file system을 이용하여 빌드한다.

Openstack App 개발

컨트리뷰톤이라는 주제에 맞춰 API를 연습해보는 것 뿐만 아니라 앱을 만들면 좋겠다는 의견을 취합하여 Openstack App 개발을 진행하게 되었다.

공통
1. Server List
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_List.jpeg
  • 설명

    첫 번째 화면에서는 자신이 등록한 서버의 리스트를 가져오는 화면이 뜬다. 해당 화면을 아래로 내렸다 올리면 페이지가 Reloading된다.

2. Add Server
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_AddServerInfo.png
  • 설명

    자신이 생성한 Server의 정보를 입력하면 해당 정보가 저장되며, 목록에 뜨게 된다.

Nova
1. Create instance
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_ServerInfo.png
  • 설명

    인스턴스를 생성하기 위해, 이미지 타입, flavor, Network를 설정한다. 인스턴스를 생성하기 위해서는 많은 옵션이 있지만, 현재는 인스턴스 생성을 위한 가장 기본적인 정보를 이용한다.

  • api

    • URL : /servers
    • Method : POST
    • body
      • Server 이름
      • Image 이름
      • Flavor 종류
      • Network
2. Instance Info
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_Instance.jpeg
  • 설명

    서버의 인스턴스 리스트가 나온다.

  • api

    • URL : /servers
    • Method : GET
3. Instance Action
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_Instance.png
  • 설명

    인스턴스의 상태를 변화시킬 수 있는 페이지이다. 만약 Staus 변화 시 응답받는 로그를 까만 화면 창에 출력해준다.

  • api

    • URL : /servers/{server_id}/action
    • Method : POST
Flavor
1. Flavor List
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_flavor.png
  • 설명

    미리 정해놓은 인스턴스의 스펙인 Flavor의 리스트이다.

  • api

    • URL : /flavors
    • Method : GET
Keypair
1. Keypair List
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_Keypair_List.png
  • 설명

    기존의 Keypair의 리스트이다.

  • api

    • URL : /os-keypairs
    • Method : GET
2. Keypair Info
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_Keypair.jpeg
  • 설명

    Keypair의 상세 정보가 들어있는 페이지이다. 해당 Keypair의 상태를 확인할 수 있고, fingerprint, public_key 등을 확인 가능하다.

  • api

    • URL : /os-keypairs/{keypair_name}
    • Method : GET
Image
1. Image List
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_ImageList.png
  • 설명

    현재 등록된 이미지 리스트를 가져온다.

  • api

    • URL : /v2/images
    • Method : GET
2. Image Info
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_ImageInfo.png
  • 설명

    이미지의 자세한 정보들을 볼 수 있는 페이지이다.

  • api

    • URL : /v2/images/{image_id}
    • Method : GET
3. Deactive & Reactive
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_ImageActive.png
  • 설명

    이미지를 Deactive 시키거나 Reactive 시킬 수 있는데, Deactive시 Reactive로 버튼이 활성화된다.

  • api

    Deactive

    • URL : /v2/images/{image_id}/actions/deactivate
    • Method : POST

    Reactive

    • URL : /v2/images/{image_id}/actions/reactivate
    • Method : POST
4. Create Image
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_Image.jpeg
  • 설명

    새로운 이미지를 생성할 수 있다.

  • api

    • URL : /v2/images
    • Method : POST
    • body
      • 이미지 이름
      • 이미지 컨테이너 포맷
      • 디스크 포맷
Networking
1. Netwoking List
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_Network.png
  • 설명

    현재 존재하는 Network 리스트이다.

  • api

    • URL : /v2.0/networks
    • Method : GET
Router
1. Router List
https://raw.githubusercontent.com/JaeYeonLee0621/Image/master/Openstack_Contributhon_App/App_Router.png
  • 설명

    현재 존재하는 라우터 리스트이다.

  • api

    • URL : /v2.0/routers
    • Method : GET

+) 완성본 동영상 (이미지를 클릭하면 동영상으로 넘어갑니다.)

Openstack Application

Seonghyo

Openstack 1차 모임(2018/08/31)

  • 진행사항
    • Cafe24 Server
    • Vagrant
    • DevStack Install
Cafe24 Server
  • 서버 사양
    • Linux : CentOS 6.10
    • CPU : Intel(R) Xeon(R) E3-1231 v3 @ 3.40GHz
    • Cores : 8
    • RAM : 8 GB
    • Disk : 235 GB, 1 TB
Vagrant

가상환경을 생성과 관리를 코드로 쉽게 관리 할 수 있게 해주는 Tool

  • VirualBox 설치:

    wget -O /etc/yum.repos.d/virtualbox.repo http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
    yum update
    yum install VirtualBox-5.2
    
  • Vagrant 설치:

    rpm -ivh https://releases.hashicorp.com/vagrant/2.1.4/vagrant_2.1.4_x86_64.rpm
    
  • Vagrant 설정파일 (Vagrantfile):

    Vagrant.configure("2") do |config|
        config.vm.box = "ubuntu/xenial64" --> 이미지는 Box로 명명
        config.vm.provider "virtualbox" do |vb|
        vb.memory = "6144"
        vb.cpus = "6"
       end
      config.vm.network "forwarded_port", guest: 80, host: 8080 --> 포트포워딩
    end
    
  • Vagreant 명령어:

    vagrant status   -> VM 상태 확인
    vagrant ssh 이름 -> 접속 + 이름
    vagrant up       -> VM 설정
    vagrant destroy  -> VM 제거
    vagrant reload   -> 설정 반영
    
Note:
서버 안에 Vagrant 위에 VM이 올라가는 형태이기 때문에 VM에 문제가 생겨도 Destroy 하고 다시 설치하면 되기 때문에 서버에 바로 DevStack 설치시 오류가 발생 했을 때 서버 OS를 재설치하는 번거로움을 줄일 수 있음

Openstack 2차 모임(2018/09/06)

  • 진행사항
    • Git & Github
    • Gerrit & Sandbox
Git & Github
  • Setting
  1. ssh-keygen -t rsa -> ~/.ssh/id_rsa* id_rsa 비밀키 id_ras.pub 공개키
  2. 공개키를 github repo나 계정 ssh에 등록을 한다.
git log    ->  현재까지 commit  상태를 보여준다.
git log -p ->  업데이트된 부분을 보여준다.
git status ->  add된 commit을 보여준다
git diff 버전..버전 -> 버전간 변화된 부분을 보여준다.
git config user.name "SeongHyo"
git config user.email "abc9023@naver.com"
git config --list
  • git Remote
  1. 원격저장소는 로컬이 아닌 외부 다른 위치에 존재하는 git 저장소이다.
  2. clone을 해서 작업할 수 있는 공간을 origin, OpenSource에서 실제 기여하는 저장소는 upstream이다.
git remote -v             -> remote들을 보여준다
git remote add upstream(저장소) github주소
git pull upstream         -> 최신 업데이트
git pull master
git push origin master    ->  저장소에 업로드
git checkout -b 20180906  -> branch를 로컬에 (master를 복사)
  • fork한 repo를 이용해 pull & request 하는 방법
  1. fork 한 것은 10개의 commit만 있고 원래 것은 19개의 commit 있다
  2. 최신 commit까지 가지고 오고 싶은 경우 remote add upstream [버전 원래저장소의 ssh주소]
  3. git push origin master 하면 19개로 업데이트 된다.

권장사항:

git checkout -b 201809 -> 새로운 브랜치를 로컬에 만듬
git branch -a          -> 모든 브랜치를   있음
git push origin 201809:이름

master는 그대로 있는 상태에서 새로운 branch와 함께 업로드 된다. ( github 안에 branch에서 pull request 요청(merge))

  • fork한 repo를 이용해 pull & request 하는 방법
  1. fork 한 것은 10개의 commit만 있고 원래 것은 19개의 commit 있다
  2. 최신 commit까지 가지고 오고 싶은 경우 remote add upstream [버전 원래저장소의 ssh주소]
  3. git pull upstream master
  4. git push origin master 하면 19개로 업데이트 된다.
  • review가 있을때 수정하는 방법 2가지
  1. 파일 수정 후 git push origin 20180906:0906(아까올린 브랜치) commit이 하나 추가되는 방법
  2. git commit -a amend 마지막 commit을 수정, 이때 같은 아이디값을 가지므로 ''--force`` 로 push
Gerrit & sandbox
  • sandbox
  1. openstack 컨트리뷰트를 연습할 수 있는 저장소, clone git://git.openstack.org/openstack-dev/sandbox
  2. https://review.openstack.org/#/admin/projects/openstack-dev/sandbox 도 확인할 수 있다
  • Gerrit
  1. review.openstack.org는 gerrit code review를 사용한다.
  2. gerrit은 하나의 commit 단위로 리뷰, gerrit은 fatch 단위로 revision
  • Contribution 하는 방법(Test)
  1. launchpad.net/openstack-dev-sandbox에서 버그리포트 작성
  2. https://bugs.launchpad.net/openstack-dev-sandbox/+bug/1792344, URL 마지막에 번호로 식별
  3. git review -s 를 통해 gerrit 싱크를 맞춘다
  4. Enter your gerrit username: openstack에서 profile에 등록한 이름
  5. Could not connect to gerrit. 발생할 경우 ssh키 등록이 잘되어있는지 확인한다.
  6. 작업 후 commit 하면 git log 에 change-id가 생긴다
  7. git review
[root@q352-3202 /home/pusher/sdbox/sandbox]# git review
remote: Resolving deltas: 100% (1/1)
remote: Processing changes: new: 1, refs: 1, done
remote:
remote: New Changes:
remote:   https://review.openstack.org/602356 Add first commit
remote:
To ssh://seonghyo@review.openstack.org:29418/openstack-dev/sandbox.git
 * [new branch]      HEAD -> refs/publish/master/bug/1792344

 https://review.openstack.org/602356 Fetch 한것이 올라게된다.
  • reply 하는 법
  1. https://review.openstack.org/의 버그리포트에서 reply를 누르면 창이 하나가 나온다. 여기서 code-review과 workflow의 점수는
-2  fetch는 안된다
-1 변경을 해야될  같다
+2 Core review로서 merge  만큼 괜찮다

-1 지금할 만한 일은 아니다 or  fetch는 완성 상태가 아니므로 review를 받고 싶다.
+1 merge
  1. 관례적으로 2명의 +2가 있을때 fetch를 merge 시킨다.
  • 수정하는 법
  1. git checkout -b 이름 branch를 만든다
  2. git pull origin master 최신 업데이트 된 것을 가져온다.
  3. 수정 후에 it commit -a --amend (gerrit은 하나의 commit을 가질때 amend 해야한다.)
  4. git review https://review.openstack.org/602359처럼 새로운 URL이 생기고 여기서 변화된 내용을 확인 가능하다
  • 다른 곳에서 작업하는 경우
  1. git clone 주소
  2. git review -s``싱크 설정
  3. git review -d [URL 뒤에 있는 번호] 이 fetch를 가져와서 로컬에 branch를 자동으로 생성

Openstack 3차 모임(2018/09/14)

  • 진행사항
    • virtualenv
    • tox
virtualenv
  • 정의

    독립적인 파이썬 가상환경을 만들어 주는 Tool

    NOTE

    가상 환경에서 pip로 패키지를 설치하면 가상환경폴더의 Lib/site-packages에 패키지를 저장 버전이 다른 호환성을 가진 스크립트들을 기본환경에서는 충돌이 발생한다.

  • 설치 & 사용법

    1. yum install python-pip

    2. pip install virtualenv

    3. virtualenv [dir이름]

      [root@q352-3202 ~]# virtualenv test
      New python executable in /root/test/bin/python2.7
      Also creating executable in /root/test/bin/python
      Installing setuptools, pip, wheel...done.
      
    4. source [dir이름]/bin/activate 하면 가상환경이 생성된다.

      [root@q352-3202 ~]# source test/bin/activate
      (test) [root@q352-3202 ~]#
      
    5. 빠져나올때는 deactivate 하면된다

tox
  • 정의
    python의 테스트 자동화, 표준화를 위한 Tool
  • 설치 & 사용법
  1. pip install tox

  2. setup.py & tox.ini 생성(1)

    import setuptools
     setuptools.setup(
      name="tox-test",
      version="0.0.1",
      author="",
      author_email="",
      description="A package for test using tox",
      packages=setuptools.find_packages(),
      )
    
  3. setup.py & tox.ini 생성(2)

    [tox]
    envlist = py27, py34, py35, py36, py37
    [testenv:py27]
    basepython = python2.7
    [testenv:py34]
    basepython = python3.4
    [testenv:py35]
    basepython = python3.5
    [testenv:py36]
    basepython = python3.6
    [testenv:py37]
    basepython = python3.7
    [testenv]
    deps = nose
    commands = nosetests
    
  1. 오류 날 경우 pyenv virtualenv -p python[버전] [버전] py[버전]

  2. tox 실행

    py37: commands succeeded
    congratualations :)
    

Openstack 4차 모임(2018/09/20)

  • 진행사항(API팀)
    • Openstack API
    • Token
    • Instance create
Openstack API
  • Openstack API들은 WEB REST API 형식을 사용하고 있음
  • REST API 보안은 Token 방식을 사용
  • API안에는 다음 Endpoint에 대한 정보도 가지고 있음
Token 발급(client)
  1. http://1.234.63.160:8080/identity/v3/auth/tokens POST

    { "auth": {
        "identity": {
          "methods": ["password"],
          "password": {
            "user": {
              "name": "아이디",
              "domain": { "id": "default" },
              "password": "비밀번호"
            }
          }
        }
      }
    }
    
  2. Resp으로 Header에 X-Subject-Auth로 문자열이 Token

  3. 발급받은 Token은 Header에 X-Auth-Token에 추가하여 사용한다.

Token 발급(server)
  1. openstack rc file을 다운받는다.

  2. admin-rc.sh 파일을 만든다.

  3. admin-rc.sh 로 실행시키고 비밀번호를 입력한다

    vagrant@ubuntu-xenial:~$ . admin-rc.sh
    e: command not found
    Please enter your OpenStack Password for project admin as user admin:
    
  4. openstack token issue 로 토큰을 발급한다.

    Field Value
    
    id gAAAAABbo51_rR_CEPwj1r8UpbDABSq2BSsAIelhztj8_XpbLZSozdOFAgjv5Hjhl_
    4W_Vtzp6JoMXC825KK-kReLl7kihLI3O4umt4BHFpNtSSETo-eqivrFFBKL0KOoeT7I
    project_id 4ea188b1bada47909da8e516f2d16129
    
  5. Field에 id 부분을 Token으로 사용할 수 있다.

Instance create(API's)
  1. https://{identity}/v2.0/tokens POST 방식 호출 {ID, PW}
  • Keystone 서비스(반드시 거쳐야 하는 과정)
  • 응답으로 토큰을 발급
  • 이후 API 요청시 request header에 포함
  • 엔드포인트는 API를 제공하는 서버의 접점을 URI로 표현한것(기능별로 분리, 서버마다 다름)
  1. https://{compute}/v2.1/{tenant_id}/images/{images_id} GET 방식 등 유효성 검증
  2. https://{compute}/v2.1/{tenant_id}/servers POST 방식
  • request body에는 생성할 가상서버의 정보[이름, flavor, 이미지 등]

  • 응답으로 가상서버의 UUID (만들어지지 않은 상태)

  • 생성하라는 요청만 받은 단계 (내부적으로 상황판단 후 가상서버 생성)

    {
        "server" : {
            "accessIPv4": "172.31.0.18",
            "accessIPv6": "80fe::",
            "name" : "new-server-test",
            "imageRef" : "6663c1f7-b5c2-4e79-84b2-0e3f1c80bb3c",
            "flavorRef" : "1",
            "availability_zone": "nova",
            "networks" : [{
                "uuid" : "af0294e9-d2e2-4843-b2ef-1d5b51829436"
            }],
            "OS-DCF:diskConfig": "AUTO",
            "metadata" : {
                "My Server Name" : "Apache1"
            },
            "personality": [
                {
                    "path": "/etc/banner.txt",
                    "contents": ""
                }
            ],
            "security_groups": [
                {
                    "name": "default"
                }
            ],
            "user_data" : "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg=="
        },
        "OS-SCH-HNT:scheduler_hints": {
            "same_host": "48e6a9f6-30af-47e0-bc04-acaed113bb4e"
        }
    }
    
  1. https://{compute}/v2.1/{tenant_id}/servers/{server_id} GET 가상서버의 상태정보 확인
  • 생성하는 시간이 걸리는 이유가 API요청이 접수된 것과 실제 가상서버 생성하는 처리가 비동기적으로 분리되어 실행되기 때문

JaeYeonLee0621

2018-08-31 : OpenStack 설치하기

오늘은 선릉역 근처에 있는 공개 SW 개발자 센터에서 스터디를 진행하였습니다! :)

오늘 공부한 것들을 최대한 제가 이해한 방향으로 작성해보았습니다.

1. Cafe24 Server

지난 번에 신청한 Cafe24에서 서버를 받았다!!! (감사합니다..)

IP는 Cafe24로 로그인을 진행한 이후 나의 서비스 관리 > 서버 IP 에서 확인할 수 있고,

서버 임시 접속 정보 > 정보 보기 를 누르면 서버에 접속하는 계정과 비밀번호를 알 수 있다.

세팅일로부터 2주 후에는 확인이 안되니, 그 전에 정보를 잘 저장해 놓거나, 변경하면 된다!

그럼 IP와 세팅된 임시 패스워드로 접속한다.

$ ssh root@ip

패스워드를 쳐서 접속을 한 이후 기존의 임시 패스워드를 변경하기 위해 아래의 명령어를 입력해준다.

$ passwd root

새로운 비밀번호로 서버에 접속하면 첫 번째 단계를 성공한 것이다.

아 그리고 혹시 저처럼 서버로 이것저것 해보다가 터트릴 수 있습니다. 조심하세요..

2. VirtualBox & Vagrant

CentOS 서버에서 vm을 설치하여 그 곳에서 devstack을 설치하려고 한다.

2.1 VirtualBox & Vagrant 정의

설치하기 전에 우리가 설치하게될 것들이 무엇인지 간단하게 정의를 찾아보았다.

  • VirtualBox

일반적으로 물리적인 시스템 OS 위에 논리적인 가상 OS 를 올려서 독립적인 동작이 가능하도록 하는 시스템 차원의 가상 머신

  • Vagrant

가상 머신을 이용한 개발환경 설정을 자동화해주는 도구.

쉽게 만들고 쉽게 버릴 수 있으며 다시 그 상태를 쉽게 복원하는 "Code as a Infrastructure" 오픈소스 프로젝트.

VirtualBox 를 이용하면, 손쉽게 VM환경을 구축할 수 있지만 번거로운 작업이기 때문에 이를 자동화 해주기 위해 개발된 것이 Vagrant 이다.

2.2 VirtualBox & Vagrant 설치

이제 아래의 명령어들을 차례대로 입력하면서 설치를 진행하면 된다.

$ wget -O /etc/yum.repos.d/virtualbox.repo http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo

$ yum update -y

$ yum install VirtualBox-5.2

$ rpm -ivh https://releases.hashicorp.com/vagrant/2.1.4/vagrant_2.1.4_x86_64.rpm

만약 다운로드가 느리다면 $ wget https://releases.hashicorp.com/vagrant/2.1.4/vagrant_2.1.4_x86_64.rpm 을 한 후 $ rpm vagrant_2.1.4_x86_64.rpm 를 입력하면 다운로드가 진행된다.

$ mkdir contributhon

$ cd contributon/

$ vim Vagrantfile

Vagrantfile에는 아래와 같은 정보를 입력한다:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "6144"
    vb.cpus = "6"
  end
  config.vm.network "forwarded_port", guest: 80, host: 8080
end
+) config.vm.network "forwarded_port", guest: 80, host: 8080 의 의미를 찾아보았다.
  • guest의 80이란 vm의 80 포트를 의미하여 host의 8080은 말그대로 호스트의 8080 포트를 의미한다.
  • 즉 vm의 80 포트를 host의 8080 포트에 연결한다는 뜻이다.
  • openstack을 설치한 이후 ip:8080을 하면 openstack dashboard에 접속할 수 있다.

$ vagrant up : 설정한 정보대로 vm이 생성된다.

$ vagrant ssh : vm에 접속한다.

여기까지해서 접속했다면 vm 설치는 성공이다!!!

3. devstack Install

이제 devstack을 설치할 차례이다.

3.1 devstack 정의

마찬가지로 devstack이 무엇인지 간단하게 찾아보았다.

  • devstack 이란?
  • OpenStack 개발 환경을 구성하기 위한 스크립트
  • OpenStack의 구성 확인 및 테스트 용도로 사용
3.2 devstack 설치

이제 아래의 명령어들을 차례대로 입력하면서 설치를 진행하면 된다.

devstack install 방법 에서 차례대로 진행하면 되는데, 공부한 기록을 남기기 위하여 따로 아래에 작성했다.

$ sudo useradd -s /bin/bash -d /opt/stack -m stack : 개별의 stack user를 생성한다.

$ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack : devstack은 system상으로 많은 변화를 만들것이니, sudo 권한을 준다.

$ sudo su - stack : 생성한 stack 으로 사용자를 변경한다.

$ git clone https://git.openstack.org/openstack-dev/devstack : github에 있는 devstack을 clone한다.

$ cd devstack

$ sudo ifconfig

위의 명령어를 입력하면 엄청나게 긴 글이 나온다:

br-ex     Link encap:Ethernet  HWaddr 8a:a2:fd:f3:1d:4b
          inet addr:172.24.4.1  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::88a2:fdff:fef3:1d4b/64 Scope:Link
          inet6 addr: 2001:db8::2/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:1572 (1.5 KB)  TX bytes:1256 (1.2 KB)

enp0s3    Link encap:Ethernet  HWaddr 02:93:23:4d:82:b3
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::93:23ff:fe4d:82b3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1106840 errors:0 dropped:0 overruns:0 frame:0
          TX packets:341418 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1103625143 (1.1 GB)  TX bytes:24041347 (24.0 MB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:682153 errors:0 dropped:0 overruns:0 frame:0
          TX packets:682153 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:213601831 (213.6 MB)  TX bytes:213601831 (213.6 MB)

virbr0    Link encap:Ethernet  HWaddr 52:54:00:f0:23:1b
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

여기서 enp0s3 를 보면 inet addr:10.0.2.15 로 ubuntu가 10.0.2.15 ip로 설정된 것을 볼 수 있다.

이 ip는 아래 local.conf의 HOST_IP에 작성해주면 된다.

$ vim local.conf : local.conf 파일을 생성한다.

여기서 localrc, local.conf의 차이를 말씀해 주셨는데, localrc는 옛날 버전이며 local.conf는 최신 버전이라고 한다. local.conf만 생성했다고 해서 localrc가 생성되지 않는 것이 아니라 local.conf안에 localrc가 포함되어있다.

local.config 내용

[[local|localrc]]
HOST_IP=10.0.2.15
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

local.conf 를 위와 같이 입력하고, 저장을 해준다.

그럼 이제 $ ./stack.sh 를 입력하여 devstack을 설치해준다!!!

devstack 설치는 20~30분 정도가 소요된다.

3.2.1 잠깐 쉬어가는 타임

잠깐 설치를 진행하는 동안 문서를 작성하는 방법에 대해서, 오늘 스터디를 한 내용을 github에 올리는 방법에 대해서 설명해 주셨다.

  1. Rst (Restructured Text)

보통 문서를 작성할 때는 markdown을 많이 활용한다.

하지만 openstack에서는 rst(Restructured Text) 를 사용하는데, 이 문법으로 작성하면 sphinx 라이브러리를 활용하여 html 또는 pdf로 build해 문서를 관리할 수도 있다.

rst 문법을 공부할 때 오픈스택 문서 , 짧은 문법 소개 를 참고하여 공부하면 좋다.

  1. github

문법을 공부하고 문서를 작성했다면, 해당 문서를 우리 팀의 github에 올려야한다.

일단 github에 들어가면 openstack team1 오른쪽 위에 fork 라는 버튼이 보일 것이다.

이 fork는 OS에서 프로세스를 복제한다는 의미로 (처음 알았다..) 해당 github를 똑같이 복제하여 내 repository로 가져오는 것이다.

이렇게 복제한 곳에서는 commit을 하더라도, 본래의 github는 변경되지 않는다.

이렇게 복제된 자신만의 공간에서 문서를 작성하고 수정하고 수정이 끝난 문서들은 pull request 를 해야한다.

즉 본래의 github에 merge하기 위해 요청을 해야한다.

이 버튼은 fork한 자신의 repository에가면 branch가 있는 버튼 옆에 존재한다.

이 버튼을 눌러 요청을 하고 수락이 되면! 원본 github에 내 글이 올라가게 된다.

(저도 해본적이 없어서.. 한번 실습을 해보면 더 이해가 빠를 것 같습니다!)

그리고 멘토님이 당부하셨던건 commit message를 잘 작성하는 방법에 대해서 공부하고,

commit message를 잘 작성하기 위해서 연습하라고 하셨다.

좋은 깃(Git) 커밋 메시지 작성하기 를 참고하여 commit message를 작성하는 방법을 공부하자!

3.3 openstack dashboard 접속

약 2000초 이후에.. openstack 설치가 완료되었다.

설치가 끝난 이후에는 openstack dashboard로 접속해야한다.

$ exit 를 해 vagrant를 빠져 나온후

$ sudo ifconfig 를 실행한다.:

eth0      Link encap:Ethernet  HWaddr 00:25:90:B5:49:24
          inet addr:110.10.129.22  Bcast:110.10.129.127  Mask:255.255.255.128
          inet6 addr: fe80::225:90ff:feb5:4924/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1247717 errors:0 dropped:0 overruns:0 frame:0
          TX packets:491484 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1742171123 (1.6 GiB)  TX bytes:43531987 (41.5 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:99913 errors:0 dropped:0 overruns:0 frame:0
          TX packets:99913 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:8029129 (7.6 MiB)  TX bytes:8029129 (7.6 MiB)

eth0 에서 inet addr 를 보면 ip가 있는데 그 ip인 (여기서는 110.10.129.22 )로 openstack dashboard으로 접속할 수 있다.

http://자신의 ip:8080 으로 접속이 되면 성공이다!!!!

그럼 끝!!! 수고하셨습니다!!

Tip

devstack을 조금 더 편리하게 사용하기 위해서, 몇가지 팁과 공부할 자료를 주셨다.

1. Screen
1.1. Screen 정의
  • linux에서 물리적인 터미널을 여러 개의 가상 터미널로 다중화해주는 도구이다. 각 screen으로 생성한 가상 터미널은 독립적으로 동작하며 사용자 세션이 분리되어도 동작 한다.
  • 이 도구는 백그라운드로 동작하는 다중 터미널을 만들어 백그라운드 작업을 간단히 수행할 수 있고, 중**간에 끊더라도 다시 접속하면 같은 화면을 볼 수 있도록 한다.**
  • 이를 이용해서 시간이 오래 걸리는 도구를 설치할 때에도 screen을 만들어 설치하고 screen을 나와도 설치는 중단되지 않고 실행되게 할 수 있다. 또한 카폐에서 작업을 하다가 집에 가더라도 screen으로 다시 접속하면 내가 작업하던 부분부터 확인할 수 있다. (!!!!!!)
1.2. Screen 설치

$ yum install screen : screen 도구를 설치한다.

$ screen -S [screen 이름] : screen을 원하는 이름으로 생성한다.

  • screen에서 빠져나가고 싶을 때 : ctrl+a,d
  • screen에 다시 접속하고 싶을 때 : $ screen -r [screen 이름]

$ screen -list : screen list를 확인한다.

$ screen -X -S [없애고 싶은 세션 숫자] quit : screen session 삭제

2018-09-06 : VM 설정하기

Git 사용하기
github에서 ssh 사용하기
  1. key 생성하기

ssh-keygen -t rsa -b 4096 : 보통 1024, 2048, 4096 존재하나 4096이상을 권장한다.

$ ls -al ~/.ssh/id_rsa* : id_rsa와 id_rsa.pub가 결과값으로 나온다.

> id_rsa : secret key / id_rsa.pub : public key

  1. profile 클릭 > Setting > SSH and GPG keys > New GPG key > id_rsa.pub 내용 붙여넣기
  2. Clone시 ssh사용하기

Clone or download > clone with SSH 주소 복사

  1. git clone 하기

$ git clone ssh주소

바로 원래의 github에 clone하지 말고, fork하는 것을 잊지마세요!

clone을 하면 기본으로 master branch를 clone하고, remote 이름이 origin이 된다.

remote이름을 다른 걸로 설정하더라도 상관없지만,

관례적으로 opensource에서 실제 기여하는 부분upstream,

자신이 수정하는 부분origin 이라고 이름을 붙인다.

github pull request
  1. 최신 버전 가져오기

$ git pull upstream master : 현재 기여되고 있는 github의 master branch 내용을 가져온다.

$ git push origin master : 자신의 github에 local의 내용을 push한다.

  1. branch 생성하기

$ git checkout -b branch_name : branch_name으로 branch를 생성하고, 새로운 branch에는 기존의 내용을 copy한 내용이 담겨있다.

  1. 변경된 파일 push하기

$ git push origin local-branch_name:github에-올릴-branch_name

local에서 만든 branch의 내용을 github에는 새로운 branch_name으로 올리겠다는 의미이다.

예) $ git push origin 20180906:0906

즉 20180906이라는 branch는 local에 있지만 github에 올릴 때에는 0906이라는 branch 이름으로 올리겠다는 의미이다.

  1. pull request하기

+) branch마다 별도의 pull request를 진행할 수 있다.

  1. 수정 요청이 들어왔을 때 해당 요청을 반영하여 수정한 후 마지막 커밋을 수정하기.

만약 새로운 커밋을 올리면 올리는 사람 입장에서는 수정 사항이 반영되었다는 느낌보다는 새로운 반영이라는 느낌이 들 수 있다.

$ git commit -a --amend: 마지막으로 올린 커밋을 수정한다.

만약 이렇게 커밋을 수정해서 올리면 커밋의 아이디가 같기 때문에 충돌이 날 수 있다.

따라서 강제로 push를 하는 경우가 있다.

$ git push origin branch_name:branch_name --force

+) git branch 삭제하기

git push origin :0906 : 0906이라는 브랜치에 빈 값을 넣겠다 즉 0906이라는 branch를 없애 겠다는 의미이다.

그리고 해당 branch로 pull request한 issue는 closed가 된다.

openstack sandbox에서 contribution 해보기
  1. openstack-dev sandbox clone 하기

처음 commit하는 commiter를 위한 openstack-dev/sandbox 가 존재한다.

$ git clone git://git.openstack.org/openstack-dev/sandbox 로 해당 github의 내용을 가져온다.

  1. sync 작업하기

> 이 전에 gerrit을 설치해줘야한다.

$ git review -s

gerrit에 있는 user와 sync를 맞춰줘야한다. 그래야 commit을 하면 자신의 히스토리에 남게 된다.

+) commit 한 개당 하나의 리뷰로 간주하는데, git 에서는 --force를 썼다면,

gerrit은 fetch단위로 fetch set을 해주면 하나의 리뷰로 묶이게 된다.

  1. review 올리기

모든 작업이 같으나, git commit message를 작성할 때,

맨 하단에 Closes-Bug: #버그번호 를 작성하고 commit을 생성하면

$ git log : git 내역에서 아까 맞췄던 sync 때문에, Change-Id의 값이 자동으로 설정된다.

$ git review : review 올리기.

  1. local에서 review 수정하여 올리기

해당 파일을 수정해서 commit을 수정해야하는데 gerrit은 무조건 하나의 commit을 수정할 때는 amend를 사용해야한다.

$ git commit -a --amend

$ git review : 기존의 commit과 다르게 --force를 하지 않아도 올라간다.

+) 만약 내가 새로 clone을 해서 마지막으로 commit한 파일이 없다면?

$ git review -d 버그번호 : fetch로 가져와서 내 local에 branch를 생성한다.

+) openstack 관련 url

https://github.com/openstack/ : openstack을 mirroring한 곳

http://git.openstack.org/cgit : openstack 원본

https://review.openstack.org/ : contribution한 내용이 올라가는 곳

https://bugs.launchpad.net/openstack-dev-sandbox : openstack의 bug들을 볼 수 있는 곳

http://translate.openstack.org/ : 번역 페이지 (번역 페이지에서 번역한 내역은 review.openstack.org에서 볼 수 있다.)

openstack-dev vm 외부접속

horizon (=Dashboard)

1. 관리자

  • 네트워크

네트워크에 들어가면 기본적으로 2개의 네트워크가 생성되어있다.

  • fixed ip : vm에게 할당이 되는 ip (외부 접근 불가)
  • floating ip : vm에게 공인 ip처럼 할당

즉 vm은 fixed ip 를 가지고 이 ip와 mapping되는 floating ip 를 갖는다.

+) Network

  • Provider Network : floating ip를 서비스 해주는 Network
  • Self Service Network : fixed ip를 서비스 해주는 Network

기존에 생성되어있는 네트워크를 보면,

public은 기본적으로 172.24.4.0/24 즉 C class 대역으로 생성되어있고, 외부 접속이 가능하다.

실제로 ip addr 을 해서 br-ex (linux bridge external) 부분의 ip가 gateway( 172.24.4.1/24 )로 잡혀있고 이 ip로 ping을 날리면 ping도 동작한다.

즉 host안에서 가상으로 privider network를 만들어 놓은 상태이다. 물론 외부에서 접속할 수 없다.

2. 프로젝트

이 부분이 admin이라는 계정에서 사용할 수 있는 프로젝트이다.

Vm에 network 설정하기
할일 요약
  1. vm이 붙을 수 있는 가상 네트워크를 만듬
  2. vm과 가상네트워크 연결
  3. router에 public ip 연결 : 외부에서 접속하기 위하여 public ip를 붙여야하는데 그 ip를 붙이기위해 router를 사용
1. network 생성
  • 네트워크 토폴로지 확인 & 네트워크 생성 버튼 클릭
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/1.png
  • 네트워크 이름 생성
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/2.png
  • 서브넷 생성
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/3.png
  • 서브넷 세부정보
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/4.png
  • 생성 완료
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/5.png
  • 네트워크 편집
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/6.png
  • DHCP 설정 & 서브넷 변경
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/7.png
2. 인스턴스 생성
  • 인스턴스 시작
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/8.png
  • cirros 이미지 올리기
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/9.png
  • Flavor (알아서 설정하면 됨 - AWS 처럼!)
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/10.png
  • 위에서 생성한 network로 올리기
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/11.png
  • 키페어 생성
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/12.png
  • 키 복사
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/13.png
3. 라우터 생성
  • 라우터 이름 & 네트워크 ( public )
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/14.png
  • 라우터 인스턴스 추가
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/15.png
  • 생성한 라우터 추가
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/16.png
4. 인스턴스 하드 리부팅
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/17.png

+) 인스턴스에 할당된 ip 확인

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/18.png
5. 인스턴스 연결해보기

$ vagrant ssh : ubuntu 실행

$ sudo su - stack : stack 권한

$ ping instance-ip : 위에서 확인된 ip 로 ping을 날리면 연결이 되지 않음

$ ip netns : qdhcp 2개 qrouter 2개 > 생성한것 & 기존에 있던 것

$ sudo su : root 계정으로 (permission denied를 막기 위해)

$ ip netns exec qrouter-alsdfjasilfd /bin/bash : 위에서 확인한 qrouter 중 내가 생성한 router로 들어가면 namespace 안으로 들어가게됨 & namespace 안에서 bin/bash 실행

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/19.png
6. namespace 안에서의 addr과 namespace 밖에서의 addr

$ ip addr 을 실행하면 namespace 안과 밖의 addr이 확연히 다르다는 것을 알 수 있다.

+) namespace 안에서 router의 gateway인 172.31.0.1/24 가 설정된 것을 볼 수 있다.

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/20.png
7. instance ip로 ping을 날리면 날아가지 않는다.

왜냐하면 보안 그룹 에서 outbound는 열려있는데 inbound가 열려있지 않기 때문이다.

보안 그룹 > 규칙 관리

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/22.png
  • 모든 ICMP : ping이 된다.
  • 모든 TCP : ssh 연결이 가능하다.
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/23.png
8. floating ip 할당하기
  • 유동 ip 할당
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/24.png
  • 유동 ip가 없기 때문에 + 를 눌러 ip 할당받아야함
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/25.png
  • pool: public > ip 할당
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/26.png
  • 유동 ip 할당
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/27.png
  • 할당 완료!
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/28.png
9. 접속하기

접속할 때는 생성한 key를 이용해서 vim key.pem 을 생성하고

$ chmod 600 key.pem : 600 권한을 준다.

$ ssh -i key.pem cirros@유동-ip 를 하면 접속이 가능하다.

$ ssh -i key.pem cirros@instance에-할당된-ip 를 해도 접속이 가능하다.

+) 이후에 cirros가 아닌 ubuntu, centos 등 다양한 이미지를 올리고 싶을 때는 하드의 용량이 부족할 수 있다.

그때는 vm을 삭제하고, 용량을 변경할 수 있다. (Vagrant Size 변경하기)

알아야할 지식
  • 리눅스 브릿지

: 호스트의 가상 네트워크 인터페이스를 다리 삼아 외부와 연결한다.

https://github.com/Tirrilee/TechTalk/blob/master/img/%EB%A6%AC%EB%88%85%EC%8A%A4%20%EA%B0%80%EC%83%81%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EB%9D%BC%EC%9A%B0%EB%93%9C%20%EC%97%B0%EA%B2%B0.jpg

게스트와 통신하는 브리지 네트워크 인터페이스는 virbr0이고

vnet1, vnet2는 게스트가 사용하는 가상네트워크 인터페이스로 게스트 내부의 네트워크 인터페이스 eth0에 대응한다.

+) eth란 물리적인 장비에 네트워크 인터페이스 카드에 대해서 드라이버가 잡힌 곳이다. 리눅스가 이걸 사용하는 방법이 여러가지인데, 그 중에 하나가 eth0:1 eth0:2 처럼 하나의 eth0에 대해서 여러 가상 인스턴스를 받을 수 있다.

  • Iptables

: 리눅스에 있는 방화벽, 포트포워딩 등을 설정 가능한 곳이다.

  • Routing

: 어떤 ip대역에서 어떤 packet 이 왔을 때 어떤 장비로 갈지 결정하는 것이다.

  • Namespace

: vm에서는 각 머신별로 독립적인 공간을 제공하고 서로가 충돌하지 않도록 하는 기능을 가지고 있는데,

리눅스에서는 이와 동일한 역할을 하는 namespace 기능을 kernel에 내장하고 있다.

네임스페이스내에서는 peer라는 게 있어서 네임스페이스끼리 연결 가능하다.

+) 추가

  • IP 범위
    • 사설IP 범위
      • A class 1개 : 10.0.0.0 - 10.255.255.255 (8 bit prefix)
      • B class 16개 : 172.16.0.0 - 172.31.255.255 (12 bit prefix)
      • C class 256개 : 192.168.0.0 - 192.168.255.255 (16 bit prefix)
    • 공인IP 범위
      • Class A : 1 ~ 126 (각각 16M개의 호스트)
      • Class B : 128 ~ 191 (각각 65,536개의 호스트)
      • Class C : 192 ~ 223 (각각 356개의 호스트)
      • Class D : 224 ~ 239 (멀티캐스트 모드)
      • Class E : 240 ~ 255 (나중의 위해 예약되었음)
      • 127.0.0.1 은로컬 커퓨터가 자기자신을 표현하는 루프백 주소이다.
  • DHCP
    • 네트워크 안에 컴퓨터에 자동으로 네임 서버 주소, IP주소, 게이트웨이 주소를 할당해주는 것을 의미하고, 해당 클라이언트에게 일정 기간 임대를 하는 동적 주소 할당 프로토콜이다.
    • DHCP서버 는 ip 주소를 가지고 있는 서버에서 실행되는 프로그램으로 일정한 범위의 ip주소를 다른 클라이언트에게 할당하여 자동으로 설정하게한다.
    • DHCP 클라이언트 는 시스템이 시작되면 DHCP 서버에 자신의 시스템 ip 주소를 요청하여 주소를 부여받으면 TCP/IP가 초기화되고, 다른 host와 TCP/IP를 이용해 통신할 수 있다.
  • 네임 서버
    • 도메인에 할당하는 ip를 알려주는 서비스
    • name server가 죽으면 ip로는 접근이 가능하지만 domain으로는 접근 불가능
  • ICMP
    • ICMP는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜 이다.
    • IP에는 오로지 패킷을 목적지에 도달 시키기 위한 내용들로만 구성되어 있다. 만일 정상적으로 패킷이 목적지에 도달하지 않았을 때, 이에 관련된 에러 처리를 진행해야하는데 IP에는 그러한 에러 처리법이 있지 않다. 따라서 ip의 이러한 단점을 위해 ICMP가 존재한다.
    • ICMP는 에러상황이 발생할 경우 IP헤더에 기록되어 있는 출발지 호스트로 이러한 에러에 대한 상황을 보내주는 역할을 수행 하게 된다.
  • 하이퍼바이저
    • 호스트 컴퓨터 1대에서 다수의 운영체제를 동시에 실행할 수 있도록 해주는 가상 플랫폼 기술이고 가상 머신 모니터라고도 부른다.
    • 높은 수준의 관리 모니터링 도구에 대한 인터페이스 뿐만 아니라 OS 간 방해를 막기 위해 vm에 대한 자원 및 메모리 할당 등을 처리한다.
  • gateway
    • 현재 사용자가 위치한 네트워크에서 다른 네트워크로 이동하기 위해 반드시 거쳐야하는 거점

Kang3498

Contribution History

Week 1
1. DevStack 설치
  • Cafe24 호스팅 : Cent OS 6.1 64bit (116.125.120.18)

  • DevStack과 궁합이 좋은 Ubuntu로 OS 변경

  • Vagrant를 이용해 Ubuntu 가상 OS 설치

  • 공식문서 참조하여 DevStack 설치

  • Vagrant에서 8080으로 포트포워딩하여 116.125.120.18:8080으로 접속확인

  • Vagrant 파일 [1]

    Vagrant.configure("2") do |config|
      config.vm.box = "ubuntu/xenial64"
      config.vm.provider "virtualbox" do |vb|
          vb.memory = "6144"
          vb.cpus = "6"
      end
      config.disksize.size = '50GB'
      config.vm.network "forwarded_port", guest: 80, host: 8080
      config.vm.network "forwarded_port", guest: 20, host: 20
      config.vm.network "forwarded_port", guest: 21, host: 21
    end
    
2. git repo 생성 및 rst 문서작성 연습
  • 컨트리뷰톤 1팀 git repo fork
  • 링크 참조하여 히스토리 문서 작성
Week 2
1. PR 생성 및 코드리뷰
  • 생성 repo에 upstream remote 추가
  • branch 변경 후 PR 생성 [2]
  • git.openstack.org의 openstack-dev/sandbox(연습용 repo)에서 코드리뷰 연습
2. 네트워크 생성 및 VM 연결
  • 네트워크 생성
  • 네트워크 <-> VM 연결
  • 라우터 생성
  • 라우터를 이용해 public <-> private 네트워크 연결
  • 연결된 public ip를 통해 VM에 ssh로 접속 확인
Week 3
Week 4
1. API 접근 권한 획득
  • postman 프로그램에서 아래 내용을 http://116.125.120.18:8080/identity/v3/auth/tokens로 전송

    { "auth": {
      "identity": {
        "methods": ["password"],
        "password": {
          "user": {
            "domain": {
              "id": "default"
            },
            "name": "admin",
            "password": "secret"
          }
        }
        },
        "scope": {
          "project": {
            "domain": {
              "name": "default"
            },
            "name":  "admin"
          }
        }
      }
    }
    
  • 전달받은 X-Auth Token 값을 Header에 함께 보내야 API를 사용할 수 있음.

2. Image(glance) API 사용
  • 링크2 참조하여 API 사용

    ex) Create Image : http://116.125.120.18:8080/image/v2/images에 post로  전달. (Header에 X-Auth-Token값 필수)
    

[1]VM용량을 50Gb로 늘리지 않았을 때 인스턴스가 생성되지 않는 이슈 발생.
[2]master branch는 가급적 유지하기 위함

이 문서에서 검색