GitHub

https://github.com/call518/OpenStack-on-Kubernetes


Greetings

Hi! all, Welcome to my project. I hope this will be useful thing. :)

p.s. And I hope that some guy help me. If you are interested in this, please contact me. thank you.

Intro

  • OaaS is "OpenStack as a Service".

  • MAINTAINER: Jung-In.Jung (call518@gmail.com)

  • 2018-06-20 ~ Now

Goals

  • Auto-Provisioning OpenStack, Based on Kubernetes(k8s).
  • Scalaing for LB/HA.
  • Supoort Provisioning Almost OpenStack Releases. (Newton/Ocata/Pike/Queens/...)
  • Simple and Dynamic Configuration.
  • Auto Failover/Failback.

Components Diagram

Diagram

Networking Diagram

OaaS Netowkring

Progress

  • Ocata
    • memcached (Completed)
    • rabbitmq (Completed)
    • mongodb (Completed)
    • etcd (Completed)
    • galera (Completed)
    • haproxy (Completed)
    • keystone (Completed)
    • glance (Completed)
    • nova (Completed)
    • neutron (Completed)
    • cinder (Completed)
    • heat (Completed)
    • ceilometer-central (Completed)
    • aodh (Completed)
    • horizon (Completed)
  • Integration of OpenStack Releases.
    • (TODO: Planning...)

Tutorial

System Env. & Arch.

Requirements.

  • General Kubernetes Cluster.
  • All k8s Worker nodes have to sync Time (e.g. chrony, ntp)
  • k8s worker nodes for neutron-server/nova-compute need to load openvswitch/ebtables/ip_vs kernel module.
    • Run contents of host_kernel_modules_for_oaas.sh on compute/network role(label) woker nodes.
  • Quorum PODs (Replica is have to 2n+1)
    • galera-etcd
    • galera
    • rabbitmq

Env.

(Note) We have tested this tutorial with 6 VMs on VirtualBox Env. If u want, any env is possible. (eg. physical machines)

(Note) We use NFS for cinder backend storage for simple tutorial, but soon we will change to ceph back-end storage.

Spec. of Physical Host

  • Processor: Intel Core i5-6500 (3.2GHz)
  • Memory: 32GB
  • Storage: SSD (2TB)
  • NIC: Intel(R) Ethernet Connection (5) I219-LM

Spec. of each VM

(Note) Maybe, you need big RAM. if not, reduce number of replicas.

  • CentOS-7 x86_64
  • 2 EA vCPUs
  • vRAM: 2GB ~ 6GB
  • 100 GB vDisk
  • 1 EA NIC

Spec. of k8s

This is versions of packages that i have tested.

  • docker-ce-18.06.0.ce-3.el7.x86_64
  • kubernetes-cni-0.6.0-0.x86_64
  • kubectl-1.11.1-0.x86_64
  • kubelet-1.11.1-0.x86_64
  • kubeadm-1.11.1-0.x86_64

VM OS Env.

/etc/hosts
# cat /etc/hosts

192.168.0.150 k8s-master
192.168.0.151 k8s-node01
192.168.0.152 k8s-node02
192.168.0.153 k8s-node03
192.168.0.154 k8s-node04
192.168.0.155 k8s-node05

Deploy Tutorial

Node Labels (Role)

(!) Network(neutron-sever) worker nodes must be separated/dedicated. (network=true)

[k8s-master]# kubectl get node --show-labels

NAME         STATUS    ROLES     AGE       VERSION   LABELS
k8s-master   Ready     master    8d        v1.11.1   node-role.kubernetes.io/master=
k8s-node01   Ready     <none>    8d        v1.11.1   controller=true,compute=true,nfs-server=true
k8s-node02   Ready     <none>    8d        v1.11.1   controller=true,compute=true
k8s-node03   Ready     <none>    8d        v1.11.1   controller=true,compute=true
k8s-node04   Ready     <none>    8d        v1.11.1   network=true
k8s-node05   Ready     <none>    8d        v1.11.1   network=true

default configs (eg. password)

check main env file, src-ocata/configMap-env-common.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: env-common
data:
  K8S_OPENSTACK_RELEASE: "ocata"
  MYSQL_ROOT_PASSWORD: "passw0rd"
  DISCOVERY_SERVICE: "etcd-client:2379"
  XTRABACKUP_PASSWORD: "passw0rd"
  CLUSTER_NAME: "mariadb_galera_ss"
  #MYSQL_DATABASE: "mydatabase"
  #MYSQL_USER: "myuser"
  MYSQL_PASSWORD: "passw0rd"
  K8S_MONGO_USER: "admin"
  K8S_MONGO_PASS: "passw0rd"
  K8S_KEYSTONE_DB_PASS: "passw0rd"
  K8S_GLANCE_DB_PASS: "passw0rd"
  K8S_CINDER_DB_PASS: "passw0rd"
  K8S_NEUTRON_DB_PASS: "passw0rd"
  K8S_NOVA_DB_PASS: "passw0rd"
  K8S_GNOCCHI_DB_PASS: "passw0rd"
  K8S_AODH_DB_PASS: "passw0rd"
  K8S_HEAT_DB_PASS: "passw0rd"
  K8S_KEYSTONE_USER_ADMIN_PASS: "passw0rd"
  K8S_KEYSTONE_USER_DEMO_PASS: "demo"
  K8S_KEYSTONE_USER_GLANCE_PASS: "passw0rd"
  K8S_KEYSTONE_USER_CINDER_PASS: "passw0rd"
  K8S_KEYSTONE_USER_NEUTRON_PASS: "passw0rd"
  K8S_KEYSTONE_USER_NOVA_PASS: "passw0rd"
  K8S_KEYSTONE_USER_PLACEMENT_PASS: "passw0rd"
  K8S_KEYSTONE_USER_GNOCCHI_PASS: "passw0rd"
  K8S_KEYSTONE_USER_CEILOMETER_PASS: "passw0rd"
  K8S_KEYSTONE_USER_AODH_PASS: "passw0rd"
  K8S_KEYSTONE_USER_HEAT_PASS: "passw0rd"
  K8S_HAPROXY_STATS_USERNAME: "admin"
  K8S_HAPROXY_STATS_PASSWORD: "passw0rd"
  K8S_RABBITMQ_ADMIN_USER: "admin"
  K8S_RABBITMQ_ADMIN_PASS: "passw0rd"
  K8S_RABBITMQ_OPENSTACK_USER: "openstack"
  K8S_RABBITMQ_OPENSTACK_PASS: "passw0rd"
  K8S_METADATA_PROXY_SHARED_SECRET: "QU6muuXhU4oAeLzDas6obGsDtoFNZTHq"
  K8S_NFS_SERVER_IP_ETC_KEY: "k8s-oaas-nfs-server-ip-address"
  K8S_EXT_SUBNET_CIDR: "192.168.100.0/24"
  K8S_EXT_SUBNET_POOL_START: "192.168.100.101"
  K8S_EXT_SUBNET_POOL_END: "192.168.100.200"
  K8S_EXT_SUBNET_GW: "192.168.100.1"
  K8S_DEMO_SUBNET_CIDR: "172.16.0.0/24"
  K8S_DEMO_SUBNET_GW: "172.16.0.1"
  K8S_DEMO_SUBNET_DNS: "8.8.8.8"

Required Docker Images.

  • call518/oaas-init-container
  • call518/oaas-nfs-server
  • call518/oaas-etcd
  • call518/oaas-galera
  • call518/oaas-memcached
  • call518/oaas-rabbitmq
  • call518/oaas-mongodb
  • call518/oaas-haproxy
  • call518/oaas-zookeeper
  • call518/oaas-ocata

Initiate Deploying OpenStack

[k8s-master]# git clone [here]

[k8s-master]# cd OpenStack-on-Kubernetes/src-ocata

[k8s-master]# ./start-oaas.sh

Result Deploying

[k8s-master]# kubectl get all -o wide

NAME                           READY     STATUS    RESTARTS   AGE       IP             NODE
pod/cinder-0                   1/1       Running   0          38m       10.244.3.130   k8s-node03
pod/cinder-1                   1/1       Running   0          6m        10.244.1.143   k8s-node01
pod/etcd0                      1/1       Running   0          38m       10.244.2.112   k8s-node02
pod/etcd1                      1/1       Running   0          38m       10.244.3.127   k8s-node03
pod/etcd2                      1/1       Running   0          38m       10.244.1.137   k8s-node01
pod/galera-0                   1/1       Running   1          38m       10.244.2.117   k8s-node02
pod/galera-1                   1/1       Running   0          17m       10.244.3.133   k8s-node03
pod/galera-2                   1/1       Running   1          33m       10.244.1.142   k8s-node01
pod/glance-0                   1/1       Running   0          38m       10.244.1.140   k8s-node01
pod/glance-1                   1/1       Running   0          10m       10.244.3.135   k8s-node03
pod/haproxy-7b567f67d8-mxm7v   1/1       Running   3          38m       10.244.3.128   k8s-node03
pod/horizon-6965547f56-kgc44   1/1       Running   0          38m       10.244.2.116   k8s-node02
pod/keystone-0                 1/1       Running   0          38m       10.244.2.114   k8s-node02
pod/keystone-1                 1/1       Running   0          13m       10.244.3.134   k8s-node03
pod/memcached-0                1/1       Running   0          38m       10.244.2.113   k8s-node02
pod/memcached-1                1/1       Running   0          38m       10.244.3.129   k8s-node03
pod/memcached-2                1/1       Running   0          38m       10.244.1.138   k8s-node01
pod/neutron-server-0           1/1       Running   0          38m       10.244.1.139   k8s-node01
pod/neutron-server-1           1/1       Running   0          5m        10.244.3.136   k8s-node03
pod/nfs-server                 1/1       Running   0          38m       10.244.1.136   k8s-node01
pod/nova-compute-0             1/1       Running   0          38m       10.244.4.24    k8s-node04
pod/nova-compute-1             1/1       Running   0          38m       10.244.5.24    k8s-node05
pod/nova-server-0              1/1       Running   0          38m       10.244.2.115   k8s-node02
pod/nova-server-1              1/1       Running   0          4m        10.244.1.144   k8s-node01
pod/rabbitmq-0                 1/1       Running   0          38m       10.244.3.131   k8s-node03
pod/rabbitmq-1                 1/1       Running   0          35m       10.244.1.141   k8s-node01
pod/rabbitmq-2                 1/1       Running   0          35m       10.244.2.118   k8s-node02

NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                       AGE       SELECTOR
service/cinder                ClusterIP   None             <none>        8776/TCP                                                      38m       app=cinder
service/etcd-client           ClusterIP   10.109.90.101    <none>        2379/TCP                                                      38m       app=etcd
service/etcd0                 ClusterIP   10.110.11.231    <none>        2379/TCP,2380/TCP                                             38m       etcd_node=etcd0
service/etcd1                 ClusterIP   10.98.35.253     <none>        2379/TCP,2380/TCP                                             38m       etcd_node=etcd1
service/etcd2                 ClusterIP   10.110.157.230   <none>        2379/TCP,2380/TCP                                             38m       etcd_node=etcd2
service/galera                ClusterIP   None             <none>        3306/TCP                                                      38m       app=galera
service/glance                ClusterIP   None             <none>        9292/TCP,9191/TCP                                             38m       app=glance
service/haproxy-galera        ClusterIP   None             <none>        3306/TCP                                                      38m       app=haproxy
service/haproxy-stats         NodePort    10.103.245.255   <none>        9000:30090/TCP                                                38m       app=haproxy
service/horizon               NodePort    10.103.67.208    <none>        80:30080/TCP                                                  38m       app=horizon
service/keystone              ClusterIP   None             <none>        5000/TCP,35357/TCP                                            38m       app=keystone
service/kubernetes            ClusterIP   10.96.0.1        <none>        443/TCP                                                       2d        <none>
service/memcached             ClusterIP   None             <none>        11211/TCP                                                     38m       app=memcached
service/neutron-server        ClusterIP   None             <none>        9696/TCP                                                      38m       app=neutron-server
service/nova-compute          ClusterIP   None             <none>        8774/TCP,8775/TCP,6080/TCP                                    38m       app=nova-compute
service/nova-server           NodePort    10.111.84.90     <none>        8774:30177/TCP,8778:30246/TCP,8775:31964/TCP,6080:30068/TCP   38m       app=nova-server
service/rabbitmq              ClusterIP   None             <none>        5672/TCP,4369/TCP,25672/TCP                                   38m       app=rabbitmq
service/rabbitmq-management   ClusterIP   None             <none>        15672/TCP                                                     38m       app=rabbitmq

NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES                 SELECTOR
deployment.apps/haproxy   1         1         1            1           38m       haproxy      call518/oaas-haproxy   app=haproxy
deployment.apps/horizon   1         1         1            1           38m       horizon      call518/oaas-ocata     app=horizon

NAME                                 DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                 SELECTOR
replicaset.apps/haproxy-7b567f67d8   1         1         1         38m       haproxy      call518/oaas-haproxy   app=haproxy,pod-template-hash=3612392384
replicaset.apps/horizon-6965547f56   1         1         1         38m       horizon      call518/oaas-ocata     app=horizon,pod-template-hash=2521103912

NAME                              DESIRED   CURRENT   AGE       CONTAINERS       IMAGES
statefulset.apps/cinder           2         2         38m       cinder           call518/oaas-ocata
statefulset.apps/galera           3         3         38m       galera           call518/oaas-galera
statefulset.apps/glance           2         2         38m       glance           call518/oaas-ocata
statefulset.apps/keystone         2         2         38m       keystone         call518/oaas-ocata
statefulset.apps/memcached        3         3         38m       memcached        call518/oaas-memcached
statefulset.apps/neutron-server   2         2         38m       neutron-server   call518/oaas-ocata
statefulset.apps/nova-compute     2         2         38m       nova-compute     call518/oaas-ocata
statefulset.apps/nova-server      2         2         38m       nova-server      call518/oaas-ocata
statefulset.apps/rabbitmq         3         3         38m       rabbitmq         call518/oaas-rabbitmq

Open Horizon Dashboard

In browser, http://[One_of_worker_nodes]:30080

Scaling

(Note) Maybe, needed more worker nodes...

<Examples>

[k8s-master]# kubectl scale --replicas=4 statefulset.apps/cinder
[k8s-master]# kubectl scale --replicas=5 statefulset.apps/galera (must 2n+1)

ScreenShots

Login

Horizon Login

Overview

Horizon Overview

Instances

Horizon Instances

Network Topology

Horizon Network Topology

Instance Web Console

Horizon VM Console

TODO

  • Re-Configuration Flat-IP Ranbe for EXT-NET.
  • (Done) Simplify initContainer Check-Processing.
  • Integration of All of Provision Source. /w Template and ETc...

Appendix

Repositories

Active Repository (GitHub)

https://github.com/call518/OpenStack-on-Kubernetes

Mirrored Repository (GitLab)

https://gitlab.com/call518/OpenStack-on-Kubernetes

References


'Cloud' 카테고리의 다른 글

Concept of IaaS, PaaS, SaaS  (0) 2017.09.20
Orchestration Docker on Mesos/Marathon  (0) 2015.03.14
SDN Test Suite /w Vagrant  (0) 2014.12.23
OpenStack - How To Install DevStack with Vagrant/VirtualBox  (0) 2014.03.12
[Open] EYWA - Detailed Information  (0) 2014.03.03
Posted by 사랑줍는거지
,

Concept of IaaS, PaaS, SaaS

Cloud 2017. 9. 20. 10:27

Goal은 똑같다... "밥먹자!!"



SaaS "Just enjoy!"




PaaS "Cooking is my pleasure!"



IaaS "Ooooops!, OMG!!!, I'm hungry!!"



.

.

.

.

.

(철지난 개념 정리를 또 끄적이고 떠들게 될줄이야..... 그것도 자칭 클라우드 전문가에게....... 싫타 정말.... IaaS, PaaS, SaaS... 구분짓는다는게 참 우스운 일이긴 하지만, 어쩌겄어... 대화를 시작이라도 해볼려면... 쿨럭...)

Posted by 사랑줍는거지
,

'Cloud' 카테고리의 다른 글

OpenStack on Kubernetes (GitHub)  (0) 2018.08.16
Concept of IaaS, PaaS, SaaS  (0) 2017.09.20
SDN Test Suite /w Vagrant  (0) 2014.12.23
OpenStack - How To Install DevStack with Vagrant/VirtualBox  (0) 2014.03.12
[Open] EYWA - Detailed Information  (0) 2014.03.03
Posted by 사랑줍는거지
,

SDN Test Suite /w Vagrant

Cloud 2014. 12. 23. 23:00
Posted by 사랑줍는거지
,

About Amanda Backup

OS 2014. 9. 25. 18:27
Intro

What is AMANDA?

AMANDA, the Advanced Maryland Automatic Network Disk Archiver

"Single server can backup multiple hosts to various media."

"Amanda is a designed to backup multiple files, databases and applications across a local network and store data on a wide variety of devices including tape, disk and optical based storage"

"Optimized for efficient utilization of network and hardware resources"

Copyright (c) 1991-1998 University of Maryland at College Park All Rights Reserved.

History

  • University of Maryland's Computer Science Department
  • Supported by Zmanda

License

Freely distributable source and executable. University of Maryland (BSD style) license and GPL

Features of Amanda

  1. Server-Client(Agent) 아키텍쳐
    1. Single Backup Server <-> Multiple Client
    2. "All Configuration are done one a server"
  2. C & Perl
  3. 표준 백업 S/W를 기반으로 구성 (Extensible)
    1. GNU tar
    2. dump/restore
    3. Others
  4. 개방형 File 및 Tape 포맷
    1. Recover에 mt 또는 GNU tar로 가능 (without Amanda)
  5. Support Windows (32bit/64bit)
  6. Multiple Machines을 Holding Disk(Optional)에 병렬 Dump(백업) 처리
    1. 완료된 Dump들은 가능한 빨리 vtate/tape로 Copy
  7. 백업된 파일과, Media에서 파일의 위치에 대한 카탈로그 유지관리
  8. Generic Interface를 통해 Tape Changer 지원
  9. Device API 제공 (a pluggable interface to storage devices)
    1. Amanda는 실제로 Device와 직접 통신 하지 않는다.
    2. Bundled drivers
      1. tapes
      2. virtual tapes on disk
      3. DVD-RW
      4. RAIT (D2D2T, D2D2C)
      5. Amazon S3
    3. Bundled 'amvault' (Not Stable)
      1. Copy Amanda dumps from one volume to another
      2. 예) Copy to Removable Media
    4. Cloud Storage (S3)
  10. Server와 Client간 Secure Backup 지원
    1. by OpenSSH
    2. DMZ or Internet 구간 보안
  11. 암호화 백업 아카이브 지원
    1. on Amanda Client 또는 on AManda Server
    2. GPG 또는 Any Encryption 프로그램 가능
  12. 압축 백업 아카이브 지원
    1. 네트워크 상에서 "전송 전" 혹은, "전송 후" 선택 가능
    2. 예)
      1. gzip
      2. bzip2
      3. others
  13. Kerberos5 지원 (Authentication)
  14. Fault Tolerance (Down, Hang, Timeout...)
    1. Skip Clinet
      1. 스케쥴된 Backup Run 불가한 상황 극복 (예: 노트북, 랩탑, 기타 등등)
    2. Backup media error
      1. 백업 데이타는 "Holding Disk(Buffering)"에서 유지 (Optional)
      2. Media 문제가 해결되면, 다시 Media로 Flush된다.
    3. Client의 여러 케이스(예: Timeout)에 대해 Operation Re-try 처리
  15. 상세 보고서(Report) 지원
    1. email
      1. Data Balance 정보
      2. Client 백업 상태 요약
      3. Amanda의 Subsystem, Media, Network성능 요약 정보
      4. 각각의 Backup Run에 따른 Media Usage
      5. Error 메세지
  16. Validate Backup Data
    1. "amcheckdump" Command
    2. Storage로부터 Backup을 읽어, 각각에 적용된 Application으로 해석 될 수 있는지 확인
      1. 예: 백업본이 GNU tar 이미지라면, GNU tar로 parsing.
      2. --timestamp
  17. Server/Client 설정 검사 도구 지원
    1. "amcheck"
  18. 백업 스케쥴의 동적 조정
    1. 유지보수 (Host, Disk 추가/제거)
  19. Backup Normalization
    1. 백업 Cycle내에서 Full /. Incremental 백업을 자동 배치 (Intelligently)
    2. Resource 최적화를 위해 "Backup Level" 조절
  20. Pre/Post User 스크립트 지원
    1. Pre-Backup
    2. Post-Backup
    3. Pre-Restore
    4. Post-Restore
  21. IPv6 friendly
  22. Span Tapes 지원 (Split 지원)
    1. 단일 백업이 하나의 tape(vtape)을 초과할 경우, 자동 분할 저장
  23. Simple/Robust Data-Recovery
    1. 모든 Media와 백업 정보를 Database로 관리
    2. Amanda Command로 열람 가능
    3. 백업 데이터는 권한만 있다면 어떤 Client에서도 복구 될 수 있다.
    4. Native Format로 저장되므로, Amanda 없이 OS Tool만으로 복구 가능

System Requirements

Host

  • "Backup Server Host" (Can be a Client Host)
  • "Backup Client Hosts"
  • 저장매체에 접근이 가능해야 한다.
  • 저장매체 예)
    • Disk (Local, NAS, SAN)
    • 대용량 Tape드라이브(라이브러리)

Holding Disk

  • Dump에대한 버퍼링 (실제로 tape에 쓰기 전)
  • 병렬(Parallel) Backup Run 가능
  • Size는 가장 큰 Disk Partition으로부터 생성되는 Dump Output보다 커야 -> 최상의 성능 기대
  • Optional (Recommended)
    • Disable -> Sequentially

Client side tested systems

  • AIX 3.2 and 4.1

  • BSDI BSD/OS 2.1 and 3.1

  • DEC OSF/1 3.2 and 4.0

  • FreeBSD 6, 7 and 8

  • GNU/Linux 2.6 on x86, m68k, alpha, sparc, arm and powerpc

  • HP-UX 9.x and 10.x (x >= 01)

  • IRIX 6.5.2 and up

  • NetBSD 1.0

  • Nextstep 3 (!)

  • OpenBSD 2.5 x86, sparc, etc (ports available)

  • Solaris 10

  • Ultrix 4.2

  • Mac OS X 10

  • Windows: XP Pro (Server pack 2), 2003 server, Vista, 2008 server R2, Windows 7 (!)

Siver side tested systems

  • (!)를 제외한 나머지

Scheduler

"Amanda is a scheduler"

Q: "Will Amanda support my ACME Tape Drive 2000 Ultra Professional?"
A: "Does your Operating System Support it?"

Traditional Scheduling

  • 대부분 백업 솔루션들은 기본적으로 동일한 백업 스케쥴링을 제공.
    • 매주 일요일 또는 격주나 매월 마지막날 Full 백업 수행
    • (추가) 각 Full 백업 사이에는 다른 레벨을 가지는 증분백업을 수행
    • 이러한 방법론의 최대 문제
      • Resources Load Balancing 개념이 없음
        • CPU, Network, I/O
      • Full 백업 완료 지연
        • 예) 종종 시스템 관리자는 일요일 예약된 Full 백업이 월요일 아침까지 계속되는 상황 경험
      • 정기적인 Full 백업 이외에는 대부분 사용률 저조
      • Manual 하게 Load를 조정(Distribute Full Backup) 가능 하나 현실적이지 못함
        • 환경 변화 대응 느림
        • 신규 Client나, 제거 Client가 Manual하게 유지해왔던 LB 균형을 깨뜨림

Amadan Scheduling

  • Optimize Load Balancing of Backup
  • Static한 스케쥴을 지정하는 것 대신, 특정 조건을 셋업
    • "Client A,B, C는 매주 일요일에, D, E, F는 수요일에 Full 백업을 수행하고, 나머지 요일은 증분 백업을 수행해라"
    • "Dump사이클 기간은 7일이며, 최소한 1번의 Full 백업을 수행하고, 그외에는 증분 백업을 수행해라."
  • 아래의 목적을 위해 Amanda는 Full 백업과 증분 백업의 최적 조합을 찾는다. => "Optimal Backup Level"
    • 각 Backup Run 마다, Backup 데이타의 총량을 가능한 '작게(Small)' 하여 수행
    • 이를 위한 고려사항
      • 각 Client마다 보고된, 백업 되어야할 데이터 총량
        • 가장 최근 수행된 Backup(Since last backup) 기준으로 변화된 데이터 양 정보 기반
        • Dump Cycle(Maximum Time between Full Backups)
        • 각각의 Backup에 대한 Backup Media(tape or disk) 가용성 (Client별 상이한 Backup Media)
  • Optimal Backup Level 계산
    • 모든 Backup 단위는 "Estimate phase"를 가지고 시작된다.
    • "Estimate phase"
      • 어떤 File이 변경되었고, 변경된 파일들의 Total size는 얼마인지 결정하는 프로세스
      • 다소 시간 소요 발생 -> 특히 많은 Client수 또는 많은 Filesystem수를 가질때 소요시간 증가
        • (거의 변화가 없는 Filesystem 또는 File 변경이 거의 없는 대상이라면 Bypass 처리 가능)

Example - Amanda Scheduling

(그림1)

(그림2)

  • (그림2)는 (그림1)의 Client들에 대한 백업을 Amanda가 어떻게 스케쥴링 하는지를 보여주는 예제
  • (가정 상황)
    • 각가가의 /home 디렉토리는 100GB를 소비
    • Tape의 용량은 200GB
    • 데이타 변화률은 15%
    • Dump Cycle은 4일
    • 각각의 Backup Run은 DailySet1 부터 DailySet4로 Label된 Tape에 기록
    • 모든 증분 백업은 Level-1이며, 최근 Full 백업 기준으로 변경분을 의미 (=차등백업)
  • 아래 (표1)은 각 Backup Run으로 생성된 Backup Size

    FilesystemDailySet1DailySet2DailySet3DailySet4DailySet1DailySet2DailySet3DailySet4
    /home1100.015.027.7540.84100.015.027.7540.84
    /home2-100.015.027.7540.84100.015.027.75
    /home3--100.015.027.7540.84100.015.0
    /home4---100.015.027.7540.84100.0
    Total100.0115.0142.75183.59183.59183.59183.59183.59
  • 실제로 Amanda는 Tape의 용량을 최대한 활용하기 위해, 증분 백업의 Level을 0~9까지 모두 활용한다. (Tape 효율성 최대화)

Appendix

  • Dump Cycle
    • Short
      • 예) 3~4일
      • 장점: Incremental Backup 수가 적기에 Resotre가 상대적으로 쉽다.
      • 단점: 더 많은 Tape 및 Time 소요.
    • Long
      • 장점: 여러 Tape에 Load를 보다 효과적으로 분산 가능
      • 단점: 많은 증분 백업으로 인해 Restore에 더 많은 단계를 필요로 함

Tape Management

  • Amanda는 vpate, ptape, disk, optical 등 모두 tape으로 추상화
  • 모든 tape은 사용되기 전에 "amlabel" 명령을 통해 label처리가 되어야 한다.
    • label과정을 쉽게 하기 위해, default template이 제공된다.
    • custom template 작성 가능
  • Labling의 목적은 동일 tape에 Overwriting 방지 (유효한 백업 이미지 보전)
    • Amanda의 tape 식별자 정도 개념
    • 각각의 Backup Run 단위마다 New Tape으로 시작
    • 동일 tape에 여분이 있더라도, 다른 시점의 Backup Run은 반드시 Next Tape의 첫부분부터 기록
  • 백업 보존 정책에 따라, 각 Tape의 만료 일자 추적
    • 만료되 Tape은 새로운 Backup의 기록을 위해 재사용된다. (Rotate)
      • 필요하다면, 특정 tape들은 재사용하지 않도록 설정 가능. (만료되지 않도록)
      • DVD-RW와 같은 Optical Media를 대상으로 Archiving 할때 유용
  • 단일 Backup Run에, 매우 큰 대용량 데이타 백업에 대해 Mulitple Tape 사용 지원 (Span Multiple Tapes)
    • >= version 2.5
    • (2.5 이전 Old Version: Large Filesystem을 작은 Chunks로 관리자가 쪼개야 했음)
    • 하나의 Backup Run에 대해 최대(max) 사용가능한 tape 설정 (runtapes 1)
    • "part_size"로 백업데이타를 Split (Recommanded: 1/10 of Tape-Size)
    • LEOM (Logical End-Of-Midium) 지원/미지원 둘다 가능 (LEOM 지원 권장)
      • Amanda는 백업 초기단계에 "end of volume" 감지 가능 (with LEOM, without LEOM)
      • vtape의 경우, VFS Device는 LEOM 기본 지원 -> Tape Spanning 자동 활성 (enabled)

Setup Virtual Tapes

  • Virtual Tapes(vtapes)은 tape를 Emulating 함을 의미
  • "chg-disk" Tape Changer (Recommended)

Pre-Requirements

  • vtapes 저장소로 사용할 독립된 Physical HDD 또는 Partition를 결정 (성능)
    • Dedicated HDD 권장
  • holdingdisk와 vpates는 동일한 Physical HDD여서는 안된다. (성능)
  • vpates 저장소는 Amanda에 의해 Backup대상에 포함되어서는 안된다.

Length and number of tapes

  • HDD를 어떻게 vtapes으로 분할할지 결정하기 위해 아래의 사항들에 대해 평가/추정 필요.
    • 백업되어야 할 데이터의 Total amount
    • Full백업 당, 허용 가능한 Level-1이상의 증분백업의 개수
    • Full백업 대비, 증분백업의 Size (="데이터 변화율%")
    • total tapecycle (백업 데이터 유지 기간과 연관)
    • 앞선 수치들의 장기적 변화 추이
  • 넉넉한 공간을 확보(Cost↑, Utilization↓)를 통해 "Oversubscribing"을 방지하는 것이 권장되나, oversubscribing을 허용했을 경우, Backup Failure 방지를 위한 주의/감시 체계 필요.

Safe Calculation

  • Available Space를 tapes으로 분할 지침

available space * 0.9 >= tapelength * tapecycle

    • Usage가 Full에 근접할 경우, 급격한 성능 저하가 "0.9"의 이유
    • 성능을 위한 보수적 수치
    • 필요에 따라 조정 가능
      • Amanda가 하나의 Tape용량(tapelength)를 모두 채우는 일은 드물다.

Oversubscribing

  • 실제 존재하는 Resouce보다 더 많은 백업 대상을 수용
  • vtape의 Length와 Cycle값 조정
available space * oversubscription factor = tapelength * tapecycle
    • 1.0 <= oversubscription factor <= tapecycle
  • 각 Backup Run에 사용된 Tape의 유휴 용량이 충분할때 가능한 방법
    • 예) DLE의 모든 항목을 Full백업 수행이 가능할만큼 Tapesize가 클 때,
  • Amanda는 Space의 초과여부는 고려하지 않음.
Example
  • (가정 상황)
    • 15GB Storage (available space)
    • 15 Tape Cycle
    • 2GB Tape Length
    • oversubscription factor = 2.0
    • DLE중 하나의 Usage가 급격히 증가...
T01T02T03T04T05T06T07T08T09T10T11T12T13T14T15
1.9GB1.6GB1.4GB1.7GB1.8GB1.9GB1.2GB1.7GB1.8GB0.3GB0.5GB0.9GB0.4GB0.6GB0.4GB
  • (결과)
    • T01~T09 총량
      • 1.9+1.6+1.4+1.7+1.8+1.9+1.2+1.7+1.8 = 15 (GB)
    • T10부터 T15까지는 Dump데이터가 tape으로 flush되지 못한채, Holdingdisk에 남겨지게 됨.
    • 이 현상은 Tape Cycle가 끝나고 다시 시작하는(reuse) T01이 될때까지 계속된다. (Backup Failure)
  • oversubscription factor 에 대한 가이드
    • 2.0은 매우 높은 수치.
    • 상황에 따라 적절한 값은 달라지지만, 대개 1.1~1.5가 보통

Redundancy

  • 모든 vtapes을 단일 대상에 두는 것은 대규모 데이터 손실에 취약
  • RAID 장비 기반도 안전하지 않음
  • Solution => RAIT

Tape Configuration

Device Management

"Amanda dose not use any Proprietary driver for tape or optical devices."

  • Amanda는 단지, tape의 속성을 정의한 "tapetype"을 지정
    예) LTO-3

    tapetype
    define tapetype LTO3-400-HWC {
    comment "LTO Ultrium 3 400/800, compression on"
    length 401408 mbytes
    filemark 0 kbytes
    speed 74343 kps
    }
    define tapetype HARDDISK { # Define our tape behaviour
    length 100000 mbytes # Every tape is 100GB in size
    }
  • 범용 tape 저장 장치에 대한 tapetype Definition이 미리 준비 되어 있음

Virtual Tape

  • Amanda는 백업 기록을 위한 Target Media로 Disk를 사용할 수 있는 기능 제공
  • 임의의 전용 디렉토리가 "vtapte"으로 불리는 Virtual Tape로 사용된다.
  • 완전히 Physical Tape을 사용하는 방식과 동일하게 운영
    • Physical Tape Library 인프라 투자 결정에 대한 평가나 테스트 가능
    • 현재는 Production환경에서도 Disk에 백업을 기록/보관도 충분
  • RAIT 지원
    • "Redundant Array of Inexpensive Tapes"
    • RAIT 목적은 "중복성" 증가 (D2D2T, D2D2C)
    • 여러 Disk에 데이터가 저장되는 RAID 기술과 유사
    • virtual tape & physical tape
    • 2,3,5 Tapte Set 지원
      • 예) 3개의 Tape Set
        • 2개의 Tape는 데이터 저장
        • 1개는 Parity 비트 저장
        • 단일 Tape 대비 2배의 용량/성능
        • 실패율 감소 (1/00 -> 1/10000 : 두 Tape모두가 유실/손상 되지만 않는다면 복구 가능)
      • 예) 5개의 Tape Set
        • 4배의 용량/성능
      • 예) 2개의 Tape Set
        • 용량/성능 증가는 없다.
        • Output에 대한 중복(Replicate)
        • 저장 매체 타켓을 다르게 할 수도 있다. (vtape + tape)
        • 동일한 타겟
          • 정확히 똑같은(매체, 방식 등등) 두개의 "Clone"이 만들어 지므로 DR 대비, On-Site, Off-Site로 분리 배치 가능
        • 상이한 타겟
          • Tape는 장비 보관용에 유리, Disk는 신속한 복원에 유리



'OS' 카테고리의 다른 글

[동영상] TCP/IP의 원리  (0) 2012.05.12
Posted by 사랑줍는거지
,
GitLab => https://gitlab.com/call518/devstack-on-vagrant-single/tree/master




업무상 잦은 재설치와, 여러 버전의 OpenStack이 필요하다 보니, 급하게 작성한 내용임을 미리 밝힌다.

Vagrantfile내용을 적절히 편집하면 neutron 환경이며, 설치를 원하는 Branch선택 가능...

자세한 내용은 위 GitLab 링크로...




테스트 확인 환경 (버전주의... 특히 Vagrant의 경우, 버전차이에 따라 Syntax에 변화가 크다.)

- Linux(Ubuntu12.04.4_64)/Windows7(32bit)

- VirtualBox: v4.3.8-92456

- VirtualBox Extension Pack: v4.3.8-92456

- Vagrant: 1.3.5




Vagrantfile 편집하여 각자 네트워크 환경에 맞춘다.

- config.vm.network :public_network => 기본 2개의 추가 NIC(eth1, eth2)를 사용하게 되며, eth1에는 각자의 네트워크 환경에 맞게 VM의 관리용 IP를 부여한다. eth2는 IP없이 부팅되게끔 0.0.0.0으로 처리 (eth0 NIC가 기본 탑재되는데 이것은 vagrant 전용으로 간주한다.)


Posted by 사랑줍는거지
,
Posted by 사랑줍는거지
,

[가정 & 조건]

  • OpenNebula(이하 ONE) 4.0 버전 설치 과정 정리 목적. (by Source) (Pacage로 진행해도 무방)
  • 모든 테스트는 VMware Player상에서 Nested KVM기반으로 진행하였으나, Physical환경에서도 동일.
  • OS 플랫폼으로 Ubuntu 13.04 64bit 사용
  • ONE-Server와 KVM-01 서버 두개의 Machine 기반 시나리오.
  • 각각의 호스트네임은 "one-server" 및 "kvm-01"로 한다.
  • 각 Machine은 최신 패키지로 업그레이드 되어 있다. (apt-get dist-upgrade)
  • ONE 관리자 계정은 "oneadmin"으로 한다.
  • 편의상 모든 작업은 ubuntu 계정으로 진행.
  • Hypervisors Machine의 Network모듈은 "Open vSwitch"를 사용 한다.
  • Network IP는 로컬 사정상 Static로 하였음. 적절히 상황에 맞게 설정하면 된다.
  • 두 Machine 모두 NIC는 1개로 진행.


[ONE-Server]


1. HostName 확인/조정

(가정 & 조건 설정)

$ sudo vi /etc/hosts

127.0.0.1 one-server


$ sudo vi /etc/hostname

one-server


2. 패키지 업그레이드 (의존성 반영)

$ sudo apt-get -y dist-upgrade


3. ONE Source 다운로드 및 압축 해제

(from http://dev.opennebula.org/packages/)

$ whoami

ubuntu

$ pwd

/home/ubuntu


$ wget http://dev.opennebula.org/packages/opennebula-4.0.0/opennebula-4.0.0.tar.gz

$ tar zxvf opennebula-4.0.0.tar.gz

$ cd opennebula-4.0.0

$ ls

include install.sh LICENSE NOTICE README.md SConstruct share src


4. ONE운영에 필요한 Ubuntu 패키지 설치 (의존성)

(Reference: http://opennebula.org/documentation:rel4.2:build_deps => Debian/Ubuntu)

$ sudo apt-get install -y g++ libxmlrpc-c3-dev scons libsqlite3-dev libmysqlclient-dev libxml2-dev libssl-dev liblog4cpp5-dev ruby ruby-dev sqlite3


5. ONE 관리자 계정/그룹 생성 및 PW설정

(패스워드는 적절히 설정 한다.)

$ sudo groupadd --gid 1001 oneadmin

$ sudo useradd --uid 1001 -g oneadmin -s /bin/bash -d /var/lib/one oneadmin

$ sudo passwd oneadmin

$ sudo echo "oneadmin    ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers


6. ONE 빌딩 (by scons)

(mysql을 DB로 사용할 경우, "scons mysql=yes")

$ whoami

ubuntu

$ pwd

/home/ubuntu/opennebula-4.0.0.0


$ scons

(생략)


7. ONE 설치/확인

$ whoami

ubuntu

$ pwd

/home/ubuntu/opennebula-4.0.0.0


$ sudo ./install.sh -u oneadmin -g oneadmin


$ sudo mkdir -p /var/run/one /var/lock/one

$ sudo chown oneadmin:oneadmin /var/run/one /var/lock/one


$ cd /var/lib/one

$ ls

datastores remotes vms


8. ONE 운영에 필요한 rubygem을 통한 추가적인 패키지 의존성 해결

(apt-get에서 이미 설치된 것은 통과 처리)

$ cd /usr/share/one

$ ls

examples install_gems tgt websockify


$ sudo ./install_gems

(중략)

Press enter to continue... => [엔터]

(중략)

* sunstone

* quota

* cloud

* ozones_server

* auth_ldap

Press enter to continue... => [엔터]

(생략)


9. ONE 운영을 위한 SSH-Key 생성 및 SSH 설정

$ su - oneadmin

$ whoami

oneadmin

$ pwd

/var/lib/one


$ ssh-keygen -t rsa

=> [엔터]

=> [엔터]

=> [엔터]


$ echo "ConnectTimeout 5

Host *

StrictHostKeyChecking no" > .ssh/config


10. ONE 관리자 인증설정

(Password는 적절히 등록. 본 예제에서는 "passw0rd"로 함. 숫자 0)

$ whoami

oneadmin

$ pwd

/var/lib/one


$ mkdir .one

$ echo "oneadmin:passw0rd" > .one/one_auth

$ chmod 600 .one/one_auth


11. ONE 서비스 시작 및 상태 확인

(혹, Start 수행이 정상적이지 않다면, "one stop" 수행 후, 다시 "one start"를 시도 해본다.)

$ whoami

oneadmin


$ one start

$ oneuser list

  ID NAME            GROUP      AUTH           VMS            MEMORY         CPU

   0 oneadmin        oneadmin   core             -                 -           -

   1 serveradmin     oneadmin   server_c         -                 -           -


$ oneuser list -x

<USER_POOL>

  <USER>

    <ID>0</ID>

    <GID>0</GID>

    <GNAME>oneadmin</GNAME>

    <NAME>oneadmin</NAME>

    <PASSWORD>7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53</PASSWORD>

    <AUTH_DRIVER>core</AUTH_DRIVER>

    <ENABLED>1</ENABLED>

    <TEMPLATE/>

    <DATASTORE_QUOTA/>

    <NETWORK_QUOTA/>

    <VM_QUOTA/>

    <IMAGE_QUOTA/>

  </USER>

  <USER>

    <ID>1</ID>

    <GID>0</GID>

    <GNAME>oneadmin</GNAME>

    <NAME>serveradmin</NAME>

    <PASSWORD>1e6686daf58dd9d12961183474a9f80a236c7bdf</PASSWORD>

    <AUTH_DRIVER>server_cipher</AUTH_DRIVER>

    <ENABLED>1</ENABLED>

    <TEMPLATE/>

    <DATASTORE_QUOTA/>

    <NETWORK_QUOTA/>

    <VM_QUOTA/>

    <IMAGE_QUOTA/>

  </USER>

  <DEFAULT_USER_QUOTAS>

    <DATASTORE_QUOTA/>

    <NETWORK_QUOTA/>

    <VM_QUOTA/>

    <IMAGE_QUOTA/>

  </DEFAULT_USER_QUOTAS>

</USER_POOL>


12. ONE sunstone-server 실행

$ whoami

oneadmin


$ sunstone-server start




[KVM-01]


1. HostName 확인/조정

(가정 & 조건 설정)

$ sudo vi /etc/hosts

127.0.0.1 kvm-01


$ sudo vi /etc/hostname

kvm-01


2. 패키지 업그레이드 (의존성 반영)

$ sudo apt-get dist-upgrade


3. VT기술 지원 확인 (CPU)

$ sudo egrep "vmx|svm" /proc/cpuinfo


4. KVM & Open vSwitch 패키지 설치

$ sudo apt-get -y install nfs-common openssh-server ruby qemu-kvm libvirt-bin pm-utils openvswitch-datapath-source openvswitch-common openvswitch-switch openvswitch-brcompat


5. Libvirt에 기본 NAT 네트워크를 비활성화 한다.

(상황에 따라 Network 연결이 끊길 수 있다. 만일에 대비해 Local 작업을 위한 Console을 준비 해둔다.)

$ sudo virsh net-destroy default

$ sudo virsh net-autostart --disable default


6. Hypervisor의 네트워크 설정 (파일 정보만 수정)

(주의) brcompat 는 OVS 1.10 이후부터 리눅스의 전통적인 bridge명령인 brctl과 호환되지 않는다.(removed)

$ sudo echo "auto lo

iface lo inet loopback


auto eth0

iface eth0 inet manual

up ifconfig  0.0.0.0 up

down ifconfig  down


auto br0

iface bro inet static

address 172.21.18.148

netmask 255.255.255.0

gateway 172.21.18.1

" > /etc/network/interfaces


$ sudo vi /etc/default/openvswitch-switch

#BRCOMPAT=no

=>

BRCOMPAT=yes


7. Open vSwitch에 Bridge/Port 설정 및 확인

$ sudo ovs-vsctl add-br br0

$ sudo ovs-vsctl add-port br0 eth0


$ sudo ovs-vsctl show

Bridge "br0"

Port "eth0"

Interface "eth0"

Port "br0"

Interface "br0"

type: internal

ovs_version: "1.9.0"


8. ONE 운영 계정 생성

$ sudo groupadd --gid 1001 oneadmin

$ sudo mkdir /var/lib/one

$ sudo useradd --uid 1001 -g oneadmin -s /bin/bash -d /var/lib/one oneadmin

$ sudo usermod -a -G kvm oneadmin

$ sudo usermod -a -G libvirtd oneadmin

$ sudo chown oneadmin:oneadmin /var/lib/one

$ sudo echo "oneadmin    ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers


* (Note)

Libvirt/QEMU 프로세스에 동적으로 적용되는 파일의 소유권(Ownership) 비활성화

# vi /etc/libvirt/qemu.conf

dynamic_ownership = 0






[참조 원문 블로그 주소]

http://opennebula.org

http://kloudology.com/2013/06/16/opennebula-4-0-home-lab-part-3-installing-kvm-and-open-vswitch-on-ubuntu-13-04/




















Posted by 사랑줍는거지
,

OpsWorks는 기존의 AWS Cloud Formation의 대안격으로 보인다. 현재는 Beta서비스 중이지만, 개념이 Cloud Formation보다 훨씬 직관적인 것 같다. 물론 Chef에 대해 어느정도 배경지식이 있어야 하겠다.

(이런게 진짜, "as-a-Service" 아니겠나~ "I"냐 "P"냐 "S"냐는 경계가 모호해진지 오래라 의미 없고..)


이번 스레드에서는 OpsWorks상에서 Custom Cookbook(getting-started)를 적용하는 흐름을 간단히 정리해 두는 것이 목적이다.


먼저 OpsWorks 특징에 대해 파악된 부분만 우선 정리 하자면,


  • 단일 인스턴스가 최종 Goal이 아닌, 하나의 Stack(다 계층 구조의 시스템 전체)를 쉽게 배포/설정을 지원.
  • 하나의 Stack은 다수의 Layer로, 또 각 Layer는 다수의 Instance로, 또 각 Instance는 다수의 App으로 구성 된다.
  • 주요 도구는 이름에서도 드러나듯이, OpsCode사의 Chef가 주요 역할을 담당한다.
  • 일반적으로 통용되는 Stack구조(MySQL, PHP, node.js, 등)는 별도의 Cookbook이 필요 없이 기본 제공이 된다. 
  • Cookbook 적용시, 사용자 입력값이나, 개개의 Private한 값은 Data Bag이 아니라 JSON 형식으로 전달한다.
  • 사용자 정의 값을 기술한 JSON 내용은, Static하게 또는, 매번 실행시마다 1회성(Dynamic)으로 전달 할 수도 있다. 단, Static과 Dynamic에 동일 값이 있으면, Dynamic값이 Static값에 Override되어 우선순위가 높은 것으로 판단된다. (확인 필요)
  • (기타 특징들은 파악 되는대로 계속 업데이트 예정...)

[본론] OpsWorks에서 Chef의 기본 에제인 "getting-started" cookbook을 적용하는 예제 실습

가정
  • Stack이나 Layer에 대한 실습이 아니므로, 단일 레이어에 PHP템플릿 인스턴스 하나에 getting-started적용 진행.
  • "getting-started" 소스는 SSH Key기반의 GitHub에 등록되어 있다.
  • GitHub에 준비해둔 "getting-started"에 수정한 내역은 아래와 같다.
    (cookbooks/getting-started/templates/default/chef-getting-started.txt.erb)
    (붉은 색 부분을 추가 하였으며, 해당 값은 JSON으로 전달 한다.)
  • Welcome to Chef!


    This is Chef version <%= node[:chef_packages][:chef][:version] %>.

    Running on <%= node[:platform] %>.

    Version <%= node[:platform_version] %>.

    Custom <%= node['deploy']['test_string'] %>

  • Stack, Layer, Instance 등을 생성하는 방법은 아래 문서를 참조한다. 너무 쉽기도 하고 설명도 잘되어 있다.
    http://awsdocs.s3.amazonaws.com/opsworks/latest/opsworks-ug.pdf

실습 내용 요약
  • "getting-started" Cookbook을 PHP가 설치될 Instance에 추가로 적용시키고, "getting-started" 내용 일부를 수정/추가 하여, JSON으로 전달된 값들이 정상적으로 반영되는지까지 확인한다.

[실습 과정]
  1. "test"라는 이름으로 Stack 생성
    (최초 Stack을 생성하면 녹색 원에 숫자가 "0"일 것이다. 이 캡쳐는 테스트 후에 작성한 것이라, "1"로 표시된 것일 뿐..)

  2. Layer 생성 (Custom Cookbook 적용이 목적이므로, 어느 것이든 관계 없다. 본 실습에서는 App Server에서 PHP로 하였다.

  3. "getting-started" Cookbook을 실제로 적용시킬 Instance 하나를 생성.

  4. 과정(2)에서 생성한 Layer의 편집 모드로 진입하여, "getting-started" Cookbook의 위치, SSH-Key 정보, 사용자 정의 Value를 포함하는 JSON 정보등을 설정.

  5. 설정을 마쳤으니, 실제로 "getting-started" Cookbook을 대상 Instance에 적용해 본다.

    (Custom Chef JSON에서 Override로 값을 재정의 할 수 있다.)


  6. 수행 Log 학인

    (/tmp/ 디렉토리에 "getting-started"의 default 레시피대로 파일이 에러 없이 작성되었다.)


  7. 생성 파일 내용 확인
    (과정상 "Custom call518"로 표시되어야 하나, 캡쳐 그림은 여러가지로 테스트 한 결과임)
[END]
아주 기초적인 흐름만 테스트 해보았다. 서두에 링크해둔 PDF(User Guide)를 참고해서, 사용자 Cookbook이 수행되는 타이밍(전체 Stack을 구성하다 보면 Cookbook간의 순서가 중요하다.)도 조절해 보고, Stack, Layer, Instance에서 App목록까지 Custom Cookbook으로 전달해야 할 일이 많을 텐데, 그러한 부분까지 테스트 해볼 예정이다. 그러기 위해서 가장 기초적인 내용을 정리 해둔 것.... 


Posted by 사랑줍는거지
,

Resize qcow2 image

Cloud/KVM 2013. 9. 28. 23:07
[Info]
  • e.g.) Default 8GB(orig.img) -> 20GB(test.img) any..
  • Both Single-Image and BackingType-Image 
  • Test format: qcow2
  • Tools: parted, qemu-img, qemu-nbd
  • Test Platform: Ubuntu 13.04 x86_64


[Start]


- Check Image

# qemu-img info orig.img 

image: orig.img

file format: qcow2

virtual size: 8.0G (8589934592 bytes)

disk size: 883M

cluster_size: 65536

# qemu-img create -b /home/orig.img -f qcow2 test.img

# qemu-img info test.img

image: test.img

file format: qcow2

virtual size: 8.0G (8589934592 bytes)

disk size: 196K

cluster_size: 65536

backing file: /home/orig.img


- Connect NBD & Check partitions

# modprobe nbd

# qemu-nbd -c /dev/nbd0 /home/test.img

# ls -al /dev/nbd0*

brw-rw---- 1 root disk 43, 0 Sep 28 23:18 /dev/nbd0

brw-rw---- 1 root disk 43, 1 Sep 28 23:18 /dev/nbd0p1

# parted /dev/nbd0 --script print free

Model: Unknown (unknown)

Disk /dev/nbd0: 8590MB

Sector size (logical/physical): 512B/512B

Partition Table: msdos


Number  Start   End     Size    Type     File system  Flags

        32.3kB  1049kB  1016kB           Free Space

 1      1049kB  8589MB  8588MB  primary  ext4         boot

        8589MB  8590MB  1049kB           Free Space

- Disconnect NBD & Resize image

# qemu-nbd -d /dev/nbd0

/dev/nbd0 disconnected

# qemu-img resize test.img 20G

Image resized.


- Check image

# qemu-img info test.img

image: test.img

file format: qcow2

virtual size: 20G (21474836480 bytes)

disk size: 200K

cluster_size: 65536

backing file: /home/orig.img


Connect NBD & Check partitions

qemu-nbd -c /dev/nbd0 /home/test.img

parted /dev/nbd0 --script print free

Model: Unknown (unknown)

Disk /dev/nbd0: 21.5GB

Sector size (logical/physical): 512B/512B

Partition Table: msdos


Number  Start   End     Size    Type     File system  Flags

        32.3kB  1049kB  1016kB           Free Space

 1      1049kB  8589MB  8588MB  primary  ext4         boot

        8589MB  21.5GB  12.9GB           Free Space


- Re-Partitioning (Remove Partition and Create Partition) ("1" is partition-number)

# parted /dev/nbd0 --script rm 1

# parted /dev/nbd0 --script print free

Model: Unknown (unknown)

Disk /dev/nbd0: 21.5GB

Sector size (logical/physical): 512B/512B

Partition Table: msdos


Number  Start   End     Size    Type  File system  Flags

        32.3kB  21.5GB  21.5GB        Free Space


# parted -a optimal /dev/nbd0 --script mkpart primary ext4 0% 100%

# parted /dev/nbd0 --script print free

Model: Unknown (unknown)

Disk /dev/nbd0: 21.5GB

Sector size (logical/physical): 512B/512B

Partition Table: msdos


Number  Start   End     Size    Type     File system  Flags

        32.3kB  1049kB  1016kB           Free Space

 1      1049kB  21.5GB  21.5GB  primary  ext4


- Mount image's Partition (to edit boot-script :: rc.local)

# kpartx -a /dev/nbd0

# mount /dev/mapper/nbd0p1 /mnt/


- Apply Parition to VM (by resize2fs)

# echo 'resize2fs /dev/vda1; sed -i \"/resize2fs/d\" /etc/rc.local' >> /mnt/etc/rc.local


[End]

Booting VM with new image




[Appendix]

- Disconnect kpartx & NBD

# umount /mnt

# kpartx -d /dev/nbd0

# qemu-nbd -d /dev/nbd0


Posted by 사랑줍는거지
,