ELB를 설정하다보면, 세션 체크가 필요한 어플리케이션의 경우, ELB뒤에 연결된 서버에서 다음 요청에서 기존의 서버에서 다른 서버로 분산되어 연결되면 다시로그인 한다거나하는 기존의 세션정보를 잃기때문에 사용자가 처다보고있는 화면이 이상하게 되어버립니다.


이런 경우 Sticky Sessions를 설정해서 쿠키 세션을 기준으로 트래픽을 분배하므로서 이러한 문제를 해결합니다.


주요 설정하게 되는내용은

 - ELB가 설정하는 쿠키를 사용할것인지(사용자가 쿠기가 만료될 시간(초)를 입력)

 - 어플리케이션에서 생성하는 쿠키를 사용할것인지(사용자가 쿠키이름을 입력)



Layer 4에서 설정하는 Classic Type의 ELB에서는 하단의 Description 하단에서 Edit stickyness 버튼을 선택해서 수정하면 됩니다.





Layer 7에서 설정하는 Application ELB에서는 ELB가 요청을 받아서 처리하게될 Target Group의 Attribute Section 에서 수정해줘야 합니다.



부라우저(아래는 크롬)에 AWSELB 로 쿠키가 생성되어 있는것을 확인할수 있습니다.





Posted by Steven J.S Min

댓글을 달아 주세요

Test Environment

    - CentOS Linux release 7.3.1611 (Core)

    - Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic i686)

    - VirtualBox 5.1.24



Guest에서 "mount -t vboxsf share /mnt/share"를 해서 마운트를 시도하려다보면

mount: unknown filesystem type 'vboxsf' 오류가 나올것이다. 이것은 추가로 Guest OS에서 설치 해줘야하는 것이 있기 때문이다.



1. Prepare Addional Package for CentOS

위해서 다운받은(또는 본인의 설치된 VirtualBox디렉토리 어딘가에 있을수있다. 없다면 http://download.virtualbox.org/virtualbox에서 본인의 VirtualBox 맞는 버전의 ISO 파일을 받자. 그리고 이 ISO파일을 VirtualBox의 스토리지 콘틀러에 등록해서 Guest에서 마운트해서 사용할수 있도록 준비한다. 본인의 경우 : VBoxGuestAdditions_5.1.24.iso를 받아서 적용 했음.



2. 패키지를 Update해주고 추가로 필요한 모듈 설치

$> yum update

$> yum install gcc kernel-devel make

$> yum install bzip2



3. 그리고 재 부팅

$> reboot



4. 마운트될 디렉토리(나중에 사용될 공유디렉토리와, ISO를 받은 컨트롤러를 마운트할 디렉토리)생성 및 에드온ISO에있는 실행파일 실행킨다.

$> mkdir /mnt/share

$> mkdir /mnt/cdrom


$> mount -t auto /dev/cdrom /mnt/cdrom

$> cd /mnt/cdrom/

$> ./VBoxLinuxAdditions.run


이젠 호스트 컴퓨터와 CentOS Guest간에 공유할 준비가 되었다.



5. VirtualBox에서 등록해준 공유디렉토리 이름을 이용하여 마운트 해본다.

$> mount -t vboxsf share /mnt/share




*** Ubuntu의 경우 4번부터 실행하면 별다른 이상없이 공유할 폴더를 마운트하는데 문제가 없었습니다.








Posted by Steven J.S Min

댓글을 달아 주세요

도커사용에 처음 작업할때 사용되어지는 커맨드들을 Tomcat 이미지 기준으로 정리해 봅니다.



Docker 서비스 시작

$> service docker start

$> chkconfig docker on  // --> start on boot



Tomcat Docker이미지 받기

$> docker pull tomcat:latest



설치된 Docker이미지 확인

$> docker images



설치된 이미지 삭제

$> docker rmi tomcat:latest



컨테이너 생성

$> docker run -it  -p 8888:8080 --name tomcat8888 tomcat:latest /bin/bash

$> docker run -it  -p 8889:8080 --name tomcat8889 tomcat:latest /bin/bash


컨테이너 생성시 Host컴퓨터와 컨테이너간에 데이터를 공유하고자 하는경우 -v Option을 추가한다.

다음은 컨테이너의 /usr/local/tomcat/logs 디렉토리를 호스트의 /root/dockerfiles/tomcat/logs로 연결한다.

$> docker run -it  -p 8888:8080 -v /root/dockerfiles/tomcat/logs:/usr/local/tomcat/logs --name tomcat8888 tomcat:latest /bin/bash


한개이상 디렉토리를 공유하고자하는 경우.

$> docker run -it  -p 8888:8080 \n

    -v /root/dockerfiles/tomcat/logs:/usr/local/tomcat/logs \n

    -v /root/dockerfiles/tomcat/webapps:/usr/local/tomcat/webapps \n

    --name tomcat8888 tomcat:latest /bin/bash

** -v 옵션을 통해 공유하는 디렉토리는 컨테이너 쪽의 디렉리는 초기화 되면서 안에있는 내용이 모두 삭제된다.



생성된 Docker 컨테이너 확인

$> docker ps

$> docker ps -a



컨테이너 삭제

$> docker rm tomcat8889



다음부터는 start 명령으로 Docker를 실행 및 중지

$> docker start tomcat8888

$> docker stop tomcat8888



Docker컨테이너 안으로 들어가기

$> docker attach tomcat8888



외부 명령으로 컨테이너안의 명령수행

$> docker exec tomcat8888 /usr/local/tomcat/bin/startup.sh



컨테이너끼리 통신을 위해서 네트워크 생성하기

$> docker network create network1

$> docker network ls



동일한 네트웍에서 컨테이너 생성하기

다음은 두개의 Tomcat Server는 Mysql컨테이너와 동일한 네트웍에 존재하기 때문에 서로 통신이 가능해진다.

$> docker run -it  -p 8888:8080 --name tomcat8888 --network network1 tomcat:latest /bin/bash

$> docker run -it  -p 8889:8080 --name tomcat8889 --network network1 tomcat:latest /bin/bash

$> docker run -it  -p 3306:3306 --name steven-mysql --network network1 -e MYSQL_ROOT_PASSWORD=1234 -d mysql:latest


위에서 생성한 MySql에 접속해봅니다. 192.168.56.107은 호스트 서버의 IP다. (컨테이너 생성시 3306 --> 3306 했기때문에 가능)

[root@docker ~]# mysql -h 192.168.56.107 -u root -p

Enter password:


Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MySQL connection id is 3

Server version: 5.7.19 MySQL Community Server (GPL)


Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MySQL [(none)]>



컨테이너 에서 컨테이너 정지없이 빠져나오기

$> Ctrl+p, Ctrl+q






Posted by Steven J.S Min

댓글을 달아 주세요

클라우딩 컴퓨팅환경과 함께 조명받고있는 분야가 서버관리 기술중에 하나인 프로비저닝분야인것 같습니다. 그에따라서 많은 서버관리를 자동화 하고 서버관리 또한 코드화하여 자동화 하는 기술인것 같습니다.

 

최근에 Chef쪽에 기웃기리다 최근에 다시 Puppet쪽으로 리서치하고있습니다. 파죽지세로 올라오는 AWS Puppet보다는 Chef쪽에 있는것 같아 Chef 기대볼까 했었는데, 실제로 Job market에서는 Chef보다는 Puppet 값을 처주는 같고 실제 멜번의 경우 DevOps커뮤니티에서Puppet에대한 수요가 많다는 느낌입니다.

 

간단히 Puppet 서버와 Agent설치하는 과정을 정리해보았습니다.

 

기본적으로 설치는 인터넷에 많이 공개된 가이드를 따라하면 되겠으나 다른 일반 패키지와 특이한점은(?) 서버와 에이전트간에 통신을 위해 처음에SSL인증 절차가 필요하기 때문에 이부분을 미리 이해하면 쉬울것 같습니다.

 

 

Prerequisites

1.     Server              : CentOS Linux release 7.3.1611 (Core)     : puppet.example.com (IP:192.168.56.102)

2.     Agent1             : CentOS Linux release 7.3.1611 (Core)     : cent1.example.com

3.     Agent2             : CentOS Linux release 7.3.1611 (Core)     : cnet2.example.com

 

편의상 모든 서버는 CentOS 사용했습니다.

편의상 모든 테스트를 위해서 관리대상이 되는 Node 두개를 마련했습니다.

설치 진행은 VirtualBox guest OS에서 진행했습니다.

 


 

서버 Hostname 설정 Agent 서버에 Master 서버 등록

Puppet Master server

Hostname 설정 합니다.

/etc/sysconfig/network, /etc/hosts 파일을 편집하고 hostname 커맨드를 이용하여 설정할수도 있지만 CentOS 7 에서는hostnamectl 이용하여 간단히 변경할 있습니다.

$> hostnamectl status : 현재 설정확인

$> hostnamectl set-hostname puppet.example.com                 : Hostname 설정 

 

Puppet Agent(cent1, cent2)

Hostname 설정 합니다.

$> hostnamectl set-hostname cent1.example.co                      : For Agent1

$> hostnamectl set-hostname cent2.example.co                      : For Agent2

 

참조 : 

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec_Configuring_Host_Names_Using_hostnamectl.html

 

서버 Hostname 설정 Agent 서버에 Master 서버 등록

Puppet서버는 클라이언트와 8140포트를 통해서 통신하기 때문에 해당포트가 열려있어야 합니다. CentOS firewall-cmd 명령을 이용하여(없으면 설치하셔야할것 같습니다.) 간단히 설정할 있습니다.

$> firewall-cmd –add-port=8140/tcp

$> firewall-cmd –add-port=8140/tcp --permanent      : 영구적으로 반영합니다.

 

그리고 Agent서버의  “/etc/hosts”파일을 열어서 마스터 서버를 등록해줍니다.

 

192.168.56.102 puppet puppet.example.com 






 

이젠 Server Agent 설치할 준비가 되었습니다.

Enable the official Puppet Labs collection repository

대부분 서버에는 기본적으로 Puppet 설치하기위한 리포지토리가 없기때문에 서버와 클라이트쪽 모두에게 Puppet Lab 리파지토리 컬렉션을 등록해줘야 합니다.

 

$> rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm

명령을 실행하고 나면, /etc/yum.repos.d/ puppetlabs-xx.repo 등록되어 있는 것을 확인 있을 것입니다.

 

참고로 패키지 관리자별 리포지토리 파일을 다음의 URL에서 확인 있으며 선택적으로 등록할 있습니다.

§  http://yum.puppetlabs.com

§  http://apt.puppetlabs.com/

 



 

Puppet 서버 설치/실행

다음 커맨드로 설치하면 기본 설치는 끝납니다.

$> yum -y install puppetserver

 

Puppet서버는 기본적으로 JVM으로 구동됩니다. 그래서 실제로 프로세스를 확인해보면 서버는 서버에 설치된 java 이용하여 서버를 구동하면서 여러가지 설치된 jar 파일이 –cp 걸려있는 것을 확인할수있습니다.

 

설치후 기본적으로 JVM 메모리옵션 puppet환경 설정 중에 JVM 옵션으로 -Xms3g –Xmx3g 잡혀있는데요 이것은 관리되어지는 Node에따라 조정되어야하는데 현재 로컬에서 테스트 하므로 저의 경우-Xms500m -Xmx500m 조정하는것이 좋을것 같습니다.

$> vi /etc/sysconfig/puppetserver

 

 

이제 서버를 실행합니다.

$> systemctl start puppetserver

$> systemctl enable puppetserver                    : 서버가 시작되면 자동 시작되도록

$> systemctl stop puppetserver                        : 서버 중지

 

 


Puppet Agent서버 설치/실행

다음 커맨드로 에이전트를 설치합니다.

$> yum -y install puppet-agent

 

다음 커맨드로 에이전트를 실행합니다.

$> /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true

 

 

 

에이전트를 처음 실행하면 에이전트는 서버에서 SSL인증 요청을 하게됩니다.

그러면 서버에서 해당 요청에 대해서 Sign 해주면 그때부터 Agent Puppet 관리대상이 되는 Node 되어집니다.

 

위의 명령이 처음 실행된 상태라면 서버에서 요청된 내용을 다음과 같이 확인 할수 있습니다.

$> puppet cert list

 

그러면 대기준인 목록이 나타납니다.

"cent1.example.com" (SHA256) EB:62:~~~

"cent2.example.com" (SHA256) ED:33:~~~

 

그리고 Sign요청된 클라이언트들의 요청은 “/etc/puppetlabs/puppet/ssl/ca/requests” 파일로 생성됩니다.

 

다음의 명령으로 인증 요청에 대해서 Sign 줍니다.

$> puppet cert sign “cent1.example.com”

$> puppet cert sign “cent2.example.com”

또는 다음의 명령으로 일괄적으로 Sign 줄수도 있습니다.

 

$> puppet cert sign --all

 

이렇게 인증이 완료되면

“/etc/puppetlabs/puppet/ssl/ca/requests” 요청된 파일들은 삭제되고

“/etc/puppetlabs/puppet/ssl/ca/signed” 인증이 완료된 파일들로 이관됩니다.

 

다음의 명령으로 인증이 완료된 클라이언트 목록을 확인 수있습니다.

$> puppet cert list --all

 

 

이렇게 하므로써 Puppet 서버와 Agent 기본설치는 마무리 됩니다.

 



 

Puppet Server/Agent테스트

“/etc/puppetlabs/code/environments/production/manifests” site.pp라는 파일로 다음의 내용을 작성합니다.

 

file {'/tmp/example-ip':                    # resource type file and filename

  ensure  => present,                       # make sure it exists

  mode    => '0644',                                # file permissions

  content => "My Public IP Address: ${ipaddress_eth0}.\n", 

}

 

 

그리고 30(기본값) 기다리거나 에이전에에서 다음의 커맨드를 실행시켜서

$> puppet agent --test

 

/tmp/example-ip 파일의 내용과 생성된 권한을 확인해 봅니다.



*** 위에서 작성된 site.pp파일에서 ipaddress_eh0변수는 팩터(Facter) 가 수집해온 정보 변수중 하나입니다.

Puppet 서버에서 다음의 명령을 실행시켜 보면 팩터가 관리대상이 되는 노드들로 부터 어떤 정보들을 수집해왔는지 확인 할 수 있습니다.

$> facter



참고 : https://www.digitalocean.com/community/tutorials/how-to-install-puppet-4-in-a-master-agent-setup-on-centos-7

https://www.digitalocean.com/community/tutorials/how-to-install-puppet-4-on-ubuntu-16-04









 

 

Posted by Steven J.S Min

댓글을 달아 주세요