본문 바로가기

Technical/Cloud, Virtualization, Containers

[OpenShift v3 #2] Origin 3-node, CentOS 7 기반 3노드 설치, 사용 방법(2/3)


지난 회에서 OpenShift Origin v3의 단일서버 구성 설치와 간단한 사용법을 정리하였다, 이번 회에서는 3-노드 구성의 OpenShift v3 설치 과정과와 Kubernetes, OpenShift console 및 CLI를 통한 Orchestration과 몇가지의 Use Case를 정리해 두고자 한다(이 글을 마지막으로 업데이트하는 시점에 OpenShift 릴리즈가 1.5.0으로 바뀌었다. 아래 설정 파일에서 v1.5.0으로 표시된 부분 참고=>1.5.0에 버그가 아직 많아 보이고, 결정적으로 1.5.1이 나온 시점에 docker 기반 설치에 오류가 발생하여 1.4.1 버전 기준으로 긴급히 되돌림 2017-05-27).



사전 설정(Pre-requisites)

  • 서버 구성(권장 최소 스펙)
    - OS는 CentOS 7.3(64bit r1611), Minimal Server 버전
    - Master: 4 CPU, 6 G memory, 20G+40G(추가디스크) Disk, 추가디스크는 /mnt/persistent-volumes 에 마운트
    - Node01: 2 CPU, 4 G memory, 20G
    - Node02: 2 CPU, 4 G memory, 20G 

  • Release v1.5.0 부터는 Master부터 순서대로 16G/8G/8G 메모리를 권고하며 충족이 안될 경우 fail 되게 바뀌었다(ansible-playbook 실행시 -e openshift_disable_check=memory_availability 옵션 추가 필요)
  •  내부 테스트 또는 외부 서비스용 별도 DNS 서버 필요(DNS 설정 방식은 이전 포스팅(#1) 참조
    - 단일 노드가 아닌 3-노드 구성에 대한 DNS 설정 부분의 차이점 확인 필요
  • 도메인, IP 주소에 대한 부분은 설치 환경과 요구 사항에 맞게 꼼꼼하게 대조하여 오류가 없도록 진행하는 것이 중요



  • DNS forwarding 을 위한 설정 내용(192.168.0.0/16 네트워크 사용시).


[root@dns ~]# cat /etc/named.conf 

options {

listen-on port 53 { any; };

directory  "/var/named";

dump-file  "/var/named/data/cache_dump.db";

statistics-file "/var/named/data/named_stats.txt";

memstatistics-file "/var/named/data/named_mem_stats.txt";


allow-query     { any; };

recursion yes;


// For non-internal domains

forwarders {

168.126.63.1;

8.8.8.8;

};

auth-nxdomain no; # conform to RFC1035

dnssec-enable yes;

// dnssec-validation yes;

dnssec-lookaside auto;


/* Path to ISC DLV key */

bindkeys-file "/etc/named.iscdlv.key";


managed-keys-directory "/var/named/dynamic";


pid-file "/run/named/named.pid";

session-keyfile "/run/named/session.key";

};


logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};


zone "." IN {

type hint;

file "named.ca";

};


include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";


[root@dns ~]# cat /etc/named.rfc1912.zones

...(생략)...

zone "0.in-addr.arpa" IN {

type master;

file "named.empty";

allow-update { none; };

};


zone "test.local" IN {

        type master; // server type

        file "test.local.zone"; // zone file

        allow-update {none;}; // none: no slave to sync

};


zone "168.192.in-addr.arpa" IN { // Reverse

        type master;

        file "/var/named/rev.168.192.in-addr.arpa";

};


[root@dns ~]# cat /var/named/test.local.zone

$ORIGIN .

$TTL 10


test.local.    IN    SOA    dns.test.local.    root.test.local. (

2017031402    ; serial

1D       ; refresh

1H       ; retry

1W      ; expire

3H )    ; min(Negative cache TTL)

test.local.          IN    NS    dns.test.local.

dns.test.local.    IN    A    192.168.0.3


$ORIGIN    test.local.


osmaster        IN      A       192.168.10.160

osnode01        IN      A       192.168.10.161

osnode02        IN      A       192.168.10.162

*.apps          IN      CNAME   osmaster.test.local.


[root@dns ~]# cat /var/named/rev.168.192.in-addr.arpa 

$TTL 10


@    IN    SOA    dns.test.local.    root.test.local. (

2017031403 ; serial

1D ; refresh

1H ; retry

1W ; expire

3H ) ; min(Negative cache TTL)

test.local.          IN    NS    dns.test.local.

dns.test.local.    IN    A    192.168.0.3


@      IN NS      dns.test.local.

3.0    IN PTR    dns.test.local.


160.10    IN PTR    osmaster.test.local.

161.10    IN PTR    osnode01.test.local.

162.10    IN PTR    osnode02.test.local.



  • 준비된 각각의 노드에서 다음과 같은 사전설치 과정을 따른다
[Master노드: osmaster]

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

...

NETMASK=255.255.0.0

DNS1=192.168.0.3

DNS2=8.8.8.8

# hostnamectl set-hostname osmaster

# yum install -y bind-utils

# nslookup osmaster.test.local

# dig yahoo.com a


# cat /etc/selinux/config 

...

SELINUX=enforcing

...

SELINUXTYPE=targeted


# vi /etc/hosts

...

192.168.10.160 osmaster osmaster.test.local

192.168.10.161 osnode01 osnode01.test.local

192.168.10.162 osnode02 osnode02.test.local


# ssh-keygen

# ssh-copy-id root@osmaster.test.local

# ssh-copy-id root@osmaster

# ssh-copy-id root@osnode01.test.local

# ssh-copy-id root@osnode01

# ssh-copy-id root@osnode02.test.local

# ssh-copy-id root@osnode02


[root@osmaster ~]# domain="test.local"


[root@osmaster ~]# for node in {osmaster.$domain,osnode01.$domain,osnode02.$domain}; do ssh root@$node "yum clean all; yum install -y git bind-utils iptables-services net-tools wget bash-completion chrony; yum update -y"; done


[root@osmaster ~]# systemctl enable iptables

[root@osmaster ~]# systemctl start iptables

[root@osmaster ~]# systemctl enable firewalld

[root@osmaster ~]# systemctl start firewalld

[root@osmaster ~]# firewall-cmd --add-service=ntp --permanent

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


[root@osmaster ~]# for node in {osnode01.$domain,osnode02.$domain}; do scp /etc/hosts root@$node:/etc/hosts; done

hosts                                                                                               100%  230     0.2KB/s   00:00    

hosts                                                                                               100%  230     0.2KB/s   00:00    

* 만약 iptables 설치시 "Failed to start iptables.service: Unit is masked." 와 같은 오류가 발생하면 'systemctl unmask iptables" 로 해결한다



[root@osmaster ~]# vi /etc/chrony.conf

server time.bora.net iburst

...

# Allow NTP client access from local network.

allow 192.168.0.0/16

...

# Serve time even if not synchronized to any NTP server.

local stratum 10

...


[root@osmaster ~]# systemctl enable chronyd

[root@osmaster ~]# systemctl restart chronyd

[root@osmaster ~]# chronyc tracking

[root@osmaster ~]# chronyc sources -v


[Node01노드: osnode01]

[root@osnode01 ~]# hostnamectl set-hostname osnode01

[root@osnode01 ~]# vi /etc/chrony.conf

server 192.168.10.160 iburst

...

# Serve time even if not synchronized to any NTP server.

local stratum 10

...


[root@osnode01 ~]# systemctl enable chronyd

[root@osnode01 ~]# systemctl restart chronyd

[root@osnode01 ~]# chronyc tracking

[root@osnode01 ~]# chronyc sources -v



[Node02노드: osnode02]

[root@osnode01 ~]# hostnamectl set-hostname osnode02

[root@osnode02 ~]# vi /etc/chrony.conf

server 192.168.10.160 iburst

...

# Serve time even if not synchronized to any NTP server.

local stratum 10

...


[root@osnode02 ~]# systemctl enable chronyd

[root@osnode02 ~]# systemctl restart chronyd

[root@osnode02 ~]# chronyc tracking

[root@osnode02 ~]# chronyc sources -v



OpenShift v3 설치 시작


  • EPEL repo를 설정하고 필요한 패키지 설치(여기서부터는 모든 설정 작업을 Master node 에서만 수행)
[Master노드: osmaster]

# yum install -y epel-release

# yum install -y docker

# yum install -y python-cryptography pyOpenSSL.x86_64 java-1.8.0-openjdk-headless python-passlib

# yum install -y python-pip python-devel

# pip install --upgrade pip

# pip install ansible


  • NFS를 persistent storage 로 설치하기 위해 nfs-server 설치, 설정
    - Persistent Volume은 iSCSI, Ceph RBD, GlusterFS, OpenStack Cinder, AWS EBS, Google Cloud Persistent Disk, Fibre Channel 등을 모두 지원
    - 여기서는 여러 인스턴스(컨테이너)들의 공유 사용이 가능함을 확인하기 위해 대표적인 Shared File System인 NFS를 사용

[root@osmaster ~]# yum groupinstall -y file-server

[root@osmaster ~]# systemctl enable rpcbind

[root@osmaster ~]# systemctl enable nfs-server

[root@osmaster ~]# systemctl start rpcbind

[root@osmaster ~]# systemctl start nfs-server

[root@osmaster ~]# iptables-save > pre-nfs-firewall-rules-server

[root@osmaster ~]# iptables -I INPUT -m state --state NEW -p tcp -m multiport --dport 111,892,2049,32803 -s 0.0.0.0/0 -j ACCEPT

[root@osmaster ~]# iptables -I INPUT -m state --state NEW -p udp -m multiport --dport 111,892,2049,32769 -s 0.0.0.0/0 -j ACCEPT

[root@osmaster ~]# service iptables save

[root@osmaster ~]# setsebool -P virt_use_nfs 1


  • Persistent Metrics Volume for Hawkular Metrics
    - Volume 설정 후 nfs-server 서비스가 정상 작동하는지 확인 필요

[root@osmaster ~]# DIR=/mnt/persistent-volumes/metrics

[root@osmaster ~]# mkdir -p $DIR; chmod 777 $DIR

[root@osmaster ~]# chown nfsnobody:nfsnobody $DIR

[root@osmaster ~]# echo "$DIR 192.168.0.0/16(rw,all_squash)" >> /etc/exports

[root@osmaster ~]# systemctl restart nfs-server

[root@osmaster ~]# systemctl status nfs-server


  • OpenShift Ansible 패키지와 configuration 소스 설치, 설정
    - Auto-scale을 위한 hawkular metrics 설치/설정 포함

# git clone https://github.com/DragOnMe/openshift-ansible.git

# git clone https://github.com/DragOnMe/playbook-allinone-cfg.git

# # v1.5 기준, 아래 내용 삭제

# cd openshift-ansible

# git branch -a

* master

  remotes/origin/HEAD -> origin/master

  remotes/origin/master

  remotes/origin/release-1.1

  remotes/origin/release-1.2

  remotes/origin/release-1.3

  remotes/origin/release-1.4

  remotes/origin/release-1.5

  remotes/origin/stage

  remotes/origin/stage-130

  remotes/origin/stage-131

# git checkout remotes/origin/release-1.4

Note: checking out 'remotes/origin/release-1.4'.


You are in 'detached HEAD' state. You can look around, make experimental

changes and commit them, and you can discard any commits you make in this

state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may

do so (now or later) by using -b with the checkout command again. Example:


  git checkout -b new_branch_name


HEAD is now at 7493438... Automatic commit of package [openshift-ansible] release [3.4.1.29-1].

# cd .. 

# vi playbook-allinone-cfg/centos7-3node-playbook.cfg

[OSEv3:children]

masters

nodes


[OSEv3:vars]

ansible_ssh_user=root

deployment_type=origin

containerized=true


# Examples

openshift_install_examples=true


# Persistent metrics over NFS or Dynamic storage

openshift_hosted_metrics_deploy=true

openshift_hosted_metrics_storage_kind=nfs

openshift_hosted_metrics_storage_access_modes=['ReadWriteMany']

openshift_hosted_metrics_storage_nfs_directory=/mnt/persistent-volumes

openshift_hosted_metrics_storage_nfs_options='*(rw,root_squash)'

openshift_hosted_metrics_storage_volume_name=metrics

openshift_hosted_metrics_storage_volume_size=5Gi

openshift_hosted_metrics_storage_host=osmaster.test.local

openshift_hosted_metrics_public_url=https://hawkular-metrics.apps.test.local/hawkular/metrics


# htpasswd authentication

openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}]


# release and image tag

openshift_release=v1.5

openshift_image_tag=v1.5.0

#openshift_pkg_version=-1.5.0


# router node

openshift_hosted_router_selector='region=infra'


# subdomain

openshift_master_default_subdomain="apps.test.local"


# pods placement

osm_default_node_selector='region=primary'


[masters]

osmaster.test.local openshift_public_hostname="osmaster.test.local" openshift_schedulable=true


[nodes]

osmaster.test.local openshift_node_labels="{'region': 'infra', 'zone': 'default'}"

osnode01.test.local openshift_node_labels="{'region': 'primary', 'zone': 'datacenter1'}" openshift_schedulable=true

osnode02.test.local openshift_node_labels="{'region': 'primary', 'zone': 'datacenter2'}" openshift_schedulable=true


[root@osmaster ~]# ansible-playbook -i ./playbook-allinone-cfg/centos7-3node-playbook.cfg ./openshift-ansible/playbooks/byo/config.yml -e openshift_disable_check=memory_availability,disk_availability


PLAY [Create initial host groups for localhost] **************************************************************************************


TASK [include_vars] ******************************************************************************************************************

ok: [localhost]


TASK [Evaluate group l_oo_all_hosts] *************************************************************************************************

ok: [localhost] => (item=osmaster.test.local)

ok: [localhost] => (item=osnode01.test.local)

ok: [localhost] => (item=osnode02.test.local)


PLAY [Create initial host groups for all hosts] **************************************************************************************


TASK [include_vars] ******************************************************************************************************************

ok: [osmaster.test.local]

ok: [osnode01.test.local]

ok: [osnode02.test.local]


PLAY [Populate config host groups] ***************************************************************************************************


TASK [fail] **************************************************************************************************************************

 [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ g_etcd_hosts is not

defined }}


skipping: [localhost]

...

...

...

TASK [openshift_excluder : Enable docker excluder] ***********************************************************************************

changed: [osmaster.test.local]

changed: [osnode02.test.local]

changed: [osnode01.test.local]


TASK [openshift_excluder : Check for openshift excluder] *****************************************************************************

ok: [osmaster.test.local]

ok: [osnode01.test.local]

ok: [osnode02.test.local]


TASK [openshift_excluder : Enable openshift excluder] ********************************************************************************

changed: [osnode01.test.local]

changed: [osnode02.test.local]

changed: [osmaster.test.local]


PLAY RECAP ***************************************************************************************************************************

localhost                  : ok=9    changed=0    unreachable=0    failed=0   

osmaster.test.local      : ok=617  changed=104  unreachable=0    failed=0   

osnode01.test.local      : ok=275  changed=41   unreachable=0    failed=0   

osnode02.test.local      : ok=272  changed=39   unreachable=0    failed=0   



  • Containerized 방식의 ansible-playbook을 통한 자동 설치 과정은 하드웨어 성능에 따라 다르겠지만, 대략 10~20분 정도 소요된다
  • [nodes] 영역의 master 부분에서 openshift_schedulable=true 로 하지 않으면 registry 등의 필수적 docker container가 deploy 되지 않아서 OpenShift Cluster가 정상 작동하지 않음에 유의  
  • 오류 없이 성공적으로 수행 된 경우, 최종 출력되는 라인들에서 각 노드 별로 failed=0 값이 출력되어야 한다.
  • 실행 도중 오류가 나는 경우, 진행되었던 설치 과정의 흔적을 다음과 같은 명령으로 Clear 한 후, 각종 문제(주로 selinux 설정, firewalld-iptables, nfs 마운트, URL 오류 관련 문제 등)을 해결하고, 위의 ansible-playbook 명령으로 다시 설치를 시도해야 한다
  • 진행된 모든 과정을 이전 상태로 되돌리기 위해서는 아래 과정을 참고한다

[root@osmaster ~]# ansible-playbook -i ./playbook-allinone-cfg/centos7-3node-playbook.cfg ./openshift-ansible/playbooks/adhoc/uninstall.yml

[root@osmaster ~]# iptables -t nat -F; iptables -F

[root@osmaster ~]# rm -rf /mnt/persistent-volumes/*

[root@osmaster ~]# rm -f /etc/exports


  • 최초 OpenShift 계정으로 guest 계정 생성, 접속 테스트

[root@osmaster ~]# cd /etc/origin/master/

[root@osmaster ~]# cat htpasswd

[root@osmaster ~]# htpasswd -b /etc/origin/master/htpasswd guest openshift

[root@osmaster ~]# oc login

Authentication required for https://osmaster:8443 (openshift)

Username: guest

Password: 

Login successful.


You don't have any projects. You can try to create a new project, by running


    oc new-project <projectname>


[root@osmaster ~]# oc status

Error from server: User "guest" cannot get projects in project "default"

[root@osmaster ~]# oc logout

Logged "guest" out on "https://osmaster:8443"


  • OpenShift용 Persistent Volume 생성(2GB * 15)
    - 사전에 만들어 두고 인스턴스들이 가져다 쓰는 개념으로, 개별 볼륨의 크기와 갯수는 스토리지의 크기와 상황에 맞게 조정
    - Persistent(지속적인) 스토리지에 반대되는 개념은 Ephemeral(일회용의, 단명하는) 스토리지로, Docker가 기본적으로 사용하는 스토리지는 /tmp/ 영역을 사용하는 AUFS(Union 파일시스템) 방식이며, Docker 컨테이너가 삭제되면 이 영역의 데이터도 같이 사라짐
    - 볼륨의 크기 지정 방법과 옵션에 대해서는 Kubernetes Resource Model 을 참고

[root@osmaster ~]# vi playbook-allinone-cfg/pv.json

{

 "apiVersion": "v1",

 "kind": "PersistentVolume",

 "metadata": {

 "name": "pv001"

},

"spec": {

   "capacity": {

   "storage": "2Gi"

   },

   "accessModes": [ "ReadWriteMany" ],

   "nfs": {

      "path": "/mnt/persistent-volumes/pv001",

      "server": "192.168.10.160"

   },

   "persistentVolumeReclaimPolicy": "Recycle"

   }

}


[root@osmaster ~]# oc login -u system:admin

[root@osmaster ~]# for i in `seq -w 001 015`; do \

SHARE=/mnt/persistent-volumes/pv$i; \

mkdir -p $SHARE; chmod 777 $SHARE; \

chown nfsnobody:nfsnobody $SHARE; \

echo "$SHARE 192.168.0.0/16(rw,all_squash)" >>/etc/exports; \

sed s/pv001/pv$i/g /root/playbook-allinone-cfg/pv.json | oc create -f -; \

done

persistentvolume "pv001" created

persistentvolume "pv002" created

persistentvolume "pv003" created

persistentvolume "pv004" created

persistentvolume "pv005" created

persistentvolume "pv006" created

persistentvolume "pv007" created

persistentvolume "pv008" created

persistentvolume "pv009" created

persistentvolume "pv010" created

persistentvolume "pv011" created

persistentvolume "pv012" created

persistentvolume "pv013" created

persistentvolume "pv014" created

persistentvolume "pv015" created

[root@osmaster ~]# oc get pv

NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     REASON    AGE

pv001     2Gi        RWX           Recycle         Available                       9s

pv002     2Gi        RWX           Recycle         Available                       8s

pv003     2Gi        RWX           Recycle         Available                       8s

pv004     2Gi        RWX           Recycle         Available                       8s

pv005     2Gi        RWX           Recycle         Available                       8s

pv006     2Gi        RWX           Recycle         Available                       7s

pv007     2Gi        RWX           Recycle         Available                       7s

pv008     2Gi        RWX           Recycle         Available                       7s

pv009     2Gi        RWX           Recycle         Available                       7s

pv010     2Gi        RWX           Recycle         Available                       6s

pv011     2Gi        RWX           Recycle         Available                       6s

pv012     2Gi        RWX           Recycle         Available                       6s

pv013     2Gi        RWX           Recycle         Available                       6s

pv014     2Gi        RWX           Recycle         Available                       5s

pv015     2Gi        RWX           Recycle         Available                       5s


## Openshift 재설치 등을 위한 삭제시에는 oc delete pv <pv-name> 으로 개별 볼륨을 삭제하거나 다음과 같이 한번에 삭제할 수도 있다(데이터 유실에 유의해야 함)
[root@osmaster ~]# for i in `seq -w 001 015`; do oc delete pv pv$i; done
[root@osmaster ~]# rm -rf /mnt/persistent-volumes/metrics

  • Openshift 재시작, Guest 및 관리자 계정(admin) 생성

[root@osmaster ~]# systemctl restart origin-master reboot

[root@osmaster ~]# htpasswd -b /etc/origin/master/htpasswd admin openshift

[root@osmaster ~]# oc login -u system:admin

[root@osmaster ~]# oadm policy add-cluster-role-to-user cluster-admin admin

[root@osmaster ~]# oc get all 



기능 테스트 단계


  • 웹브라우저를 통해 https://osmaster.test.local:8443 으로 접속하면 Origin 로그인 화면이 나타나고 guest 계정으로 로그인이 정상적인지 확인해 보자


이게 전부라면 얼마나 좋을까만, 기쁘게도 확인하고 알아둬야 할 내용들이 더 있다(실은 아주 더 많다). 참고로 OpenShift 를 익숙하게 사용하기 위해서는 OpenShift Console Web(GUI)를 통한 기본 사용법, 프로젝트의 구성 현황/상태 확인 방법과 함께 CLI(oc, oadm 등 명령. → 참고) 사용과 빌드/배포 자동화를 위한 yaml 파일 수정/편집과 OpenShift 의 Architecture에 대한 이해가 필요할 듯 싶다. 



  • OpenShift 사용과 활용에 앞서


여기서는 

  • 먼저, Googling으로 쉽게 접해볼 수 있는 오픈소스 프로젝트 2가지를 GibHub 를 통해 연동하여 환경 구축을 한 후, OpenShift로 개발/운영을 수행하는 과정(프로젝트 생성, GitHub연동, Build & Deploy, 테스트 과정)을 살펴본 뒤, 
  • 두 번 째로 Auto-scaling metric 설정을 통한 부하(cpu/memory)에 따른 자동 scale-up/down  을 테스트 해 보고 
  • 세 번 째로 persistent volume 이 없을 때(docker의 ephemeral 특성)와 있을 때(persistent 기능 확보) 각각에 대해 어떤 차이가 보이는지 확인해 본 다음, 위에서 생성한 NFS server를 통한 persistent volume을 공유 스토리지로 사용해 볼 것이다, 



4가지 대표적인 Use Case 경험하기


  • GibHub 를 사용한 개발과정 맛보기 #1 - Spring MVC Showcase(Java)
  • GibHub 를 사용한 개발과정 맛보기 #2 - WordPress Sample & MySQL(PHP)
  • Auto-Scaling 의 사용(Hawkular Metrics)
  • Persistent-Volume 의 사용



  • GibHub 를 사용한 개발과정 맛보기 #1 - Spring MVC Showcase(Java)


spring-mvc-showcase 프로젝트를 포크하고 URL을 복사해 둔다. pom.xml 파일이 있는 Maven 프로젝트(Clone or download 클릭 & URL 복사)


OpenShift 콘솔에 로그인(설치 직후에 생성한 guest 계정 정보 guest / openshift 로 로그인)


New Project 를 선택하고 새로운 프로젝트를 생성(Create)


프로젝트를 생성하면 자동적으로 Add to Project 과정이 실행되고 프로젝트에 추가할 컴포넌트를 선택할 수 있게 된다. 여기서는 Java 선택


OpenShift 는 Java 를 구동할 수 있는 컴포넌트로 WildFly(WAS인 Jboss의 Open 버전) Docker Container를 기본으로 제공한다(Select)


Resource 이름을 적당히 지정하고, 위에서 복사해 둔 GitHub 프로젝트의 URL을 복사(Create)


"Application created." 라는 메시지와 함께 Continue to overview 링크를 누르고 싶게 만드는 화면이 나타난다. 아래에 Command Line Tool인 oc(OpenShift Client) 의 간단한 사용법이 보이는데, 현재 GUI상에서 수행하는 모든 작업들은 oc 명령어로 가능하며, GUI방식보다 디테일한 작업을 위해서는 oc 명령어를 익혀두어야 할 때가 올 수도 있다(일단 클릭)


다음 단계인 Build 과정으로, Summary 탭 내에서 Application의 빌드가 수행되고 있다는 표시로 동적아이콘이 빙빙 돌아가고 있다(View Log 클릭) 


터미널 창에서 oc logs 를 수행한 결과와 동일한 로그 내용이 실시간으로 확인 가능하다. 'Status: ' 우측에 역시 동적아이콘이 빙빙 돌아가고 있으며, Build가 완료되면 'Complete' 로 바뀐다.


Build가 완료되었다. 콘솔 창을 가장 아래로 스크롤해 보면 "Push successful" 이라고 메시지가 나올 것이다. Build가 완료된 직후, OpenShift는 Build된 바이너리 파일들이 담긴 Docker Image를 새로 생성된 Pod에 밀어 넣고 Application 이 실행 가능한 상태로 Deploy를 완료한다


왼쪽 메인 아이콘 목록에서 'Overview' 를 클릭, 프로젝트내 리소스를 확인한다. 하단 직사각형 Box 부분이 하나의 Service 이며, 'sample-01-mvc' 라는 서비스 내에 pod가 1개 위치하고, 해당 컨테이너의 Build 이미지 정보가 왼쪽에 표시된다. 상단에 서비스에 접속할 수 있는 URL(서비스 Routes)이 자동으로 생성되어 있음을 볼수 있다(URL 클릭) 


마지막으로, 현재까지 빌드&배포된 Application의 정상 동작을 확인해 본다. 앞에서 URL을 클릭하면 새로운 탭에서 OpenShift 가 만들어준 Application이 동작하는 웹페이지가 나타난다. 주소 끝에 'spring-mvc-showcase/' 경로를 입력하고 엔터 


Java 개발자에게 친숙한 MVC Showcase 페이지가 성공적으로 수행되었다. 각 탭을 클릭해서 정상 작동하는지 테스트 해보자


     GitHub 프로젝트의 소스를 개발자가 수정하는 경우를 따라가 보자. 일반적으로는 개발자가  git client 로 프로그램을 수정하고, 최종적으로 Origin의 Master Branch 에 수정이 가해지겠지만, 여기서는 단순히 테스트를 위한 것이므로 GitHub에서 Master를 직접 수정하는 것으로 진행한다.  'home.jsp' 파일을 위와 같이 수정하자


수정된 내용을 commit


메인 아이콘을 통해 'Builds > Builds' 클릭


Build 리스트의 빌드명 클릭


'Start Build' 클릭, 아래에 Build 진행 상태가 표시되며, 나머지는 앞서 최초 빌드 진행 과정과 거의 동일하며, 앞서와 마찬가지로 'View Log' 를 통해 진행 상황을 확인할 수 있다. 최종 수행 결과에 대한 확인 과정은 위와 반복되는 내용이므로 생략한다



아래에 이어지는 나머지 3가지 Case는, 페이지 분량이 많은 관계로 3편으로 이어서 연재한다. 


  • GibHub 를 사용한 개발과정 맛보기 #2 - WordPress Sample & MySQL(PHP)
  • Auto-Scaling 의 사용(Hawkular Metrics)
  • Persistent-Volume 의 사용



[연관되는 글]

[OpenShift v3 #1] Origin all-in-one, CentOS 7 기반 단일서버 설치 사용법(1/3)

[OpenShift v3 #3] Origin 3-node, CentOS 7 기반 3노드 설치, 사용 방법(3/3)


- Barracuda -