특정 작업을 수행하기 위해 VirtualBox 내에 동일한 OS로 비슷한 스펙을 가진 VM을 여러 개 만들어야 할 일이 있을 것이다. 매번 OS를 설치하고 기본 패키지를 다운로드, 설치/설정을 반복하는 일이 번거롭고 시간을 뻇기는 부담으로 느껴진다면 이 방법을 한 번 써 봐도 좋겠다는 생각에서 정리해 둔다.


사전 준비


* VirtualBox가 설치된 호스트 머신

* template에 설치할 OS 이미지(ISO) 파일 준비, 여기서는 CentOS 7.3(1611) Minimal ISO


VirtualBox VM template 제작


1. 적당한 스펙의 VM(CPU1, Memory 1GB)을 새로 만들기

가상하드디스크는 VMDK 또는 VDI 형식을 선택


2. 저장소의 CDROM에 CentOS 7.3 ISO 파일 연결


3. VM 선택 후 시작(전원 켜기)


4. CentOS 7.3 설치


5. Network Manager 제거

  # systemctl stop NetworkManager

  # systemctl disable NetworkManager


6. 네트워크 설정 & reboot, 인터넷 연결 정상여부 확인

  # vi /etc/sysconfig/network-script/ifcfg-eth0

BOOTPROTO=static

TYPE=Ethernet

DEVICE=eth0

IPADDR=a.b.c.d

NETMASK=255.255.255.0

GATEWAY=a.b.c.x

DNS1=a.b.c.y

DNS2=a.b.c.z

ONBOOT=yes


7. 기본 업데이트 및 패키지(epel repo 사용을 전제로 함) 설치 & reboot

 # yum update -y

 # yum install -y epel-release https://www.rdoproject.org/repos/rdo-release.rpm

 # yum install -y net-tools bind-utils nc bzip2 yum-utils gcc kernel-devel dkms wget chrony

(gcc, kernel-devel, dkms는 linux용 VirtualBox Guest Addon을 빌드하기 위한 필수 패키지)


8. VirtualBox Menu > Insert Guest Addon CD image

 # mount /dev/cdrom /mnt

 # sh /mnt/VBoxLinuxAdditions.run

(reboot)


9. VM sealing(template 화 하기위한 봉인 작업. VMware에서의 template 작업과 비슷하지만 약간 다름)

 # vi seal.sh

#!/bin/bash 

#stop logging services 

/sbin/service rsyslog stop 

/sbin/service auditd stop 

#remove old kernels 

/bin/package-cleanup -y --oldkernels --count=1 

#clean yum cache 

/usr/bin/yum clean all 

#force logrotate to shrink logspace and remove old logs as well as truncate logs 

/usr/sbin/logrotate -f /etc/logrotate.conf 

/bin/rm -f /var/log/*-???????? /var/log/*.gz 

/bin/rm -f /var/log/dmesg.old 

/bin/rm -rf /var/log/anaconda 

/bin/cat /dev/null > /var/log/audit/audit.log 

/bin/cat /dev/null > /var/log/wtmp 

/bin/cat /dev/null > /var/log/lastlog 

/bin/cat /dev/null > /var/log/grubby 

#remove udev hardware rules 

/bin/rm -f /etc/udev/rules.d/70* 

#remove SSH host keys 

/bin/rm -f /etc/ssh/*key* 

#remove root users shell history 

/bin/rm -f ~root/.bash_history 

unset HISTFILE 

#remove root users SSH history 

/bin/rm -rf ~root/.ssh/

 # chmod +x seal.sh

 # vi /etc/sysconfig/network-scripts/ifcfg-eth0

BOOTPROTO=dhcp

TYPE=Ethernet

DEVICE=eth0

#IPADDR=a.b.c.d

#NETMASK=255.255.255.0

#GATEWAY=a.b.c.x

#DNS1=a.b.c.y

#DNS2=a.b.c.z

ONBOOT=yes

 # ./seal.sh

 # rm -f seal.sh

 # history -c

 # sys-unconfig


10. 만들어진 VM 이미지 파일(예를 들어 cent73-template.vdi 파일)을 ~/VirtualBox VMs/Cent73 template 디렉토리에서 /MyOSTemplates/ 등의 별도 디렉토리를 만들어서 복사해 두고, 해당 VM은 VirtualBox 콘솔에서 삭제한다.


VirtualBox VM template 을 활용한 VM 찍어내기


1. 원하는 스펙의 VM을 새로 만들기(VritualBox 콘솔)


하드디스크 선택 단계에서 '기존 가상 하드 디스크 파일 사용' 선택 직후, 반드시 아래 단계를 정확히 진행


1-1. 윈도우 탐색기, MacOS Finder 등을 실행하여, 앞서 저장해 둔 template 파일을 현재 만들어지고 있는 VM의 이미지 저장 디렉토리로 복사해 온다. 즉,

 * Source 파일: /MyOSTemplates/cent73-template.vdi

 * Destination 디렉토리: ~/VirtualBox VMs/Test VM from template - 1


1-2. 터미널 또는 커맨드 창에서 아래의 명령을 수행하여, 복사해 온 VM Image에 대한 UUID를 교체

 # VBoxManage internalcommands sethduuid ~/VirtualBox\ VMs/Test VM from template - 1/cent73-template.vdi



2. VirtualBox 콘솔로 다시 넘어가서


폴더 아이콘을 클릭하여 복사해 온 이미지파일(cent73-template.vdi) 선택, 만들기 클릭


3. VM 생성 전 단계에서 네트워크는 네트워크>어댑터 탭>고급>무작위모드>가상머신에 허용(또는 모두 허용)으로 설정


4. 모든 설정이 완료 되었으면 '시작'(전원 켜기) & VM 사용


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


Kubernetes 를 CentOS 7 에서 설치하는 방법을 정리해 둔다. 3개의 VM을 준비하고, Mater 하나와 두 개의 Minion(Slave 또는 worker node, 그냥 노드라고도 한다) 구성의 Custer를 구현하되, 네트워크 백엔드 솔루션(Network Fabric)은 CoreOS 에서 기본 채택하고 있는 Flannel을 사용하여 서로 다른 호스트(Worker node, Minion)의 컨테이너간 터널링을 통한 연결이 가능하게 설정할 것이다(총 4개의 시리즈로, 마지막 포스팅에서는 Kubeadm 을 통해, BGP 라우팅이 가능한 Calico Network를 적용한 Kubernetes 클러스터를 구현해볼 예정이다)


Docker Engine과 함께 Kubernetes 를 설치하는 방법은, 모든 필수 패키지를 수작업으로 개별 설치하거나, Playbook 레시피를 적용하여 Ansible을 통해 자동화된 설치를 진행할 수도 있고 또는 Kubeadm 을 통해 간편하게 설치 및 설정을 할 수도 있다. 여기서는 첫 번 째에 언급한 수작업 설치(v1.5.2 기준, v1.6.x 이전 버전)을 진행해 보고자 한다.




준비 사항

VirtualBox VM 3개를 준비(예를 들어 본 Blog의 다른 포스트 - http://bryan.wiki/282 - 의 방법을 통해 CentOS 7.3 VM 3개를 찍어내 두도록 한다, 또는 VM 3개를 각각 만들고 일일이 ConeOS 7.3을 설치하는 수고로움을 즐겨도 좋다).


* Master: CPU 1, Memory 2GB, IP 10.255.10.180

* Minion 1: CPU 1, Memory 1.2GB, IP 10.255.10.181

* Minion 2: CPU 1, Memory 1.2GB, IP 10.255.10.182



[주의] 클러스터 구성에서 각 서버간의 시간동기화가 중요한 이슈가 될 수 있으므로, 기본적으로 ntp 또는 chrony 를 설정하고 Master 노드 또는 해당 환경 내의 전용 Time Server를 기준으로 설정해야 한다. 본 내용에서는 시간동기화 설정에 따로 다루지 않을 것이므로, 이전 포스팅 중 http://bryan.wiki/273 의 내용 중 일부를 찾아서 참고하기를 권한다.



클러스터 구성


아래의 그림과 유사한 아키텍처의 물리적 구성을 해도 좋고, VirtualBox를 통한 가상화 구성을 해도 좋다. 기본적으로 1개의 물리적 네트워크(인터넷 등 외부와 연결되는 External network)와 2개의 가상 네트워크를 사용하여 Kubernetes(=k8s) 클러스터를 구성하게 된다.





* External Private Network: 10.255.10.0/24 - Master/Minion 서버에서 사용하는 기본 네트워크

* Backend Network(Fabric): 172.31.0.0/16 - Container(Pod)가 사용하는 가상 네트워크(Flannel 을 통한 터널링)

* Service Cluster Network: 10.100.0.0/16 - Cluster 내부 DNS에 의해 IP를 자동 할당/관리하게되는 서비스용 가상 네트워크

* K8s에 의해 최초 생성되는 서비스는 'kubernetes' 이며, 항상 Service Cluster Network의 첫번째 IP(10.100.0.1)가 할당됨

* Cluster 내부 DNS(kube-dns 서비스)에는 Service Cluster Network의 IP 중 임의의 하나를 결정하고 할당(10.100.0.100)



각 노드에서 yum repository 설정, Docker/K8s/etcd/flannel 을 설치



# vi /etc/yum.repos.d/virt7-docker-common-release.repo

[virt7-docker-common-release]

name=virt7-docker-common-release

baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/

gpgcheck=0


# yum -y install --enablerepo=virt7-docker-common-release kubernetes etcd flannel wget git

* Kubernetes 1.5.2 버전(2016/12월 releae)이 설치된다. 아래에 소개 되는 설치/운영 방식은 이후 버전에서는 더 이상 적용되지 않는다.

* [참고] 1.6.0(2017/3월 release) 이후 버전부터는 kubeadm 을 통한 Cluster 설치/설정 운영 방식으로 동작하며, Minion 노드의 kube-proxy는 각 노드에 고루 존재하는 DaemonSet 방식의 Pod로 편재되는 아키텍처로 바뀌었으며 TLS 를 통한 암호화 통신을 기본으로 하는 등 높은 완성도와 안정화를 이루었다.



각 노드에서 Kunernetes 기본 설정


# vi /etc/kubernetes/config

# Comma separated list of nodes running etcd cluster

KUBE_ETCD_SERVERS="--etcd-servers=http://10.255.10.180:2379"


# Logging will be stored in system journal

KUBE_LOGTOSTDERR="--logtostderr=true"


# Journal message level, 0 is debug

KUBE_LOG_LEVEL="--v=0"


# Should this cluster be allowed to run privileged docker containers

KUBE_ALLOW_PRIV="--allow-privileged=false"


# Api-server endpoint used in scheduler and controller-manager

KUBE_MASTER="--master=http://10.255.10.180:8080"



Master 노드에서 etcd, API Server, Controller Manager 설정


[root@kubemaster ~]# vi /etc/etcd/etcd.conf

#[member]

ETCD_NAME=default

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

#[cluster]

ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"


API Server 를 설정하기 위해서는 API 요청시 인증을 처리하기 위한 작업을 진행해야 한다. 웹 브라우저에서 github.com 의 공식 repository를 통해 make-ca-cert.sh 를 열어서 전체 내용을 복사, 작업 디렉토리(~/cacert)에 make-ca-cert.sh 로 저장 후, 30번쨰 라인을 다음과 같이 수정한 후, 지정된 Master와 k8s service 도메인에 대해 인증서를 생성한다.


[root@kubemaster ~]# vi make-ca-cert.sh

...

# /etc/group 에 kube 그룹이 존재함을 확인해 볼 것

cert_group=${CERT_GROUP:-kube}

...

[root@kubemaster ~]# chmod a+x make-ca-cert.sh


[root@kubemaster ~]# bash make-ca-cert.sh "10.255.10.180" "IP:10.255.10.180,IP:10.100.0.1,DNS:kubernetes,DNS:kubernetes.default,DNS:kubernetes.default.svc,DNS:kubernetes.default.svc.cluster.local"


이제 API Server 를 설정한다.


[root@kubemaster ~]# vi /etc/kubernetes/apiserver

# Bind kube API server to this IP

KUBE_API_ADDRESS="--address=0.0.0.0"


# Port that kube api server listens to.

KUBE_API_PORT="--port=8080"


# Port kubelet listen on

#KUBELET_PORT="--kubelet-port=10250"


# Comma separated list of nodes in the etcd cluster

KUBE_ETCD_SERVERS="--etcd-servers=http://10.255.10.180:2379"


# Address range to use for services(Work unit of Kubernetes)

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.100.0.0/16"


# default admission control policies

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"


# Add your own!

KUBE_API_ARGS="--client-ca-file=/srv/kubernetes/ca.crt --tls-cert-file=/srv/kubernetes/server.cert --tls-private-key-file=/srv/kubernetes/server.key"


Controller Manager 를 설정한다.


[root@kubemaster ~]# vi /etc/kubernetes/controller-manager

# Comma separated list of minions

KUBELET_ADDRESSES="--machines=10.255.10.181, 10.255.10.182"


# Add your own!

KUBE_CONTROLLER_MANAGER_ARGS="--root-ca-file=/srv/kubernetes/ca.crt --service-account-private-key-file=/srv/kubernetes/server.key"



각 Minion 노드에서 kubelet을 설정


[root@kubenode1 ~]# vi /etc/kubernetes/kubelet 

###

# kubernetes kubelet (minion) config


# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)

KUBELET_ADDRESS="--address=0.0.0.0"


# The port for the info server to serve on

#KUBELET_PORT="--port=10250"


# You may leave this blank to use the actual hostname

KUBELET_HOSTNAME="--hostname-override=10.255.10.181"


# location of the api-server

KUBELET_API_SERVER="--api-servers=http://10.255.10.180:8080"


# pod infrastructure container

#KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"


# Add your own!

KUBELET_ARGS="--cluster-dns=10.100.0.100 --cluster-domain=cluster.local"


[root@kubenode2 ~]# vi /etc/kubernetes/kubelet 

###

# kubernetes kubelet (minion) config


# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)

KUBELET_ADDRESS="--address=0.0.0.0"


# The port for the info server to serve on

#KUBELET_PORT="--port=10250"


# You may leave this blank to use the actual hostname

KUBELET_HOSTNAME="--hostname-override=10.255.10.182"


# location of the api-server

KUBELET_API_SERVER="--api-servers=http://10.255.10.180:8080"


# pod infrastructure container

#KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"


# Add your own!

KUBELET_ARGS="--cluster-dns=10.100.0.100 --cluster-domain=cluster.local"



컨테이너(Pod) 간 백엔드 네트워크를 위한 Flannel 설정


Master 노드에서 etcd 를 시작한다


[root@kubemaster ~]# systemctl enable etcd

[root@kubemaster ~]# systemctl start etcd



etcd 내에 flannel 을 위한 네트워크 정보 저장 공간을 위한 Key를 생성하고, 네트워크 설정 값을 등록한다. 다음과 같이 등록하면, /16 네트워크에 대한 /24 크기의 Flannel 서브넷이 각 Minion에 자동 할당된다


[root@kubemaster ~]# etcdctl mkdir /kube-centos/network

[root@kubemaster ~]# etcdctl mk /kube-centos/network/config "{ \"Network\": \"172.31.0.0/16\", \"SubnetLen\": 24, \"Backend\": { \"Type\": \"vxlan\" } }"



이제 모든 노드에서 다음과 같이 Flannel 에 대한 설정을 진행한다


# vi /etc/sysconfig/flanneld

# etcd URL location.  Point this to the server where etcd runs

FLANNEL_ETCD_ENDPOINTS="http://10.255.10.180:2379"


# etcd config key.  This is the configuration key that flannel queries

# For address range assignment

FLANNEL_ETCD_PREFIX="/kube-centos/network"


# Any additional options that you want to pass

#FLANNEL_OPTIONS=""



Master와 Minion 에서 firewall을 설정하고 각각 서비스를 enable한 후, 기동

(최초 설치를 시작할 때, 노드에 firewalld 패키지를 설치하지 않았다면 아래 방화벽 설정 부분은 무시해도 되며, 여기서는 Master/etcd node 에 대해서만 방화벽을 설정해 보도록 한다. Port 허용 정보는 -> 참고)


[root@kubemaster ~]# systemctl enable firewalld

[root@kubemaster ~]# systemctl start firewalld

[root@kubemaster ~]# firewall-cmd --permanent --zone=public --add-port=443/tcp

[root@kubemaster ~]# firewall-cmd --permanent --zone=public --add-port=6443/tcp

[root@kubemaster ~]# firewall-cmd --permanent --zone=public --add-port=8080/tcp

[root@kubemaster ~]# firewall-cmd --permanent --zone=public --add-port=8285/udp

[root@kubemaster ~]# firewall-cmd --permanent --zone=public --add-port=8472/udp

[root@kubemaster ~]# firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp

[root@kubemaster ~]# firewall-cmd --reload


[root@kubemaster ~]# systemctl enable flanneld

[root@kubemaster ~]# systemctl start flanneld

[root@kubemaster ~]# systemctl enable kube-controller-manager

[root@kubemaster ~]# systemctl start kube-controller-manager

[root@kubemaster ~]# systemctl enable kube-scheduler

[root@kubemaster ~]# systemctl start kube-scheduler

[root@kubemaster ~]# systemctl enable kube-apiserver

[root@kubemaster ~]# systemctl start kube-apiserver


[root@kubenode1 ~]# systemctl disable firewalld

[root@kubenode1 ~]# systemctl stop firewalld


[root@kubenode1 ~]# systemctl enable flanneld

[root@kubenode1 ~]# systemctl start flanneld

[root@kubenode1 ~]# systemctl enable docker

[root@kubenode1 ~]# systemctl start docker

[root@kubenode1 ~]# systemctl enable kubelet

[root@kubenode1 ~]# systemctl start kubelet

[root@kubenode1 ~]# systemctl enable kube-proxy

[root@kubenode1 ~]# systemctl start kube-proxy



각 노드에서 /24 크기의 Flannel 서브넷의 첫 번째 IP가 docker0에 할당되어 있는지 확인해 본다


[root@kubenode02 ~]# ifconfig

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450

        inet 172.31.83.1  netmask 255.255.255.0  broadcast 0.0.0.0

        inet6 fe80::42:80ff:fe4a:e1d6  prefixlen 64  scopeid 0x20<link>

        ether 02:42:80:4a:e1:d6  txqueuelen 0  (Ethernet)

        RX packets 236  bytes 20760 (20.2 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 115  bytes 8656 (8.4 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

...

flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450

        inet 172.31.83.0  netmask 255.255.255.255  broadcast 0.0.0.0

        ether d2:bd:7a:e9:cd:e4  txqueuelen 0  (Ethernet)

        RX packets 108  bytes 7310 (7.1 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 80  bytes 10160 (9.9 KiB)

        TX errors 0  dropped 1 overruns 0  carrier 0  collisions 0



현재까지의 설정이 끝나면, Master 노드에서는 kube-apiserver, etcd, kube-controller-manager, kube-scheduler, flanneld 가 정상 가동 되고 있어야 하며,

Minion 노드에서는 kube-proxy, kubelet, flanneld, docker 가 정상 가동 되고 있어야 한다(systemctl status ~ 로 확인 또는 마지막 부분의 kube-check~ 스크립트를 작성하고 실행).



클러스터의 현재 상태를 확인해 보자


[root@kubemaster ~]# kubectl get nodes

NAME            STATUS    AGE

10.255.10.181   Ready     3m

10.255.10.182   Ready     3m

[root@kubemaster ~]# kubectl cluster-info

Kubernetes master is running at http://localhost:8080


To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.



k8s Addon 의 설치와 설정


kube-dns 서비스(Cluster 내부 DNS) 의 설정으로 서비스 discovery를 가능하게 해 보자. Master 노드에서 다음과 같이 kube-dns ReplicationController와 Service를 기동한다


# mkdir k8s-addon && cd k8s-addon

# git clone https://github.com/DragOnMe/kubernetes-mod-skydns-dashboard-mon.git

# cd kubernetes-mod-skydns-dashboard-mon

# kubectl create -f DNS/skydns-rc.yaml

# vi DNS/skydns-svc.yaml

...

   clusterIP: 10.100.0.100

...

# kubectl create -f DNS/skydns-svc.yaml


각 Minion 노드의 kubelet 서비스를 재시작해 준다


# systemctl restart kubelet


kube-system 네임스페이스에 kube-dns 서비스가 작동중인지 확인해 보자


[root@kubemaster ~]# kubectl get svc --all-namespaces

NAMESPACE     NAME         CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE

default       kubernetes   10.100.0.1     <none>        443/TCP         44m

kube-system   kube-dns     10.100.0.100   <none>        53/UDP,53/TCP   46s



필수적인 것은 아니지만, k8s 클러스터의 상태 모니터링 등을 위해 도움이 되는 dashboard Addon을 설치해 보자


[root@kubemaster kubernetes-mod-skydns-dashboard-mon]# kubectl create -f Dashboard/dashboard-controller.yaml

deployment "kubernetes-dashboard" created

[root@kubemaster kubernetes-mod-skydns-dashboard-mon]# kubectl create -f Dashboard/dashboard-service.yaml

service "kubernetes-dashboard" created


dashboard 서비스의 접속은 http://10.255.10.180:8080/ui 로 접속해 보면 된다.




Heapster와 Grafana, InfluxDB를 이용한 dashboard 상의 monitoring Addon(Arun Dhyani 님 제공) 을 설치해 보자


[root@kubemaster kubernetes-mod-skydns-dashboard-mon]# kubectl create -f cluster-monitoring/influxdb

service "monitoring-grafana" created

deployment "heapster-v1.2.0" created

service "heapster" created

replicationcontroller "monitoring-influxdb-grafana-v4" created

service "monitoring-influxdb" created


Google의 gcr.io 로부터 heapster 구동에 필요한 컨테이너의 Pull & Deploy 가 진행중이다


Heapster와 influxdb, grafana 의 설치가 완료되면 대쉬보드에서 그래프와 차트가 나타남을 확인할 수 있다



부팅/종료 및 데몬 서비스 기동 순서 & Sample Script


클러스터 운영/관리 단계에서 Master 노드와 Worker 노드를 종료, 기동하는 순서와, 각 데몬 서비스를 종료하고 시작하는 순서가 중요하다. 반드시 다음의 순서를 지켜 주어야 한다


* Kubernetes 클러스터 부팅시: Master 를 먼저 시작하고 데몬 서비스 로딩이 완료되면 Worker 노드를 차례로 시작하고 데몬 서비스 로딩 확인

  Kubernetes 클러스터 종료시: Worker 노드를 먼저 종료하고 마지막에 Master 노드를 종료


* 노드 내의 데몬 서비스 기동 순서(종료는 기동 순서의 역순)

  - Master 노드: etcd > flanneld > kube-controller-manager > kube-scheduler > kube-apiserver

  - Worker 노드: flanneld > docker > kubelet > kube-proxy



* Master 노드 관리 Script

[root@kubemaster ~]# cat kube-check-master.sh 

#!/bin/bash
for SERVICES in etcd flanneld kube-apiserver kube-controller-manager kube-scheduler;
    do echo --- $SERVICES --- ;
    systemctl is-active $SERVICES ;
    systemctl is-enabled $SERVICES ;
    echo "";  
done


[root@kubemaster ~]# cat kube-start-master.sh 

#!/bin/bash
for SERVICES in etcd flanneld kube-controller-manager kube-scheduler kube-apiserver ;
    do echo --- Starting $SERVICES --- ;
    systemctl start $SERVICES ;
    echo "Done";  
    echo "";  
done


[root@kubemaster ~]# cat kube-stop-master.sh 

#!/bin/bash
for SERVICES in kube-apiserver kube-scheduler kube-controller-manager flanneld etcd ;
    do echo --- Stopping $SERVICES --- ;
    systemctl stop $SERVICES ;
    echo "Done";  
    echo "";  
done


* Worker 노드 관리 Script

[root@kubenode01 ~]# cat kube-check-node.sh 

#!/bin/bash
for SERVICES in docker flanneld kubelet kube-proxy;
    do echo --- $SERVICES --- ;
    systemctl is-active $SERVICES ;
    systemctl is-enabled $SERVICES ;
    echo "";  
done


[root@kubenode01 ~]# cat kube-start-node.sh 

#!/bin/bash
for SERVICES in flanneld docker kubelet kube-proxy ;
    do echo --- Starting $SERVICES --- ;
    systemctl start $SERVICES ;
    echo "Done";  
    echo "";  
done


[root@kubenode01 ~]# cat kube-stop-node.sh 

#!/bin/bash
for SERVICES in kube-proxy kubelet docker flanneld;
    do echo --- Stopping $SERVICES --- ;
    systemctl stop $SERVICES ;
    echo "Done";  
    echo "";  
done



- Barracuda -


[관련 글 목록]

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] CentOS 7.3 으로 Kubernetes Cluster 구성(with Flannel)-1/4

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] CentOS 7.3 으로 Kubernetes Cluster 구성(노드 추가하기)-2/4

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] 1.7.3/1.7.4, kubeadm 으로 L3 네트워크 기반 Cluster 구성(with Calico CNI)-3/4

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] Hyper-converged GlusterFs integration with Heketi -4/4

[Technical/Cloud, 가상화, PaaS] - [GlusterFS & Kubernetes] External Gluster PV with Heketi CLI/Rest API



저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


Open vSwitch는 SDN을 구현하는 대표적 오픈소스 기술 중의 하나이다. Open vSwitch는 분산된 노드들간의 가상 터널을 구현하는 3가지 방법(GRE, VxLAN, IPSec)을 모두 지원하는데, 본 편은 다음에 이어질 포스팅에서 다룰 VxLAN에 대한 사전 준비 과정에 해당한다고 할 수 있다. 대상 OS는 CentOS 7.x 로 하고, Open vSwitch 를 설치하는 방법은 크게 3가지 정도를 생각해 볼 수 있겠다. 소스를 빌드하거나 RPM 빌드 또는 레드햇의 Epel 레포지터리를 통해 yum 으로 설치하는 방법이 있다. 여기서는 뒤의 2가지를 다뤄두도록 한다(자세한 설명은 생략하고 필수적으로 수행되는 script 위주로 note 함).


이미지 출처: openvswitch.org


RPM 빌드를 통한 설치


* 다운로드 주소는 openvswitch.org의 LTS(Long Term Service) series 에 해당하는 2.5.x 을 찾아서 주소를 복사해 오면 된다

# yum clean all

# yum update -y

# yum -y install wget bridge-utils openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel

# adduser ovs

# su - ovs

ovs ~$ mkdir -p rpmbuild/SOURCES

ovs ~$ cd rpmbuild/SOURCES/

ovs ~$ wget http://openvswitch.org/releases/openvswitch-2.5.2.tar.gz

ovs ~$ tar xvzf openvswitch-2.5.2.tar.gz 

ovs ~$ rpmbuild -bb --nocheck openvswitch-2.5.2/rhel/openvswitch-fedora.spec

ovs ~$ exit

# yum localinstall /home/ovs/rpmbuild/RPMS/x86_64/openvswitch-2.5.2-1.el7.centos.x86_64.rpm -y

# systemctl start openvswitch

# systemctl enable openvswitch

# ovs-vsctl -V

ovs-vsctl (Open vSwitch) 2.5.2

Compiled May 31 2017 22:33:26

DB Schema 7.12.1



EPEL 을 통한 yum 설치


* EPEL(Extra Packages of Enterprise Linux): 레드햇에서 제공하는 별도의 패키지 저장소(주로 레드햇 계열인 RHEL, CentOS, Fedora 용도)

# yum install -y epel-release https://www.rdoproject.org/repos/rdo-release.rpm

# yum install -y openvswitch bridge-utils

# yum update -y

# systemctl start openvswitch

# systemctl enable openvswitch



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


Openstack Mitaka 최종본(v6) 설치 및 설정 종합본



본 편의 도입 및 준비 부분은, 위의 지난 2016년 9월에 #1 편에서 다뤘던 Mitaka v5 버전 내용을 그 근간으로 한다. Mitaka v5 는 지난 2016년 6월에 출시된 이후 거의 몇 일 ~ 몇 주 단위로 활발하게 수정 변경되어 11월 9일에 최종 버전인 v6 가 릴리즈되어 있다. 참고로 CentOS 계열(Redhat, CentOS, Fedora)을 위한 디플로이 도구인 Packstack 의 Mitaka 를 위한 버전은 다음 그림에서 보다시피 v5, v6 만 존재하고 있다.



지난 9월의 계획에서는 2016년 10월 릴리즈 예정이었던 Newton 버전을 설치하고 검증하는 과정을 다루려고 했으나, 릴리즈 직후에 한 번 시험삼아 설치해 보니 지나치게 불안정한 면이 커서, 현 시점의 안정적인 Mitaka 최종 버전을 따로 정리해 두는 편이 나을 듯 하여 급하게 본 포스팅을 구성해 보려 한다.


  • 설치 준비 과정 이후의 상세 내용


전 편의 1~5 섹션까지 내용은 그대로 사용하는 것으로 하고, 이후의 섹션 6부터 전 편의 보충 형식으로 써내려 간다. 결론적으로는, 오픈스택 Mitaka 버전을 설치, 설정하기 위해서는 지난 #1편(1~5섹션)과 본 #2편(6섹션 이후)를 연이어서 참고하면 되지 않을까 하는 생각이다.



6. 오픈스택 설치를 위한 각 노드들의 패키지 설정


  • 각 노드의 리포지토리를 변경하고 필수 패키지 설정


이미 위에서 언급했다시피, 다수의 의존성 패키지를 따로 설치하지 않고 yum update -y 를 통해 최신 패키지 업데이트를 진행한 다음 Openstack v6 를 따로 다운로드 설치하는 과정을 아래에 써내려 간다. 역시 Mitaka의 최종 버전이니만큼 비교적 안정적이고 오류 없이 잘 진행됨을 확인하였다(9월버전 v5에서 오류가 발생하였던 lbaas 포함 설치도 v6에서는 오류 없이 잘 진행됨).


# yum update -y

# yum install -y net-tools

# yum install -y wget


  • 각 노드의 /etc/hosts 파일에 다음의 3개 라인을 추가

10.10.10.6 openstack-ctrl

10.10.10.7 openstack-net

10.10.10.8 openstack-cmp1


  • 마찬가지로 각 3개 노드에서 보안 등 각종 관리패키지를 오픈스택 설치가 가능해 지도록 구성

# systemctl disable firewalld

# systemctl stop firewalld

# systemctl disable NetworkManager

# systemctl stop NetworkManager

# yum remove -y NetworkManager

# systemctl enable network

# systemctl start network



7. Packstack 으로 Openstack 자동 설치하기

Packstack은 Controller 노드에서 answer 파일을 읽어 들여서 자신을 포함하여 하위 노드(Network 노드, Compute 노드들)에서 각종 소프트웨어들을 설치/설정하는 스크립트를 단계적으로 실행해 주는 역할을 한다(Redhat 제공 RDO 프로젝트 참고: www.rdoproject.org). 이를 위해 각 하위 노드에 암호 없이 접속이 가능해야 한다. 


  • Controller 노드에서 각 노드로 Passwordless ssh 설정

[root@openstack-ctrl ~]# ssh-keygen 

[root@openstack-ctrl ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.7

[root@openstack-ctrl ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.8


#--> 암호 없이 정상적으로 접속되는지 확인

[root@openstack-ctrl ~]# ssh openstack-net

[root@openstack-ctrl ~]# ssh openstack-cmp1


  • Packstack repo 설정 및 설치 시작
이전에 진행했던 방식으로 다음과 같이 rdo-release.rpm 을 다운로드하고 설치하면, 현재 시점의 가장 최근 버전인 newton 버전이 설치되어 버리므로,

[root@openstack-ctrl ~]# yum install -y https://www.rdoproject.org/repos/rdo-release.rpm

[root@openstack-ctrl ~]# yum install -y openstack-packstack

...


특정 버전의 Openstack을 명시적으로 다운로드 & 설치하기 위해서는 https://repos.fedorapeople.org/repos/openstack/ 에서 해당 버전을 찾아서 설치하는 과정을 밟아 가면 된다. 여기서는 생성된 answer.txt 파일 항목 중 특별히 편집 수정해야 하는 부분을 표시하여 간략한 설명을 달아 두도록 한다.

[root@openstack-ctrl ~]# yum install -y https://repos.fedorapeople.org/repos/openstack/openstack-mitaka/rdo-release-mitaka-6.noarch.rpm

[root@openstack-ctrl ~]# yum update -y

[root@openstack-ctrl ~]# yum install -y openstack-packstack

[root@openstack-ctrl ~]# su - stack

[stack@openstack-ctrl ~]# sudo packstack --gen-answer-file=answer.txt

[stack@openstack-ctrl ~]# sudo vi answer.txt

[general]

...

# 개별 항목에 자동 적용 되는 공통 암호

CONFIG_DEFAULT_PASSWORD=openstack


# 여기서는 사용하지 않음

CONFIG_MANILA_INSTALL=n


# 여기서는 사용하지 않음

CONFIG_SWIFT_INSTALL=n


# 미터링 패키지 설치

CONFIG_CEILOMETER_INSTALL=y


# 여기서는 사용하지 않음

CONFIG_AODH_INSTALL=n


# 여기서는 사용하지 않음

CONFIG_GNOCCHI_INSTALL=n


# 여기서는 사용하지 않음

CONFIG_SAHARA_INSTALL=n


# 오케스트레이션을 위한 패키지 설치

CONFIG_HEAT_INSTALL=y


# 여기서는 사용하지 않음

CONFIG_IRONIC_INSTALL=n


# ntp 시간동기화는 수동 설치 및 설정

CONFIG_NTP_SERVERS=


# 여기서는 사용하지 않음

CONFIG_NAGIOS_INSTALL=n


# API 서비스 패키지 등이 설치되는 Controller 노드

CONFIG_CONTROLLER_HOST=10.10.10.6


# Compute 서비스 패키지들이 설치되는 노드

CONFIG_COMPUTE_HOSTS=10.10.10.8


# Compute networking (nova network) 또는 OpenStack Networking (neutron) 이 설치 되는 Network 노드

CONFIG_NETWORK_HOSTS=10.10.10.7


# AMQP 서비스 설치 노드(여기서는 Controller 노드)

CONFIG_AMQP_HOST=10.10.10.6


# 기본 DB인 MariaDB 설치 노드(여기서는 Controller 노드)

CONFIG_MARIADB_HOST=10.10.10.6


# MariaDB 관리자 계정 암호

CONFIG_MARIADB_PW=openstack


# Keystone DB 암호

CONFIG_KEYSTONE_DB_PW=openstack


# Identity 서비스 admin 계정 암호

CONFIG_KEYSTONE_ADMIN_PW=openstack


# Identity service demo 계정 암호

CONFIG_KEYSTONE_DEMO_PW=openstack


# Glance DB 암호

CONFIG_GLANCE_DB_PW=openstack


# Glance Identity service 암호

CONFIG_GLANCE_KS_PW=openstack


# Nova DB 암호

CONFIG_NOVA_DB_PW=openstack


# Nova Identity service 암호

CONFIG_NOVA_KS_PW=openstack


# Neutron Identity service 암호

CONFIG_NEUTRON_KS_PW=openstack


# Neutron DB 암호

CONFIG_NEUTRON_DB_PW=openstack


# Neutron L3 의 External OVS bridge 지정(비워 두면 default로 linuxbridge)

CONFIG_NEUTRON_L3_EXT_BRIDGE=br-ex


# OpenStack Networking metadata agent 암호.

CONFIG_NEUTRON_METADATA_PW=openstack


# OpenStack Networking's Load-Balancing-as-a-Service (LBaaS) 설치 여부

CONFIG_LBAAS_INSTALL=y


# OpenStack Networking's L3 Metering agent 설치 여부

CONFIG_NEUTRON_METERING_AGENT_INSTALL=y


# neutron.ml2.type_drivers 로 사용할 드라이버 지정. comma 로 구분 ['local','flat', 'vlan', 'gre', 'vxlan']

CONFIG_NEUTRON_ML2_TYPE_DRIVERS=vxlan


# Tenant network로 사용할 network type을 순서대로 지정. comma 로 구분 ['local', 'vlan', 'gre', 'vxlan']

CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES=vxlan


# neutron.ml2.mechanism_drivers 로 로딩할 메커니즘 드라이버 지정. comma 로 구분

# ['logger', 'test', 'linuxbridge', 'openvswitch', 'hyperv', 'ncs', 'arista', 'cisco_nexus', 'mlnx', 'l2population', 'sriovnicswitch']

CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS=openvswitch


# OpenStack Networking으로 사용할 L2 agent 지정 ['linuxbridge', 'openvswitch']

CONFIG_NEUTRON_L2_AGENT=openvswitch


# HEAT DB 암호

CONFIG_HEAT_DB_PW=openstack


# HEAT Identity service 암호

CONFIG_HEAT_KS_PW=openstack


# HEAT Identity domain 관리자 암호

CONFIG_HEAT_DOMAIN_PASSWORD=openstack


# Provisioning 테스트를 위한 demo 설치 여부

CONFIG_PROVISION_DEMO=y


# Ceilometer Identity service 암호

CONFIG_CEILOMETER_KS_PW=openstack


# MongoDB 설치 서버(여기서는 Controller 노드)

CONFIG_MONGODB_HOST=10.10.10.6


# Redis master server

CONFIG_REDIS_MASTER_HOST=10.10.10.6


[stack@openstack-ctrl ~]# sudo packstack --answer-file=answer.txt

Welcome to the Packstack setup utility


The installation log file is available at: /var/tmp/packstack/20161209-052810-KZtyhp/openstack-setup.log


Installing:

Clean Up                                             [ DONE ]

Discovering ip protocol version                      [ DONE ]

root@10.10.10.6's password: 

Setting up ssh keys                                  [ DONE ]

Preparing servers                                    [ DONE ]

Pre installing Puppet and discovering hosts' details [ DONE ]

Adding pre install manifest entries                  [ DONE ]

Setting up CACERT                                    [ DONE ]

Adding AMQP manifest entries                         [ DONE ]

Adding MariaDB manifest entries                      [ DONE ]

Adding Apache manifest entries                       [ DONE ]

Fixing Keystone LDAP config parameters to be undef if empty[ DONE ]

Adding Keystone manifest entries                     [ DONE ]

Adding Glance Keystone manifest entries              [ DONE ]

Adding Glance manifest entries                       [ DONE ]

Adding Nova API manifest entries                     [ DONE ]

Adding Nova Keystone manifest entries                [ DONE ]

Adding Nova Cert manifest entries                    [ DONE ]

Adding Nova Conductor manifest entries               [ DONE ]

Creating ssh keys for Nova migration                 [ DONE ]

Gathering ssh host keys for Nova migration           [ DONE ]

Adding Nova Compute manifest entries                 [ DONE ]

Adding Nova Scheduler manifest entries               [ DONE ]

Adding Nova VNC Proxy manifest entries               [ DONE ]

Adding OpenStack Network-related Nova manifest entries[ DONE ]

Adding Nova Common manifest entries                  [ DONE ]

Adding Neutron VPNaaS Agent manifest entries         [ DONE ]

Adding Neutron FWaaS Agent manifest entries          [ DONE ]

Adding Neutron LBaaS Agent manifest entries          [ DONE ]

Adding Neutron API manifest entries                  [ DONE ]

Adding Neutron Keystone manifest entries             [ DONE ]

Adding Neutron L3 manifest entries                   [ DONE ]

Adding Neutron L2 Agent manifest entries             [ DONE ]

Adding Neutron DHCP Agent manifest entries           [ DONE ]

Adding Neutron Metering Agent manifest entries       [ DONE ]

Adding Neutron Metadata Agent manifest entries       [ DONE ]

Adding Neutron SR-IOV Switch Agent manifest entries  [ DONE ]

Checking if NetworkManager is enabled and running    [ DONE ]

Adding OpenStack Client manifest entries             [ DONE ]

Adding Horizon manifest entries                      [ DONE ]

Adding Heat manifest entries                         [ DONE ]

Adding Provisioning manifest entries                 [ DONE ]

Adding Provisioning Glance manifest entries          [ DONE ]

Adding Provisioning Demo bridge manifest entries     [ DONE ]

Adding MongoDB manifest entries                      [ DONE ]

Adding Redis manifest entries                        [ DONE ]

Adding Ceilometer manifest entries                   [ DONE ]

Adding Ceilometer Keystone manifest entries          [ DONE ]

Copying Puppet modules and manifests                 [ DONE ]

Applying 10.10.10.8_prescript.pp

Applying 10.10.10.7_prescript.pp

Applying 10.10.10.6_prescript.pp

10.10.10.7_prescript.pp:                             [ DONE ]      

10.10.10.8_prescript.pp:                             [ DONE ]      

10.10.10.6_prescript.pp:                             [ DONE ]      

Applying 10.10.10.6_amqp.pp

Applying 10.10.10.6_mariadb.pp

10.10.10.6_amqp.pp:                                  [ DONE ]    

10.10.10.6_mariadb.pp:                               [ DONE ]    

Applying 10.10.10.6_apache.pp

10.10.10.6_apache.pp:                                [ DONE ]   

Applying 10.10.10.6_keystone.pp

Applying 10.10.10.6_glance.pp

10.10.10.6_keystone.pp:                              [ DONE ]     

10.10.10.6_glance.pp:                                [ DONE ]     

Applying 10.10.10.6_api_nova.pp

10.10.10.6_api_nova.pp:                              [ DONE ]     

Applying 10.10.10.6_nova.pp

Applying 10.10.10.8_nova.pp

Applying 10.10.10.7_neutron.pp

10.10.10.6_nova.pp:                                  [ DONE ]    

10.10.10.7_neutron.pp:                               [ DONE ]    

10.10.10.8_nova.pp:                                  [ DONE ]    

Applying 10.10.10.8_neutron.pp

Applying 10.10.10.6_neutron.pp

10.10.10.8_neutron.pp:                               [ DONE ]    

10.10.10.6_neutron.pp:                               [ DONE ]    

Applying 10.10.10.6_osclient.pp

Applying 10.10.10.6_horizon.pp

10.10.10.6_osclient.pp:                              [ DONE ]     

10.10.10.6_horizon.pp:                               [ DONE ]     

Applying 10.10.10.6_heat.pp

10.10.10.6_heat.pp:                                  [ DONE ] 

Applying 10.10.10.6_provision.pp

Applying 10.10.10.6_provision_glance

10.10.10.6_provision.pp:                             [ DONE ]          

10.10.10.6_provision_glance:                         [ DONE ]          

Applying 10.10.10.7_provision_bridge.pp

10.10.10.7_provision_bridge.pp:                      [ DONE ]             

Applying 10.10.10.6_mongodb.pp

Applying 10.10.10.6_redis.pp

10.10.10.6_mongodb.pp:                               [ DONE ]    

10.10.10.6_redis.pp:                                 [ DONE ]    

Applying 10.10.10.6_ceilometer.pp

10.10.10.6_ceilometer.pp:                            [ DONE ]       

Applying Puppet manifests                            [ DONE ]

Finalizing                                           [ DONE ]


 **** Installation completed successfully ******


Additional information:

 * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.

 * File /root/keystonerc_admin has been created on OpenStack client host 10.10.10.6. To use the command line tools you need to source the file.

 * To access the OpenStack Dashboard browse to http://10.10.10.6/dashboard .

Please, find your login credentials stored in the keystonerc_admin in your home directory.

 * Because of the kernel update the host 10.10.10.8 requires reboot.

 * Because of the kernel update the host 10.10.10.7 requires reboot.

 * Because of the kernel update the host 10.10.10.6 requires reboot.

 * The installation log file is available at: /var/tmp/packstack/20161209-052810-KZtyhp/openstack-setup.log

 * The generated manifests are available at: /var/tmp/packstack/20161209-052810-KZtyhp/manifests



8. Network 노드 - Neutron 네트워크(OVS bridge) 인터페이스 설정 확인


#1 편에서 수동으로 설정해 주어야 했던 Network 노드의 외부 bridge 인터페이스(br-ex)와 enp0s9 의 브리지 포트 연결이, Mitaka v6에서는 자동으로 이루어짐을 볼 수 있다. 다음의 결과를 확인해 보자 


  • Network 노드 브리지 인터페이스 설정 확인

[root@openstack-net ~]# ifconfig

br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.0.7  netmask 255.255.255.0  broadcast 192.168.0.255

        inet6 fe80::8464:32ff:fe27:304f  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:bd:a3:bd  txqueuelen 0  (Ethernet)

        RX packets 138  bytes 21542 (21.0 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 59  bytes 6843 (6.6 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


enp0s9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::a00:27ff:febd:a3bd  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:bd:a3:bd  txqueuelen 1000  (Ethernet)

        RX packets 412  bytes 84303 (82.3 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 71  bytes 9555 (9.3 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


...



이제 ifcfg-br-ex, ifcfg-enp0s9 인터페이스도 확인해 보자

[root@openstack-net ~]# cat /etc/sysconfig/network-scripts/ifcfg-br-ex

DEVICE=br-ex

DEVICETYPE=ovs

TYPE=OVSBridge

BOOTPROTO=static

IPADDR=192.168.0.7

NETMASK=255.255.255.0

BROADCAST=192.168.0.255

GATEWAY=192.168.0.1

DEFROUTE=yes

ONBOOT=yes

NM_CONTROLLED=no

IPV4_FAILURE_FATAL=yes

IPV6INIT=no


[root@openstack-net ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s9

DEVICE=enp0s9

DEVICETYPE=ovs

TYPE=OVSPort

OVS_BRIDGE=br-ex

ONBOOT=yes

NM_CONTROLLED=no

IPV6INIT=no



[root@openstack-net ~]# ovs-vsctl show

fd89eff3-c539-4250-8922-854f550124bc

    Bridge br-ex

        Port br-ex

            Interface br-ex

                type: internal

        Port "qg-05c23c0b-11"

            Interface "qg-05c23c0b-11"

                type: internal

        Port "enp0s9"

            Interface "enp0s9"

    Bridge br-int

        fail_mode: secure

        Port patch-tun

            Interface patch-tun

                type: patch

                options: {peer=patch-int}

        Port "qr-02fc6bc6-04"

            tag: 1

            Interface "qr-02fc6bc6-04"

                type: internal

        Port br-int

            Interface br-int

                type: internal

        Port "tap44e6cf82-31"

            tag: 1

            Interface "tap44e6cf82-31"

                type: internal

    Bridge br-tun

        fail_mode: secure

        Port "vxlan-0a0a0a08"

            Interface "vxlan-0a0a0a08"

                type: vxlan

                options: {df_default="true", in_key=flow, local_ip="10.10.10.7", out_key=flow, remote_ip="10.10.10.8"}

        Port patch-int

            Interface patch-int

                type: patch

                options: {peer=patch-tun}

        Port br-tun

            Interface br-tun

                type: internal

    ovs_version: "2.5.0"

Open vSwitch 의 브리지 인터페이스를 조회해 보면, br-ex 브리지에 br-ex 포트와 enp0s9 포트가 연결되어 있음을 볼 수 있다.



Controller 노드의 환경변수 설정 스크립트 복사


  • Network 노드, Compute 노드에서 CLI 명령 실행이 필요할 경우에 대비하여 스크립트 복사


Controller 노드의 keystonerc 관련 파일들을 다음과 같이 Network 노드, Compute 노드에 복사해 둔다


[root@openstack-ctrl ~]# scp keystonerc_* root@openstack-net:~

[root@openstack-ctrl ~]# scp keystonerc_* root@openstack-cmp1:~



9. Horizon 웹을 통해 Cloud 플랫폼 사용 준비 과정


  • Horizon 웹 UI 사용 준비 - 클라우드 네트워크 설정


시스템 구성도의 Admin VM에 해당하는 VM에서, firefox 웹브라우저를 통해 http://10.10.10.6으로 접속, admin 계정과 answer.txt 에서 지정한 암호를 통해 로그인


tenant 서비스를 위해서 demo 프로젝트를 사용한다고 가정했을 때,  해당 프로젝트에서 사용할 네트워크를 생성, 설정하는 과정을 다음과 같이 진행한다.


System->Routers 페인, 라우터 목록에서 router1 삭제 


System->Networks 페인, 사용하지 않는 네트워크(public_subnet) 을 삭제



networks 패널에서, '+Create Network' 을 선택하고 admin 프로젝트에 대해 public 네트워크를 새로이 생성(본 케이스에서는 vxlan 방식, shared - External network).



Subnet Detail 에서는, 네트워크 내부에 DHCP 서버(iptime 공유기)가 존재하므로, Enable DHCP 는 해제하고, 할당 가능한 IP 범위를 입력


admin 계정을 로그아웃하고, tenant 서비스를 설정/사용하기 위한 demo 계정으로 로그인


앞에서 admin 을 통해 생성, 설정한 네트워크를 사용하기 위해, 왼쪽 메뉴에서 Project->Network->Router 패널을 선택하고 '+Create Router' 을 클릭하여 demo 프로젝트에서 사용할 라우터를 생성. External Network 항목에 대해, 앞서 생성했던 public 네트워크를 선택





'+Add Interface' 클릭을 통해, 앞서 생성한 사설 네트워크와의 연결을 위한 인터페이스를 추가



좌측 메뉴의 Network 패널에서 Network Topology 를 선택하여 현재 구성된 네트워크의 구조를 확인한다. 여기까지 성공적으로 진행하였다면 클라우드 환경을 본격적으로 사용하기 위한 전체 설정 과정은 완료한 것이며, 다음의 필수 준비과정 몇 가지를 거치면 모든 준비가 끝나고 VM을 생성, 관리할 수 있는 요건을 갖추게 되었다.


11. VM 인스턴스 생성 관리를 위한 준비 & 실행 단계


  • security Group 생성 확인

 Compute->Access & Security->Security Group


시스템에 디폴트로 적용되는 Security Group 이 이미 생성되어 있다. 필요시 별도로 생성하여 사용하면 됨.


  • Key Pair 생성



Compute->Access & Security->Key Pairs->Create Key Pair, pem 파일 다운로드 및 보관



  • Floating IP 생성



Floating IP를 할당 필요한 갯수만큼 할당 받는다



  • VM Image 확인


Openstack 에 포함된 테스트용 초소형 OS image(12MB) 외에도, Ubuntu Cloud image 사이트나 CentOS cloud image 사이트 등에서 다운로드 받아 두고, Openstack image로 업로드(admin 계정으로)해서 사용할 수 있다


  • VM instance 생성








  • Ubuntu VM instance 생성하고 접속하기

별도의 전용 Security Group 을 생성해 둔다


Ubuntu VM을 만들기 위한 Flavor 템플릿을 생성해 둔다(admin 계정)








새로이 Ubuntu VM Instance 를 생성하고, 앞에서 할당해 두었던 Floating IP 들 중에서 하나를 선택하여 Associate 를 클릭하면 VM의 내부 사설 port(10.0.0.*) 과 Floating IP가 연결된다



Ubuntu VM 에 연결된 Floating IP 로 ping 테스트와 ssh 접속을 수행해 본다



12. LBaas(LB As A Service) 의 설정과 테스트


  • Haproxy Load Balancer 사용을 위한 준비

새로운 VM과 LB에 할당할 Floating IP 를 추가한다


LB pool 에 할당할 새로운 Ubuntu VM 을 생성해 둔다




LB pool 에 포함될 VM 들에 접속하여 nginx 패키지를 설치한다(외부 접속을 위해 /etc/resolv.conf 에 nameserver 를 추가하고, apt-get update 를 한 이후, apt-get install nginx 로 패키지 설치). 설치 이후 curl http://localhost 로 자체 접속 테스트.


각 VM의 웹서버에 80 port 로 접속이 가능하도록, 기존의 Security Group에 새로운 Rule 을 추가한다


VM들의 웹서버에 접속이 가능한지 웹브라우저를 통해 각각 접속해 본다



Network->Load Balancer, +Add Pool 클릭 및 저장 후,


Add VIP 선택


IP address에는 VM의 사설 IP 대역에 해당하는 IP를 입력. Connection Limit 는 -1 또는 제한되는 연결 갯수 입력 & 저장


Associate Floating IP 선택.


미리 준비한 Floating IP를 선택하고 Associate 클릭 & 저장


Members 탭 선택, +Add Member 클릭


Add Member 클릭. Pool 선택 & 대상 VM, port 번호 등 설정



웹브라우저에서 LB VIP로 접속하여 확인 완료



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

Gluster 파일시스템의 Geo-replication 환경을 구축하고 테스트 하는 과정을 정리해 보자. 작업 환경을 단순하게, 과정을 직관적으로 표현하기 위해 추가 디스크 없는 VM 2개만으로 모든 내용을 소화해 보기로 한다. 이를 위해 Linux 의 Sparse 파일을 가상 디스크로 매핑하여, 마치 추가 디스크가 장착된, 또는 별도 파티션 된 물리 디스크 볼륨이 있는 것처럼 흉내 내는 방법을 같이 다루어 보고자 한다(블록디바이스를 통한 비슷한 테스트를 진행해야 할 때 유용한 방법으로 써먹을 수 있을 것이다).



CentOS 7.2에 Gluster Filesystem 설치


먼저 위의 그림과 같이 네트워크가 연결된 2개의 가상머신을 준비한다(CentOS 7.2 또는 RHEL 7.2는 이미 설치되었다고 가정하자). Redhat 이나 CentOS의 경우 대개 EPEL 을 통해 Gluster 를 설치하게 된다.


* 주의: 2개의 서버 노드를 peer 로 연결하여 Cluster 에 투입하는 것은 아니며, 서로 독립된 Gluster 세트가 원격지에 각각 존재하는 경우에 대한 내용을 다룬다. 여러 peer 를 통하여 Brick을 구성하고 데이터가 분산(distributed) 또는 중복(replica)되는 Volume 구성에 대해서는 여기서 논외로 하자.


* 2개의 서버 각각에 다음과 같이 gluster 를 설치한다.

# yum install -y wget

# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm

# rpm -ivh epel-release-7-8.noarch.rpm

# yum install -y centos-release-gluster38.noarch

# yum install -y glusterfs-server

yum install -y glusterfs-geo-replication

# systemctl start glusterd

# systemctl enable glusterd


* RHEL 7 에서는 약간 과정이 다르다. 다음과 같이 해 보자.

# yum install -y wget

# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm

# rpm -ivh epel-release-7-8.noarch.rpm

# vi /etc/yum.repos.d/Gluster.repo

[gluster38]

name=Gluster 3.8

baseurl=http://mirror.centos.org/centos/7/storage/$basearch/gluster-3.8/

gpgcheck=0

enabled=1

# yum install -y glusterfs-server

# yum install -y glusterfs-geo-replication

# systemctl start glusterd

# systemctl enable glusterd


* 커맨드를 단순하게 하기 위해 /etc/hosts 파일에 다음의 2 라인을 추가

10.10.10.10 gnode1

10.10.10.11 gnode2


* 호스트 명을 각각 gnode1, gnode 로 변경하고 재접속

hostnamectl set-hostname gnode1



준비1: 데이터를 동기화할 가상 블록디바이스 장착

서두에서 말한 것처럼 Sparse 파일(1 GByte 짜리 ^^;;)을 만들어 가상디스크로 붙이고, 이를 데이터 동기화용 블록디바이스로 활용할 것이다. VM 2개에 각각 다음과 같이 작업한다.


* losetup -f 로 Sparse 이미지 파일을 LO 디바이스에 매핑하면, 자동으로 다음의 빈 LO 디바이스(아래의 경우, /dev/loop2)가 찾아져서 매핑됨

* 블록디바이스가 준비되었으므로 xfs 로 파일시스템을 포맷하고 마운트포인트를 /mnt/gnode_disk1 디렉토리로 하여 시스템에 마운트하면 준비 끝

[root@gnode1 ~]# mkdir gluster_disk

[root@gnode1 ~]# cd gluster_disk/

[root@gnode1 ~]# dd if=/dev/zero of=./disk1.img bs=1M count=1024

[root@gnode1 ~]# losetup -f /root/gluster_disk/disk1.img

[root@gnode1 ~]# losetup

NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE

...

/dev/loop2         0      0         0  0 /root/gluster_disk/disk1.img 

[root@gnode1 ~]# mkfs.xfs /dev/loop2

[root@gnode1 ~]# mkdir /mnt/gnode_disk1

[root@gnode1 ~]# mount /dev/loop2 /mnt/gnode_disk1/



준비2: Password-less 로그인 설정

Geo-replication 이 가능하게 하기 위해서는, 2개의 서버에서 각각 상대방 서버로 패스워드 없이 root 계정으로 접속할 수 있도록 ssh 키를 교환해 두어야 한다. 다음과 같이 진행하자.


* Password-less ssh 접속을 위한 키 교환. 상대방 서버에 ssh 접속하고 암호를 입력해 두면 다음에는 암호 없이 로그인 가능

[root@gnode1 ~]# ssh-keygen 

[root@gnode1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.11

[root@gnode1 ~]# ssh gnode2



Gluster Volume 생성 및 기동

각각의 Gluster 서버에서 다음과 같이 Volume 을 생성하고 기동한다. 


* 주의: 마운트포인트 아래에 서브디렉토리를 생성하여 볼륨(여기서는 distvol)에 할당해야 함

[root@gnode1 ~]# mkdir -p /mnt/gnode_disk1/brick

[root@gnode1 ~]# gluster volume create distvol gnode1:/mnt/gnode_disk1/brick

[root@gnode1 ~]# gluster volume start distvol

[root@gnode1 ~]# gluster volume info

Volume Name: distvol

Type: Distribute

Volume ID: 9754b79a-d0e7-4823-9e85-38340d99e732

Status: Started

Snapshot Count: 0

Number of Bricks: 1

Transport-type: tcp

Bricks:

Brick1: gnode1:/mnt/gnode_disk1/brick

Options Reconfigured:

nfs.disable: on

performance.readdir-ahead: on

transport.address-family: inet


[root@gnode2 ~]# mkdir -p /mnt/gnode_disk1/brick

[root@gnode2 ~]# gluster volume create distvol gnode2:/mnt/gnode_disk1/brick

[root@gnode2 ~]# gluster volume start distvol

[root@gnode2 ~]# gluster volume info

Volume Name: distvol

Type: Distribute

Volume ID: e12db607-2e19-4a45-bc3b-eb6e922f59e5

Status: Started

Snapshot Count: 0

Number of Bricks: 1

Transport-type: tcp

Bricks:

Brick1: gnode2:/mnt/gnode_disk1/brick

Options Reconfigured:

nfs.disable: on

performance.readdir-ahead: on

transport.address-family: inet



Geo-replication 설정 및 테스트

* Geo-replication 설정은 Master(여기서는 gnode1) 에서만 수행

[root@gnode1 ~]# gluster system:: execute gsec_create

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol create push-pem

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol start

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol status

MASTER NODE    MASTER VOL    MASTER BRICK              SLAVE USER    SLAVE              SLAVE NODE    STATUS    CRAWL STATUS       LAST_SYNCED                  

-----------------------------------------------------------------------------------------------------------------------------------------------------

gnode1         distvol       /mnt/gnode_disk1/brick    root          gnode2::distvol    gnode2        Active    Changelog Crawl    2016-10-10 01:10:04

[root@gnode1 ~]# gluster volume info distvol

Volume Name: distvol

Type: Distribute

Volume ID: 9754b79a-d0e7-4823-9e85-38340d99e732

Status: Started

Snapshot Count: 0

Number of Bricks: 1

Transport-type: tcp

Bricks:

Brick1: gnode1:/mnt/gnode_disk1/brick

Options Reconfigured:

changelog.changelog: on

geo-replication.ignore-pid-check: on

geo-replication.indexing: on

nfs.disable: on

performance.readdir-ahead: on

transport.address-family: inet



동기화 테스트

동기화 테스트를 수행하기 위해 별도의 Gluster Client 를 사용해야 하지만, Gluster 서버 자신을 클라이언트로 사용해도 된다. 다시 말해 Gluster 서버에서 자신의 Volume 을 리모트 마운트하는 것이다. 다음과 같이 진행해 보자.


* gnode1: Gluster Fuse Client 로 distvol 볼륨을 로컬의 /mnt/gnode1_distvol/ 디렉토리로 마운트하고 해당 디렉토리로 이동

[root@gnode1 ~]# mkdir /mnt/gnode1_distvol

[root@gnode1 ~]# mount.glusterfs gnode1:/distvol /mnt/gnode1_distvol/

[root@gnode1 ~]# cd /mnt/gnode1_distvol/


* gnode2: Gluster Fuse Client 로 distvol 볼륨을 로컬의 /mnt/gnode2_distvol/ 디렉토리로 마운트하고 해당 디렉토리로 이동

[root@gnode2 ~]# mkdir /mnt/gnode2_distvol

[root@gnode2 ~]# mount.glusterfs gnode1:/distvol /mnt/gnode2_distvol/

[root@gnode2 ~]# cd /mnt/gnode2_distvol/


* gnode1: 파일 생성, 수정 및 삭제

[root@gnode1 ~]# echo abcdef----xyzxyz----xxxx > test.txt

[root@gnode1 ~]# cp test.txt s

[root@gnode1 ~]# cat test.txt >> s

[root@gnode1 ~]# cp s x

[root@gnode1 ~]# cat s >> x

[root@gnode1 ~]# vi x

[root@gnode1 ~]# rm tttt

...

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol status

MASTER NODE    MASTER VOL    MASTER BRICK              SLAVE USER    SLAVE              SLAVE NODE    STATUS    CRAWL STATUS       LAST_SYNCED                  

-----------------------------------------------------------------------------------------------------------------------------------------------------

gnode1         distvol       /mnt/gnode_disk1/brick    root          gnode2::distvol    gnode2        Active    Changelog Crawl    2016-10-10 01:15:22


* gnode2 디렉토리 내의 파일 변화 관찰, 확인

[root@gnode2 gnode2_distvol]# ls

s  test.txt  x

[root@gnode2 gnode2_distvol]# cat test.txt

abcdef----xyzxyz----xxxx

[root@gnode2 gnode2_distvol]#


몇 가지 팁들 ... port 변경, 작은 파일에 유리한 option 등

Gluster 의 geo-replication은 내부적으로 ssh를 통한 rsync 방식으로 동작한다. 일반적으로 ssh는 TCP 22 포트를 사용하는데, 임의의 포트번호로 설정하려면 다음과 같이 진행하면 된다(사실, "How to replicate to slave via non-standard ssh port..." 에 대한 답이다).


우선 양쪽 Gluster 서버에서 ssh port 를 변경한다


# vi /etc/ssh/sshd_config

...

Port 22222

...


# systemctl restart sshd

# netstat -anp | grep 22222

tcp   0   0   0.0.0.0:22222    0.0.0.0:*    LISTEN    8425/sshd

...


만약 netstat 결과에 해당 포트번호로 바인딩되어 있지 않고 ssh 접속이 안된다면 SELINUX가 ssh의 기본 Port인 22번으로 바인딩하게 고정해 둔 것일 게다. 그러면 다음과 같은 semanage 명령을 수행하고 조금 시간이 지난 뒤에 다시 접속해 본다.


# semanage port -a -t ssh_port_t -p tcp 22222


Linux 서버에서 파이어월(firewalld)이 사용되고 있다면 다음과 같이 해당 포트를 허용해 주는 것도 잊지 않도록 하자.


# firewall-cmd --permanent --zone=public --add-port=22222/tcp

# firewall-cmd --reload


성공적으로 ssh 포트 번호를 변경하였다면, 이번에는 Gluster 에서 새로운 포트로 Geo-replication 이 되도록 설정하면 된다.


[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol stop

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol delete

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol create ssh-port 22222 push-pem

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol config ssh-port 22222

[root@gnode1 ~]# gluster volume geo-replication distvol gnode2::distvol start



Rsync는 Block 방식의 전송이기 때문에 파일의 크기가 큰 경우에 좀 더 유리하다. 반대로 말하면 크기가 작은(대략 수 KB~수백KB 이내) 파일의 경우 전송 지연이 발생할 수 있게 되는데, 이 때에는 다음과 같은 옵션을 적용하여 테스트해 보기를 권한다. Geo-replication 이 작동되는 도중에도 실행해 볼 수 있다.


[root@gnode1 ~] gluster volume geo-replication distvol gnode2::distvol config use-tarssh true


참고로, 간단히 테스트 해 보니 50KB 크기의 몇 백 개 파일 전송에 1분 26초 정도 걸리던 것이, 옵션 변경 후에 약 10초 가량 전송 시간이 줄어든 것을 볼 수 있었다.


원래의 기본 전송방식인 Rsync 방식으로 돌아가려면 다음과 같이 하면 된다.

[root@gnode1 ~] gluster volume geo-replication distvol gnode2::distvol config \!use-tarssh



Good Luck !


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


1. 오픈스택이란?

Openstack은 소규모부터 중대규모를 아우르는 IAAS(Infra As A Service)를 가능하게 하는 오픈소스 클라우드 플랫폼 솔루션입니다. 2010년, Rackspace사의 클라우드 파일 플랫폼과 NASA의 Nebula를 기반으로 통합, 협력하는 방식으로 진행되기 시작한 이 프로젝트의 첫 코드명은 Austin(2010). 이후 Diablo(2011), Essex(2012), Havana(2013), Icehouse, Juno(2014), Kilo(2015), Liverty, Mitaka(2016) 를 거져 2016년 10월에 Newton 버전이 출시될 예정으로 개발이 진행되고 있지요.


Python 언어를 기반으로 만들어진 이 클라우드 플랫폼은 Apache License 2.0 이 적용되어 있기 때문에 상용/비상용에 관계 없이 누구나 자유로이 채택하여 변경, 사용할 수 있을 뿐 아니라, 완성도 면에서 충실하고 잘 관리된 프로젝트의 퀄리티로 인해 수많은 전문가와 기업들이 관심을 가지고 개발에 참여하거나 자사의 제품에서 오픈스택을 지원하기 위해 연구개발을 진행하고 있는 Hot 한 기술 아이템이자 클라우드 컴퓨팅 플랫폼과 네트워킹 분야의 패러다임을 이끌고 있는 녀셕이기도 합니다.


원래는 Spec이 어느 정도 되는 서버 장비가 최소 2대 이상 있어야 설치, 운영을 해 볼 수 있지만, 가정 또는 소규모 연구실에서도 자체 Lab Test 정도는 해 볼 수 있도록 Triple-O(Openstack On Openstack) 구성에 대한 문서를 오픈스택 진영에서 직접 소개하고 있읍니다.

참고: ☞ https://wiki.openstack.org/wiki/TripleO).


2. 들어가며

본 포스팅에서는 필자의 맥북(MacBook Pro Sierra, Quadcore 16GB, SSD 256GB) 상에서 (1) VirtualBox 로 가상머신(CentOS 7.2)을 만들고, (2) Packstack을 이용해서 각각의 가상머신을 Openstack용 controller, Network, Compute 노드로 설치, 설정하여, 만들어진 오픈스택 클라우드 환경에서 (3) 실제로 VM을 생성하고 네트워크로 접속해보고, (4) LBaaS 서비스를 설치한 뒤 LB와 2개의 VM을 이용한 로드밸런싱 환경을 간단히 테스트해 보는 과정 전체를 기술해 둡니다.


중요한 점은, 본인이 포스팅하는 대다수의 블로깅에서 일관되게 지키려고 하는 원칙 중의 하나이긴 하지만, 과정 하나 하나를 직접 내 손으로 수행해 본 결과를 그대로 표현하고 기술함으로써 설치나 설정 과정에서 필요한 원리와 방식에 대해 더 구체적으로 들여다볼 수 있는 기회를 보는 이에게 제공해 주고자 한다는 점입니다. 내가 알지 못하고 무언가를 표현하는 것은, 보는 이에게 도움도 되지 않을 뿐 아니라 시간과 지면 낭비라고 생각하며, 플라스크를 만든 아르민 로나허가 말했듯이, "추상적인 내용보다 구체적인 경험을 나누는 것" 이 더 효과적인 소통과 전달의 수단이 될 수 있기 때문이지요.




본 포스팅의 작업과정에 가장 핵심적인 내용들이 위의 그림에 요약되어 표현되어 있으니, 잘 이해되도록 그림을 자세히 들여다 보기를 권하며, 아래 내용부터는 간략히, 다소 간결한 표현으로 써내려 갑니다.



3. 버추얼박스 가상머신 준비



우선 가상머신에 설치할 OS인 CentOS 7.2 를 다운로드(일반적으로 Ubuntu일 경우 Devstack 을 통해서, CentOS 나 Redhat일 경우 Packstack 을 통해서 Openstack 을 설치하게 됨).


  • VirtualBox 에서 VM 생성


위 그림에 해당하는 4개의 VM을 생성한다. Control 노드는 메모리를 4GB~8GB 정도 주는 것이 좋으며, Admin은 버추얼박스에서 GUI(웹브라우저 사용)이 가능하도록 데스크톱 형태로 설치해야 한다.


  • VM 네트워크 카드(NIC) 설정

그림을 잘 들여다 보면 기본적인 설정사항이 상세히 표시되어 있는데, 본 포스팅에서는 VirtualBox 에서 3가지의 네트워크(각각 외부, 데이터, 관리용)를 준비해야 한다. 이 중에서 외부(External) 네트워크는 인터넷 접속용, 데이터는 VM에 할당되는 서비스 네트워크, 관리용은 Openstack이 VM을 관리하기 위한 용도.

데이터 및 관리용 네트워크는 VirtualBox 의 호스트전용 어댑터 방식(NAT방식으로 해도 작동은 하지만, Virtualbox 내부에서만 동작하는 네트워크이므로 이 정도로 충분함)으로 생성하고, 외부용 네트워크는 맥북 호스트에서 VM에 접속도 가능하고, VM에서 외부 인터넷으로도 접속이 가능하도록 브리지모드로 생성.

호스트전용 어댑더 방식을 위해 아래 그림의 과정과 같이 vboxnet0 네트워크를 우선 생성한다(VirtualBox 환경설정 > 툴바의 네트워크 선택 > 호스트전용 네트워크 선택 > 우측 + 아이콘 클릭).


IPv4 주소는 변경할 필요 없이 그대로 둔다.


DHCP 서버를 눌러서 내용 확인 후 변경 없이 그대로 확인


마우스 커서를 들이대면 설정된 네트워크 정보가 보인다. 그냥 확인.


VM에서 사용할 호스트전용 네트워크가 준비되었으므로 다음 섹션의 VM별 네트워크 구성표에 따라 각각 어댑터를 할당하고 맨 위의 구성도를 보면서 스텍을 적당히 조절하며 4개의 VM을 생성한다. 앞의 3개의 노드들은 가급적 GUI가 없는 서버모드로 OS를 설치해야 하며, 마지막의 Admin VM은 웹브라우저를 통해 Controller VM의 Horizon 웹포탈에 접속해야 하므로 GUI 가 가능하도록 생성하되, 네트워크 정보는 Controller 와 같은 구성으로 하면 운영, 관리에 무리가 없을 것이다.


  • 각 VM 네트워크 카드(NIC) 구성

VM구분

(노드)

 NIC1

 NIC2

 NIC3

방식

(vbox)

장치명

용도

방식

(vbox)

장치명

용도

방식

(vbox)

장치명

용도

 Controller

bridge

enp0s9

API

(외부)

vboxnet0

eth0

control

(관리용)

 

 

 

 Network

bridge

enps09

API

(외부)

vboxnet0

eth0

control

(관리용)

vboxnet0

eth1

tenant

(데이터)

 Compute

 

 

 

vboxnet0

eth0

control

(관리용)

vboxnet0

eth1

tenant

(데이터)


   * 용도별 network segment(IP 대역)

     - API(외부용): 192.168.0.6~ ... Vbox VM외부, 즉 Virtualbox(즉 호스트의 하이퍼바이저 레벨) 에서는 bridge 장치로 인식되며, VM 내부에서는 ifcfg-enp0s9 장치로 관리됨(물리장치명 enp0s9 는 맥북의 경우이며, 일반 조립PC의 RTL 계열 등의 네트워크 카드는 단순히 eth0 와 같은 명칭이 될 수도 있다)

     - Control(관리용): 10.10.10.6~ ... Vbox VM 내부에서는 ifcfg-eth0 로 관리됨

     - Tenant(데이터): 10.10.20.6~ ... Vbox VM 내부에서는 ifcfg-eth1 으로 관리됨

   * 모든 Adapter 는 Virtualbox 에서 생성시 '무작위모드 허용' 으로 설정

   * vboxnet0 방식의 NIC은 모두 '반가상네트워크'로 설정


글 처음에 보이는 시스템 구성도와 아래의 네트워크 구성도는 Openstack 설치, 설정과정의 핵심 구조와 원리를 담은 설계도에 해당하므로 충분히 들여다 보고 잘 이해해 두도록 한다 그래야만 차후에 본인 스스로 실무적 요구사항을 담은 구성도를 직접 그려낼 수 있게 될 것이다.




4. 오픈스택 노드 들의 네트워크 개별 설정 - (1)


이제 위의 구성도와 표에 맞게 각 노드의 네트워크를 세부적으로 설정해 보자


  • 인터넷에서 패키지를 다운로드할 수 있도록 DNS 접속 주소를 설정

# vi /etc/resolv.conf # --> 자신의 인터넷 환경에 맞게 DNS 등록. 잘 모르면 8.8.8.8 하나만.

nameserver 168.126.63.1

nameserver 168.126.63.2


  • Controller 노드

  호스트명을 다음과 같이 변경하고 로그아웃 후, 다시 로그인


# hostnamectl set-hostname openstack-ctrl


  API용 외부 네트워크(enp0s9)

[root@openstack-ctrl ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s9

DEVICE=enp0s9

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=192.168.0.6

NETMASK=255.255.255.0

[root@openstack-ctrl ~]# vi /etc/sysconfig/network-scripts/route-enp0s9

default via 192.168.0.1 dev enp0s9

 

  관리용 내부 네트워크(eth0)

[root@openstack-ctrl ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.6

NETMASK=255.255.255.0


[root@openstack-ctrl ~]# systemctl restart network

[root@openstack-ctrl ~]# yum install -y net-tools


  Controller 노드는 Openstack 인프라 내에서 시간동기화(ntpd) 서버 기능을 해야 하므로 다음과 같이 ntpd 서버로 설정한다


[root@openstack-ctrl ~]# yum clean all; yum install -y ntp

[root@openstack-ctrl ~]# vi /etc/ntp.conf

restrict 10.10.10.0 mask 255.255.255.0 nomodify notrap

server kr.pool.ntp.org

server time.bora.net

server time.kornet.net

[root@openstack-ctrl ~]# systemctl enable ntpd

[root@openstack-ctrl ~]# systemctl start ntpd

[root@openstack-ctrl ~]# ntpq -pn


  • Network 노드

  호스트명을 다음과 같이 변경하고 로그아웃 후, 다시 로그인


# hostnamectl set-hostname openstack-net


  API용 외부 네트워크(enp0s9)

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s9

DEVICE=enp0s9

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=192.168.0.7

NETMASK=255.255.255.0

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/route-enp0s9

default via 192.168.0.1 dev enp0s9

 

  관리용 내부 네트워크(eth0)

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.7

NETMASK=255.255.255.0


  데이터용 내부 네트워크(eth1) 

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.20.7

NETMASK=255.255.255.0


[root@openstack-net ~]# systemctl restart network

[root@openstack-net ~]# yum install -y net-tools


  Controller 노드에 맞추어 시간동기화(ntp) 기능을 설정


[root@openstack-net ~]# yum clean all; yum install -y ntp

[root@openstack-net ~]# vi /etc/ntp.conf

server  10.10.10.6

[root@openstack-net ~]# systemctl enable ntpd

[root@openstack-net ~]# systemctl start ntpd

[root@openstack-net ~]# ntpq -pn

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

 10.10.10.6      LOCAL(0)         6 u  92m   64    0   60.402   37.293   0.000


5. 오픈스택 설치를 위한 각 노드 계정 및 네트워크 설정 - (2)


  • Controller, Network, Compute 노드에서 각각 오픈스택 설치/운영을 위한 stack 이라는 계정을 생성하고 권한을 부여
# useradd stack
# passwd stack  # --> specify a password
# echo "stack ALL=(root) NOPASSWD:ALL" | sudo tee -a /etc/sudoers.d/stack
# sudo chmod 0440 /etc/sudoers.d/stack

  • Compute 노드는 외부 네트워크에 직접 연결할 수 있는 NIC이 없음(위의 표: VM NIC 구성표 참조)


시스템 구성도와는 다르게 Compute 노드에 Network 노드처럼 NIC을 하나 더 추가해 주면 되지만, 여기서는 원칙대로 진행한다. 하지만 이렇게 되면 Compute 노드에서 새로운 패키지를 설치할 수 없게 되므로, Network 노드(를 게이트웨이로 해서)를 통해 외부 접속이 가능하도록 해 보자. 우선, Network 노드에서 다음을 수행한다.


# yum install -y iptables-services

# systemctl start iptables

# systemctl enable iptables

# iptables -F

# iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE

# iptables -A FORWARD -i eth0 -j ACCEPT

# service iptables save

# vi /etc/sysctl.conf

net.ipv4.ip_forward=1

# sysctl -p

   ※ [주의1] 붉은 글씨로 표기된 enp0s9 장치명은 Openstack 설치가 완료된 이후에는 br-ex 로 바꿔서 사용되어야 한다. 아래에서 다시 설명함

  • Compute 노드(openstack-cmp1, openstack-cmp2, ...)

  호스트명을 다음과 같이 변경하고 로그아웃 후, 다시 로그인


# hostnamectl set-hostname openstack-cmp1



  데이터용 내부 네트워크(eth1) 

[root@openstack-cmp1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.20.8

NETMASK=255.255.255.0


     다음으로 Compute 노드에서 다음과 같이 네트워크와 게이트웨이를 설정한다.

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.8

NETMASK=255.255.255.0

# vi /etc/sysconfig/network-scripts/route-eth0

default via 10.10.10.7 dev eth0

# systemctl restart network
# yum install -y net-tools

# ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=45.7 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=39.8 ms ...


  Controller 노드에 맞추어 시간동기화(ntp) 기능을 설정한다


[root@openstack-cmp1 ~]# yum clean all; yum install -y ntp

[root@openstack-cmp1 ~]# vi /etc/ntp.conf

server  10.10.10.6

[root@openstack-cmp1 ~]# systemctl enable ntpd

[root@openstack-cmp1 ~]# systemctl start ntpd

[root@openstack-cmp1 ~]# ntpq -pn

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

 10.10.10.6      LOCAL(0)         6 u  92m   64    0   60.402   37.293   0.000


6. 오픈스택 설치를 위한 각 노드들의 패키지 설정


  • 각 노드의 리포지토리를 변경하고 필수 패키지를 설치


이제 모든 3개 노드(Controller, Network, Compute)에서 BaseRepo 를 다음과 같이 변경하고, 필수 유틸리티와 종속성 패키지를 순서대로 빠짐 없이 설치한다(Openstack 버전에 따라 다소 차이가 있을 수 있으며, 아래는 2016.9월 시점 Mitaka v5 기준). 참고로 활발히 개발이 진행되고 있는 Openstack 의 버전에 따라, 본 포스팅의 경우처럼 다수의 의존성 패키지를 따로 설치하지 않고 yum update 를 통해 기본적인 패키지 업데이트를 진행한 다음, 최소한의 의존성 패키지를 따로 설치하는 경우도 생각해 볼 수 있다.


# vi /etc/yum.repos.d/CentOS-Base.repo

#mirrorlist=...모든 섹션에서 mirrorlist 줄을 comment

#baseurl=...모든 섹션에서 baseurl 줄을 comment, 그 줄 아래에 다음 줄을 각각 추가

baseurl=http://ftp.daumkakao.com/centos/$releasever/os/$basearch/

# yum install -y net-tools

# yum install -y wget


# --> 종속성 패키지 설치

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-markdown-2.4.1-1.el7.centos.noarch.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-cheetah-2.4.4-5.el7.centos.x86_64.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-werkzeug-0.9.1-2.el7.noarch.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-itsdangerous-0.23-2.el7.noarch.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-flask-0.10.1-4.el7.noarch.rpm

# wget wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/os/x86_64/Packages/python-jinja2-2.7.2-2.el7.noarch.rpm

# wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/cloud/x86_64/openstack-liberty/common/python-babel-1.3-6.el7.noarch.rpm

# wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/os/x86_64/Packages/python-markupsafe-0.11-10.el7.x86_64.rpm

# sudo yum install -y python-pygments

# sudo rpm -ivh python-markdown-2.4.1-1.el7.centos.noarch.rpm

# sudo rpm -ivh python-cheetah-2.4.4-5.el7.centos.x86_64.rpm

# sudo rpm -ivh python-werkzeug-0.9.1-2.el7.noarch.rpm

# sudo rpm -ivh python-itsdangerous-0.23-2.el7.noarch.rpm

# sudo yum install -y  pytz

# sudo rpm -ivh python-babel-1.3-6.el7.noarch.rpm

# sudo rpm -ivh python-markupsafe-0.11-10.el7.x86_64.rpm

# sudo rpm -ivh python-jinja2-2.7.2-2.el7.noarch.rpm

# sudo rpm -ivh python-flask-0.10.1-4.el7.noarch.rpm


  • 각 노드의 /etc/hosts 파일에 다음의 3개 라인을 추가

10.10.10.6 openstack-ctrl

10.10.10.7 openstack-net

10.10.10.8 openstack-cmp1


  • 마찬가지로 각 3개 노드에서 보안 등 각종 관리패키지를 오픈스택 설치가 가능해 지도록 구성

# systemctl disable firewalld

# systemctl stop firewalld

# systemctl disable NetworkManager

# systemctl stop NetworkManager

# yum remove -y NetworkManager

# systemctl enable network

# systemctl start network


# vi /etc/selinux/config #--> liberty 부터는 불필요 해졌으므로 생략

...

SELINUX=permissive

...



7. Packstack 으로 Openstack 자동 설치하기

Packstack은 Controller 노드에서 answer 파일을 읽어 들여서 자신을 포함하여 하위 노드(Network 노드, Compute 노드들)에서 각종 소프트웨어들을 설치/설정하는 스크립트를 단계적으로 실행해 주는 역할을 한다(Redhat 제공 RDO 프로젝트 참고: www.rdoproject.org). 이를 위해 각 하위 노드에 암호 없이 접속이 가능해야 한다. 


  • Controller 노드에서 각 노드로 Passwordless ssh 설정

[root@openstack-ctrl ~]# ssh-keygen 

[root@openstack-ctrl ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.7

[root@openstack-ctrl ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.8


#--> 암호 없이 정상적으로 접속되는지 확인

[root@openstack-ctrl ~]# ssh openstack-net

[root@openstack-ctrl ~]# ssh openstack-cmp1


  • Packstack repo 설정 및 설치 시작

[root@openstack-ctrl ~]# yum install -y https://www.rdoproject.org/repos/rdo-release.rpm

[root@openstack-ctrl ~]# yum install -y openstack-packstack

[root@openstack-ctrl ~]# su - stack

[root@openstack-ctrl ~]# sudo packstack --gen-answer-file=answer.txt

[root@openstack-ctrl ~]# sudo vi answer.txt

=== OVS(Openvswitch) 기반 샘플 answer 파일 다운로드 ===

=== answer.txt 로 복사후 편집, 사용 ===


[root@openstack-ctrl ~]# sudo packstack --answer-file=answer.txt

Welcome to the Packstack setup utility



The installation log file is available at: /var/tmp/packstack/20160828-041734-_nTMcZ/openstack-setup.log



Installing:

Clean Up                                             [ DONE ]

Discovering ip protocol version                      [ DONE ]

Setting up ssh keys                                  [ DONE ]

Preparing servers                                    [ DONE ]

Pre installing Puppet and discovering hosts' details [ DONE ]

Adding pre install manifest entries                  [ DONE ]

Installing time synchronization via NTP              [ DONE ]

Setting up CACERT                                    [ DONE ]

Adding AMQP manifest entries                         [ DONE ]

Adding MariaDB manifest entries                      [ DONE ]

Adding Apache manifest entries                       [ DONE ]

Fixing Keystone LDAP config parameters to be undef if empty[ DONE ]

Adding Keystone manifest entries                     [ DONE ]

...

Adding Nagios server manifest entries                [ DONE ]

Adding Nagios host manifest entries                  [ DONE ]

Copying Puppet modules and manifests                 [ DONE ]

Applying 10.10.10.8_prescript.pp

Applying 10.10.10.7_prescript.pp

Applying 10.10.10.6_prescript.pp

10.10.10.8_prescript.pp:                             [ DONE ]      

10.10.10.6_prescript.pp:                             [ DONE ]      

10.10.10.7_prescript.pp:                             [ DONE ]      

Applying 10.10.10.8_chrony.pp

Applying 10.10.10.7_chrony.pp

Applying 10.10.10.6_chrony.pp

10.10.10.8_chrony.pp:                                [ DONE ]   

10.10.10.6_chrony.pp:                                [ DONE ]   

10.10.10.7_chrony.pp:                                [ DONE ]   

Applying 10.10.10.6_amqp.pp

Applying 10.10.10.6_mariadb.pp

10.10.10.6_amqp.pp:                                  [ DONE ]    

10.10.10.6_mariadb.pp:                               [ DONE ]    

Applying 10.10.10.6_apache.pp

10.10.10.6_apache.pp:                                [ DONE ]   

Applying 10.10.10.6_keystone.pp

Applying 10.10.10.6_glance.pp

Applying 10.10.10.6_cinder.pp

10.10.10.6_keystone.pp:                              [ DONE ]     

10.10.10.6_glance.pp:                                [ DONE ]     

10.10.10.6_cinder.pp:                                [ DONE ]     

Applying 10.10.10.6_api_nova.pp

10.10.10.6_api_nova.pp:                              [ DONE ]     

Applying 10.10.10.6_nova.pp

Applying 10.10.10.8_nova.pp

10.10.10.6_nova.pp:                                  [ DONE ] 

10.10.10.8_nova.pp:                                  [ DONE ] 

Applying 10.10.10.8_neutron.pp

Applying 10.10.10.7_neutron.pp

Applying 10.10.10.6_neutron.pp

10.10.10.8_neutron.pp:                               [ DONE ]    

10.10.10.6_neutron.pp:                               [ DONE ]    

10.10.10.7_neutron.pp:                               [ DONE ]    

Applying 10.10.10.6_osclient.pp

Applying 10.10.10.6_horizon.pp

10.10.10.6_osclient.pp:                              [ DONE ]     

10.10.10.6_horizon.pp:                               [ DONE ]     

Applying 10.10.10.6_ring_swift.pp

10.10.10.6_ring_swift.pp:                            [ DONE ]       

Applying 10.10.10.6_swift.pp

10.10.10.6_swift.pp:                                 [ DONE ]  

Applying 10.10.10.6_heat.pp

10.10.10.6_heat.pp:                                  [ DONE ] 

Applying 10.10.10.6_provision.pp

Applying 10.10.10.6_provision_glance

10.10.10.6_provision.pp:                             [ DONE ]          

10.10.10.6_provision_glance:                         [ DONE ]          

Applying 10.10.10.7_provision_bridge.pp

10.10.10.7_provision_bridge.pp:                      [ DONE ]             

Applying 10.10.10.6_gnocchi.pp

10.10.10.6_gnocchi.pp:                               [ DONE ]    

Applying 10.10.10.6_mongodb.pp

Applying 10.10.10.6_redis.pp

10.10.10.6_mongodb.pp:                               [ DONE ]    

10.10.10.6_redis.pp:                                 [ DONE ]    

Applying 10.10.10.6_ceilometer.pp

10.10.10.6_ceilometer.pp:                            [ DONE ]       

Applying 10.10.10.6_aodh.pp

10.10.10.6_aodh.pp:                                  [ DONE ] 

Applying 10.10.10.6_nagios.pp

Applying 10.10.10.8_nagios_nrpe.pp

Applying 10.10.10.7_nagios_nrpe.pp

Applying 10.10.10.6_nagios_nrpe.pp

10.10.10.8_nagios_nrpe.pp:                           [ DONE ]        

10.10.10.7_nagios_nrpe.pp:                           [ DONE ]        

10.10.10.6_nagios.pp:                                [ DONE ]        

10.10.10.6_nagios_nrpe.pp:                           [ DONE ]        

Applying Puppet manifests                            [ DONE ]

Finalizing                                           [ DONE ]


 **** Installation completed successfully ******


Additional information:

 * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.

 * File /root/keystonerc_admin has been created on OpenStack client host 10.10.10.6. To use the command line tools you need to source the file.

 * To access the OpenStack Dashboard browse to http://10.10.10.6/dashboard .

Please, find your login credentials stored in the keystonerc_admin in your home directory.

 * The installation log file is available at: /var/tmp/packstack/20160906-010456-B6ViYg/openstack-setup.log

 * The generated manifests are available at: /var/tmp/packstack/20160906-010456-B6ViYg/manifests



  • 유의해야 할 사항

본 글에서 제공되는 answer.txt 샘플파일은 2016.9월 시점 Mitaka 기준의 것으로, LBaas 설치 옵션(CONFIG_LBAAS_INSTALL)을 켜게 되면 설치 단계에서 "neutron server 실행 오류가 유발되고 있으므로 초기 설치시에는 일단 제외하고 LBaas는 글 후반에 별도로 다룸


Neutron L2 Agent와 Neutron ML2 Mechanism driver는 openvswitch만을 적용하였다.  메커니즘 드라이버는 필요에 따라 linuxbridge, arista, cisco nexus 등을 여건에 맞게 콤마로 구분하여 추가하면 됨


간혹 설치 중간 중간에 노드의 상태가 불안정하여 오류가 발생하거나 더 이상 진행되지 않는 등의 경우가 생기기도 하는데, 강제 종료 후 다시 시도해 보거나, 전체 노드를 리부트 후 재시도 또는 최악의 경우 VM을 다시 만들어 초기 상태에서 재시도를 해야 하는 경우가 있을 수도 있음


잦은 설치 오류로 인하여 /var/log 디렉토리의 서비스별 로그 디렉토리에 log 파일이 넘쳐서 Vbox VM의 디스크가 Full 될 수도 있음에 유의



8. Network 노드 - Neutron 네트워크(OVS bridge) 인터페이스 설정


이제 설치과정의 막바지. Network 노드의 브리지 인터페이스를 다음과 같이 설정해 주어야 한다 


  • Network 노드 브리지 인터페이스 설정

[root@openstack-net ~]# ifconfig

br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::b4c4:87ff:fe82:a949  prefixlen 64  scopeid 0x20<link>

        ether b6:c4:87:82:a9:49  txqueuelen 0  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 13  overruns 0  frame 0

        TX packets 8  bytes 648 (648.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


enp0s9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.0.7  netmask 255.255.255.0  broadcast 192.168.0.255

        inet6 fe80::a00:27ff:fe2f:5037  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:2f:50:37  txqueuelen 1000  (Ethernet)

        RX packets 27435  bytes 37349433 (35.6 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 8894  bytes 643839 (628.7 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 10.10.10.7  netmask 255.255.255.0  broadcast 10.10.10.255

         ...

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 10.10.20.7  netmask 255.255.255.0  broadcast 10.10.20.255

         ...

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig 로 네트워크 구성을 살펴 보면 br-ex(외부 연결 브리지)에는 IP 주소가 할당되어 있지 않고, enp0s9 에 외부 연결용 IP(192.168.0.7)이 할당되어 있는 것을 볼 수 있다. 


이제 enp0s9 에 할당된 외부 네트워크 정보를 br-ex(외부용 브리지 인터페이스) 로 옮기고, ifcfg-enp0s9를 br-ex와 연결하는 작업을 해야 한다. 다음의 과정을 따라가 보자.


[root@openstack-net ~]# cd /etc/sysconfig/network-scripts/

[root@openstack-net ~]# cp ifcfg-enp0s9 ifcfg-br-ex

[root@openstack-net ~]# vi ifcfg-br-ex

DEVICE=br-ex

DEVICETYPE=ovs

TYPE=OVSBridge

BOOTPROTO=static

IPADDR=192.168.0.7

NETMASK=255.255.255.0

BROADCAST=192.168.0.255

GATEWAY=192.168.0.1

DEFROUTE=yes

ONBOOT=yes

NM_CONTROLLED=no

IPV4_FAILURE_FATAL=yes

IPV6INIT=no


[root@openstack-net ~]# vi ifcfg-enp0s9

DEVICE=enp0s9

DEVICETYPE=ovs

TYPE=OVSPort

OVS_BRIDGE=br-ex

ONBOOT=yes

NM_CONTROLLED=no

IPV6INIT=no



[root@openstack-net ~]# systemctl restart network

[root@openstack-net ~]# ifconfig

br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.0.7  netmask 255.255.255.0  broadcast 192.168.0.255

        inet6 fe80::b49c:2aff:fe19:7e4c  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:2f:50:37  txqueuelen 0  (Ethernet)

        RX packets 31966  bytes 5704088 (5.4 MiB)

        RX errors 0  dropped 1  overruns 0  frame 0

        TX packets 7268  bytes 1153521 (1.1 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



enp0s9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::a00:27ff:fe2f:5037  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:2f:50:37  txqueuelen 1000  (Ethernet)

        RX packets 1191146  bytes 714542018 (681.4 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 17821  bytes 2222494 (2.1 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

네트워크 재시작 후 네트워크 구성을 ifconfig 로 확인해 보면, br-ex에 외부 연결용 네트워크 정보가 할당되어 있고, enp0s9의 ethernet(MAC) 주소가 br-ex 의 MAC 주소와 동일한 값을 가진 것을 확인할 수 있다.


9. Compute 노드 - 네트워크 게이트웨이 설정


  • Compute 노드에서 외부로 접속할 필요가 있을 경우에만 해당


앞서 설명했듯이 Compute 에는 외부로 직접 연결 가능한 네트워크가 없으므로, Network 노드를 통해서만 외부 접속이 가능하다.  위의 [주의1] 에서 설명한 부분의 파란 글씨에 해당하는 설정을 Network 노드에서 수행(위에서 설명한 대로 enp0s9는 br-ex 로 변경)한 다음 다음과 같이 설정해 두면 된다.


[root@openstack-cmp1 ~]# cd /etc/sysconfig/network-scripts/

[root@openstack-cmp1 ~]# vi ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.8

NETMASK=255.255.255.0


[root@openstack-cmp1 ~]# vi route-eth0

default via 10.10.10.7 dev eth0


[root@openstack-cmp1 ~]# systemctl restart network



Controller 노드의 환경변수 설정 스크립트 복사


  • Network 노드, Compute 노드에서 CLI 명령 실행이 필요할 경우에 대비하여 스크립트 복사


Controller 노드의 keystonerc 관련 파일들을 다음과 같이 Network 노드, Compute 노드에 복사해 둔다


[root@openstack-ctrl ~]# scp keystonerc_* root@openstack-net:~

[root@openstack-ctrl ~]# scp keystonerc_* root@openstack-cmp1:~



10. Horizon 웹을 통해 Cloud 플랫폼 사용 준비 과정


  • Horizon 웹 UI 사용 준비 - 클라우드 네트워크 설정


시스템 구성도의 Admin VM에 해당하는 VM에서, firefox 웹브라우저를 통해 http://10.10.10.6으로 접속, admin 계정과 answer.txt 에서 지정한 암호를 통해 로그인


tenant 서비스를 위해서 demo 프로젝트를 사용한다고 가정했을 때,  해당 프로젝트에서 사용할 네트워크를 생성, 설정하는 과정을 다음과 같이 진행한다.



사용하지 않는 기본 Router 삭제(Admin->System->Router->demo 프로젝트-public라우터), Public 네트워크 정보(Admin->System->Network->admin 프로젝트-public subnet)을 삭제 



networks 패널에서, '+Create Network' 을 선택하고 admin 프로젝트에 대해 public 네트워크를 새로이 생성(본 케이스에서는 vxlan 방식, shared - External network).



생성된 public 네트워크 항목을 선택하여, 하단의 '+Create Subnet' 을 클릭,  실제로 사용할 외부 네트워크 정보(CIDR, Gateway, DNS 등)을 Subnet, Subnet Detail 항목 선택을 통해 각각 등록


admin 계정을 로그아웃하고, tenant 서비스를 설정/사용하기 위한 demo 계정으로 로그인

앞에서 admin 을 통해 생성, 설정한 네트워크를 사용하기 위해, 왼쪽 메뉴에서 Project->Network->Router 패널을 선택하고 '+Create Router' 을 클릭하려 demo 프로젝트에서 사용할 라우터를 생성. External Network 항목에 대해, 앞서 생성했던 public 네트워크를 선택



'+Create Gateway' 클릭을 통해 외부 네트워크와의 연결을 위한 게이트웨이를 설정




'+Add Interface' 클릭을 통해, 앞서 생성한 사설 네트워크와의 연결을 위한 인터페이스를 추가


좌측 메뉴의 Network 패널에서 Network Topology 를 선택하여 현재 구성된 네트워크의 구조를 확인한다. 여기까지 성공적으로 진행하였다면 클라우드 환경을 본격적으로 사용하기 위한 전체 설정 과정은 완료한 것이며, 다음의 필수 준비과정 몇 가지를 거치면 모든 준비가 끝나고 VM을 생성, 관리할 수 있게 됨.


11. VM 인스턴스 생성 관리를 위한 준비 & 실행 단계


  • security Group 생성


  • Key Pair 생성



  • Floating IP 생성



  • VM Image 확인


  • 생성된 VM 목록




12. LBaas(LB As A Service) 의 설정과 테스트


LBaas 의 설치 방법에 대해서는 여기를 주로 많이 참조하게 되는데(Kilo 버전 기준), 현재 시점의 Mitaka에 적용시에 적욥하지 않은 일부 오류가 숨어 있으므로 아래의 내용으로 진행하면 크게 무리 없이 성공적으로 수행 가능



  • Controller, Network 노드에서 각각 haproxy, lbaas 설치
[root@openstack-ctrl ~]# yum install -y haproxy openstack-neutron-lbaas


  • Controller 노드에 driver, plugin 설정
[root@openstack-ctrl ~]# vi /etc/neutron/neutron_lbaas.conf
service_provider = LOADBALANCER:Haproxy:neutron_lbaas.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
[root@openstack-ctrl ~]# vi /etc/neutron/neutron.conf
service_plugins 리스트에 lbaas 추가
[root@openstack-ctrl ~]# systemctl restart neutron-server.service

  • Network 노드에 lbaas agent 설정
[root@openstack-net ~]# vi /etc/neutron/lbaas_agent.ini
device_driver = neutron.services.loadbalancer.drivers.haproxy.namespace_driver.HaproxyNSDriver
user_group = haproxy
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver

[root@openstack-net ~]# systemctl restart neutron-lbaas-agent.service
[root@openstack-net ~]# systemctl enable neutron-lbaas-agent.service

  • Horizon(Controller 노드) 설정
[root@openstack-ctrl ~]# vi /etc/openstack-dashboard/local_settings
'enable_lb': True

[root@openstack-ctrl ~]# systemctl restart httpd.service


이제 Openstack Horizon 에 로그인하여 Network 패널 아래에 Load Balancer 라는 서브 패널이 나타나며, Load balancer 설정 및 사용이 가능해 짐을 볼 수 있다.


다음에 다룰 내용은?


2016년 10월에 Mitaka 후속 버전으로 Newton 버전에 릴리즈되었습니다. 다음에 다룰 내용은 최신의 Newton 버전이 되겠으며, 본 포스팅과 중복되는 부분은 제외하고, 기본적인 설치/설정 과정의 요약 정리와 함께 로드밸런싱을 위한 VM 이미지의 준비, Haproxy 기술을 활용한 LB의 대상이 되는 VM에 웹서버를 설정하고 부하 분산의 작동 테스트를 포함하여, answer 파일의 개별설정과 VM의 HOT(Heat Orchestration Template)에 의한 VM 자동증설(Auto-scale: Scale out/in)에 대해서 다루어 보도록 하겠습니다. 


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

 

LGU+ 회사의 클라우드(cloudN) 환경의 가상머신(VM,Virtual Machine)에 oracle 11gR2를 설치해 보았다. 대개 서버 설치시에 X-window를 포함하지 않는 경우가 많으므로, java 와 GUI가 제공되는 그래피컬 환경(일반적으로 주로 사용하는 OUI 모드)이 아닌, 텍스트 기반의 서버 환경에서 설치를 진행한다(구글은 이 Silent mode를 침묵 모드라는 말로 멋지게 번역해 준다).


이론은 간단한 듯 하지만, 실제로 해 보면 결코 그렇지만은 않다. 특히 response 파일 설정에서, 다소의 시행착오와 installer 재실행을 몇 번 해 보아야 한다. 일단 한 번 해 보면 어렵지 않게 누구나 따라서 설치 가능하도록 소상하게 과정을 다루도록 하겠다.

 

다만, 서버에 오라클을 설치할 정도의 엔지니어라면 기본적인 Linux 서버의 사용법이나 소프트웨어 설치, 운영에 어느 정도는 기본 지식이 있을 것이라는 전제하에 기초에 해당하는 지식은 과감히 설명없이 넘어가려 함에 유의해 주자.


[사전 작업 - Prerequisites]


반드시 거쳐야 할 작업으로, 스킵하면 installer가 validate시에 칞젏하게 뱉어내 주며, 다음 단계로 진행할 수가 없다.


1. 커널 파라미터 조정

Oracle이 구동되기 위한 기본 설정이므로 아래와 같이 /etc/sysctl.conf 내에 설정하고 root 계정에서 sysctl -p로 실행해야 함을 잊지 말자.


# Mandatory prerequisite conditions


# semaphores: semmsl, semmns, semopm, semmni

kernel.sem = 250 32000 100 128


fs.file-max = 6815744

fs.aio-max-nr = 1048576


net.ipv4.ip_local_port_range = 9000 65500


net.core.rmem_default = 262144

net.core.wmem_default = 262144


kernel.core_uses_pid = 1

fs.suid_dumpable = 1


이 값은 최소한의 값이며 시스템의 상황에 따라 별도로 튜닝을 해 주어야 할 경우도 발생한다.

파라미터들의 값이 적절하지 않으면 installer가 log 파일을 통해서 상세하게 투덜거려 주므로 tail로 log 파일을 반드시 모니터링 하도록 한다.


fs.suid_dumpable 설정은 CentOS 버전에 따라 deprecated 되었을 수도 있으니 참고로 알아두자.


2. 의존하는 패키지 설치


yum install 명령으로 아래의 패키지들을 설치한다. x64 OS라 하더라도 i386에 해당되는 필수 패키지는 반드시 설치하여야 함에 유의한다.


zip.x86_64 unzip.x86_64

ksh.x86_64

perl.x86_64

binutils.x86_64 binutils220.x86_64

libaio.x86_64 libaio-devel.x86_64

libaio.i386 libaio-devel.i386

pdksh.x86_64

compat-libstdc++-33.x86_64

compat-gcc-34.x86_64

libstdc++.i386

libgcc.i386

elfutils.x86_64 elfutils-libelf.x86_64

elfutils-libelf-devel.x86_64

sysstat

unixODBC.x86_64 unixODBC-devel.x86_64

unixODBC.i386 unixODBC-devel.i386


3. VM 방화벽 설정


my.cloudn.co.kr 에 접속하여, Network Filter 메뉴에서 Oracle_sec_rule 와 같은 rule을 정의하고 등록한다. 기본적으로 linux VM이므로 ssh용 TCP 22, ICMP 등을 개방하여야 하며, 이에 덧붙여 Oracle에 접속할 PC나 서버의 IP와 TCP port(1521)를 등록하고 저장한다.


Security Group 메뉴에서 보안그룹을 등록하고, VM NIC그룹맵 수정 기능을 선택, Oracle이 설치되는 VM을 선택하고, 보안관리 드롭다운에서 위에서 등록한 rule을 선택, 운영대상여부를 체크하고 저장, 적용 여부를 묻는 질문에 '예'를 선택하면 방화벽 설정이 종료된다.


접속이 허용되도록 설정된 PC 등에서  telnet oracle_server_ip 1521 와 같이 명령을 실행하여 TCP 포트가 잘 개방되었는지 확인해 보자.


[설치 파일 다운로드, VM에 복사]


www.oracle.com 사이트에 가입하고 oracle 11gr2 에 해당하는 파일들을 다운로드 받는다.


linux.x64_11gR2_database_1of2.zip

linux.x64_11gR2_database_2of2.zip


* 참고: 보통은 오라클 설치 후 패치 파일 또는 패치셋을 애드온 개념으로 설치해야 하지만, 11gr2 linux판의 패치셋은 10g와 같은 이전 버전과 달리 '패치'가 아닌 '재설치', 즉 전체 설치방식(애들 말로 완전체...)이므로 만약 적용할 경우 기존 데이터를 반드시 백업해야 한다.


설치할 VM에 /home/data 디렉토리로 추가 디스크인 /dev/sdb1 을 마운트(/etc/fstab 파일에 설정)해 두고, oracle_zip_file 와 같은 서브디렉토리를 만들고 local PC에서 VM으로 복사해 넣는다. windows 계열의 PC에서 다운로드 받았다면 winscp 같은 훌륭한 무료 프로그램으로 linux 서버에 업로드 해 넣을 수 있다.

 

oraserver# mount -t ext3 /dev/sdb1 /home/data

mypc# scp -i ~/sec_key/mykey.pem linux.x64_11gr2_database_* root@vm_ip:/home/data/oracle_zip_files


[설치 준비]


root 계정으로 oracle계정과 그룹을 다음과 같이 생성한다.

# groupadd -g 5000 dba

# useradd -g dba oracle

# passwd oracle


Oracle inventory(log, 설치 실행을 위한 임시 작업 디렉토리)는 /home/oracle/oraInventory 로 하기로 한다.

# vi /etc/oraInst.loc

inventory_loc=/home/oracle/oraInventory

inst_group=dba


# chown oracle.dba /etc/oraInst.loc


# vi /etc/pam.d/login (라인 추가)

session    required     pam_limits.so


# vi /etc/security/limits.conf (라인 추가)

oracle       soft    nproc   2047

oracle       hard    nproc   16384

oracle       soft    nofile  1024

oracle       hard    nofile  65536


Oracle 데이터베이스의 실제 설치 위치(ORACLE_BASE)는 /home/data/oracle 로, 데이터베이스명(Global database name, ORACLE_SID)은 gdbora1으로 하기로 하자.

# su - oracle

# vi .bash_profile

export PS1="[\u@\H \w]\$ " # CentOS의 prompt를 바꿔둔다

export EDITOR=vi

export ORACLE_BASE=/home/data/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0

export ORACLE_SID=gdbora1

export ORACLE_TERM=xterm

export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949

export ORA_NLS10=$ORACLE_HOME/nls/data

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib

export PATH=$PATH:$ORACLE_HOME/bin

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

export LANG=C


Oracle 설치를 위한 프로그램 파일, 스크립트, 설정 및 response 파일등을 저장할 위치는 /home/oracle/database 로 한다.

# cd

# unzip /home/data/oracle_zip_files/linux.x64_11gR2_database_1of2.zip

# unzip /home/data/oracle_zip_files/linux.x64_11gR2_database_2of2.zip # 현재 디렉토리에 database 디렉토리가 생성된다


[response(응답) 파일 작성 및 엔진 설치]


# cd ~/database/response

# cp db_install.rsp myresp.rsp


# vi myresp.rsp (아래에 해당하는 라인을 찾아서 편집한다)

oracle.install.option=INSTALL_DB_AND_CONFIG

UNIX_GROUP_NAME=dba

INVENTORY_LOCATION=/home/oracle/OraInventory

SELECTED_LANGUAGES=en,ko

ORACLE_HOME=/home/data/oracle/product/11.2.0

ORACLE_BASE=/home/data/oracle

oracle.install.db.InstallEdition=EE

oracle.install.db.DBA_GROUP=dba

oracle.install.db.OPER_GROUP=dba

oracle.install.db.config.starterdb.globalDBName=gdbora1

oracle.install.db.config.starterdb.SID=gdbora1

oracle.install.db.config.starterdb.memoryLimit=512

oracle.install.db.config.starterdb.installExampleSchemas=true

oracle.install.db.config.starterdb.enableSecuritySettings=true

oracle.install.db.config.starterdb.password.ALL=Oracle123

oracle.install.db.config.starterdb.password.SYS=Oracle123

oracle.install.db.config.starterdb.password.SYSTEM=Oracle123

oracle.install.db.config.starterdb.password.SYSMAN=Oracle123

oracle.install.db.config.starterdb.password.DBSNMP=Oracle123

oracle.install.db.config.starterdb.storageType=FILE_SYSTEM_STORAGE

oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=/home/data/oracle/datadir

oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=/home/data/oracle/backupdir

DECLINE_SECURITY_UPDATES=true


2개의 터미널창에서 동시에 작업한다

# cd ~/database

# ./runInstaller -noconsole -silent -force -waitforcompletion -responseFile /home/oracle/database/response/myresp.rsp


다른 하나의 터미널창에서 runInstaller 가 보여 주는 로그 파일을 tail -f /home/oracle/oraInventory/logs/installAction....log 명령으로 관찰한다.


runInstaller가 성공적으로 동작하여 데이터베이스 엔진이 설치되었다면

......

INFO: Completed executing action at state <finish>

INFO: Waiting for completion of background operations

INFO: Completed background operations

INFO: Moved to state <finish>

INFO: Waiting for completion of background operations

INFO: Completed background operations

INFO: Validating state <finish>

WARNING: Validation disabled for the state finish

INFO: Completed validating state <finish>

INFO: Terminating all background operations

INFO: Terminated all background operations

INFO: Successfully executed the flow in SILENT mode

INFO: Finding the most appropriate exit status for the current application

INFO: Exit Status is -3

INFO: Shutdown Oracle Database 11g Release 2 Installer

와 같은 결과가 확인될 것이다.


[데이터베이스 기동 및 리스너 설정]


root 계정으로 작업한다.

# /home/data/oracle/product/11.2.0/root.sh


oracle 계정으로 DBA 상태로 접속해 본다

# su - oracle

# sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Wed Sep 26 15:55:58 2012


Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> 


리스너를 기동할 준비를 아래와 같이 한다

# vi ~/database/response/netca.rsp (해당 라인 편집)

SHOW_GUI=false

LOG_FILE=""/home/data/oracle/product/11.2.0/log/netca.log""


# cd /home/data/oracle/product/11.2.0/bin/

# ./netca /silent /log /home/data/oracle/product/11.2.0/log/netca.log /responseFile /home/oracle/database/response/netca.rsp


리스너를 기동/정지해 보고 프로세스 상태를 점검하자

# lsnrctl stop

# lsnrctl start

# lsnrctl status

# ps -eaf | grep -v grep | grep oracle


[데이터베이스 스키마 생성, 연결 설정]


oracle 계정으로 작업한다.


# vi /home/oracle/database/response/dbca.rsp (해당 라인 편집)

GDBNAME = "gdbora1"

SID = "gdbora1"

SYSPASSWORD = "Oracle123"

SYSTEMPASSWORD = "Oracle123"

NATIONALCHARACTERSET= "UTF8"


# cd /home/data/oracle/product/11.2.0/bin/

# ./dbca -silent -templateName /home/data/oracle/product/11.2.0/assistants/dbca/templates/General_Purpose.dbc -responseFile /home/oracle/database/response/dbca.rsp

Copying database files

1% complete

3% complete

11% complete

18% complete

26% complete

37% complete

Creating and starting Oracle instance

40% complete

45% complete

50% complete

55% complete

56% complete

60% complete

62% complete

Completing Database Creation

66% complete

70% complete

73% complete

85% complete

96% complete

100% complete

Look at the log file "/home/data/oracle/cfgtoollogs/dbca/gdbora1/gdbora1.log" for further details.


수행결과를 log 파일을 통해 확인해 보자

# cat /home/data/oracle/cfgtoollogs/dbca/gdbora1/gdbora1.log


리스너가 정상 작동하는지 확인한다

# lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 26-SEP-2012 16:50:24


Copyright (c) 1991, 2009, Oracle.  All rights reserved.


Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date                26-SEP-2012 16:40:38

Uptime                    0 days 0 hr. 9 min. 45 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /home/data/oracle/product/11.2.0/network/admin/listener.ora

Listener Log File         /home/data/oracle/diag/tnslsnr/vm00046-1/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=host_ip_address)(PORT=1521)))

Services Summary...

Service "gdbora1" has 1 instance(s).

  Instance "gdbora1", status READY, has 1 handler(s) for this service...

Service "gdbora1XDB" has 1 instance(s).

  Instance "gdbora1", status READY, has 1 handler(s) for this service...

The command completed successfully


# sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Wed Sep 26 15:55:58 2012


Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> connect / as sysdba

Connected.

SQL> select status from v$instance;


STATUS

------------------------

OPEN


SQL> 



[클라이언트 접속 환경 설정과 그 이후...]


아래 링크를 통해 'instant client'를 다운로드 받고 OCI 를 설치하여야 한다.

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html


 설치 가능한 풀 버전은 아래 링크를 통해 다운로드 받을 수 있다.

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html


<주> Windows에서 Toad for oracle을 사용한다면 64bit용 instant client를 다운로드 받으면 oci.dll 이 로딩되지 않고 toad에서 oracle 접속이 되지 않는다. 이는  Quest software에서 여전히 32bit 버전의 toad.exe를 고수하고 있기 때문인데, 구글링 해 보면 registry 를 조작하는 방법으로 잘 정리한 문서들이 많이 있으니 참조해서 문제를 해결하자.


TNSNAMES.ora 편집 및 데이터베이스 접속에 대해서는 개발자 입장의 지식이고, 이미 많은 개발자들이 다루고 있는 부분이므로 본 포스팅의 성격과 맞지 않아서 생략한다.



- Barracuda -



저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


(참고)Opensuse 에서는 본 과정이 필요하지 않았음.
CentOS에서 별도로 ctype의 설정이 필요한 것을 보면 RHEL 등의 redhad 계열에서 모두 필요한 과정으로 보임.

Dependancy: fuse, fuse-devel, flex, bison, python-devel, ctype

위의 의존성 있는 패키지들을 모두 설치하여야 한다.
단, ctype은 기본 centOS repository 에 포함되어 있지 않으므로 Source로 다운로드해서 빌드한다.

 # wget wget  http://downloads.sourceforge.net/project/ctypes/ctypes/1.0.2/ctypes-1.0.2.tar.gz
# tar xvzf  ctypes-1.0.2.tar.gz
# cd  ctypes-1.0.2
# python setup.py build
# python setup.py install

이제 Gluster Source를 다운로드하고 설치한다.

# wget http://download.gluster.com/pub/gluster/glusterfs/3.2/3.2.2/glusterfs-3.2.2.tar.gz
# tar xvzf glusterfs-3.2.2.tar.gz
# cd  glusterfs-3.2.2
# ./configure --enable-fusermount
# make && make install
# ldconfig

Gluster volume 을 마운트하고 테스트해본다
# mount -t glusterfs w.x.y.z:/volname /local_mount_point


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


(MySQL은 Percona XtraDB 5.1.49 기준)
binutils
automake
libtool 
bison 
make 
termcap 
libtermcap.x86_64 
libtermcap-devel.x86_64 
gcc
gcc-c++.x86_64 
libstdc++.x86_64 
ncurses 
ncurses-devel.x86_64 
glibc.x86_64 
glibc-common.x86_64 
glibc-devel.x86_64 
glibc-headers.x86_64 
glibc-utils.x86_64


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

Tag centos, mysql

시스템 설정이 많으므로 root 계정에서 작업(/root/src)
dev.mysql.com 에서 소스 다운로드(mysql-5.1.45.tar.gz)

압축해제, make 준비
# tar -xvzf mysql-5.1.45.tar.gz
# ./configure --prefix=/user/service/mysql \ --> 주요파일 설치 위치(bin, libexec, lib, ...Default는 /usr/local/mysql)
> --localstatedir=/user/service/mysql/data \ --> 데이터, 로그 저장 위치
> --sysconfdir=/user/service/mysql \ --> 기본 설정파일 my.cnf 등 저장 위치
> --with-mysqld-user=mysql \ --> Daemon 실행 계정
> --with-charset=utf8 --with-extra-charsets=all \ --> 기본 charset 지정
> --with-tcp-port=9998 \ --> 접속용 TCP port(기본 3306)
> --with-plugins=innobase \ --> innodb용 plugin
> --enable-shared \
> --enable-assembler \

빌드 및 설치
# make && make install
Daemon 실행 계정 추가
# useradd -M mysql

data저장소 초기데이터 생성
# cd /user/service/mysql/bin
# ./mysql_install_db --user=mysql ==> /user/service/mysql/data 에 mysql, test 디렉토리 생성됨
mysql 계정권한 설정
# cd /user/service/mysql
# chown -R mysql.mysql ./data/

mysql loading시 참조될 설정파일 준비
# cd /user/service/mysql/share/mysql

# cp my-huge.cnf /user/service/mysql/my.cnf ==> configuration type 선택(small, medium, ..., huge)
# vi my.cnf ==> charset 등 지정

# vi ~/.bash_profile
PATH=$PATH:/user/service/mysql/bin
# vi /etc/skel/.bash_profile
PATH=$PATH:/user/service/mysql/bin
# source ~/.bash_profile

# cp /user/service/mysql/share/mysql/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig --list | grep mysqld ==> Run level별 start/stop 설정 확인(0:off  1:off  2:on   3:on   4:on   5:on   6:off)

# /etc/init.d/mysqld start ==> MySQL Daemon 실행
# mysqladmin -u root password **** ==> root password 지정



저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들