Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS충섭 김
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Docker Seoul Meetup #2에서 발표한 자료입니다.
CoreOS에서 confd와 sidekick service를 이용한 서비스 배포에 대한 내용입니다.
http://www.youtube.com/watch?v=5ixJCM6pAcg
영상과 함께 보시면 더 좋습니다 :)
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS충섭 김
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Docker Seoul Meetup #2에서 발표한 자료입니다.
CoreOS에서 confd와 sidekick service를 이용한 서비스 배포에 대한 내용입니다.
http://www.youtube.com/watch?v=5ixJCM6pAcg
영상과 함께 보시면 더 좋습니다 :)
2015. 09. 05 도커 서울 밋업 4번째(Open Container Korea 주최).
elasticsearch에 은전한닢 한국어 형태소 분석기를 적용하고 운영한 사례 발표.
- 사용자 사전별로 이미지를 만들기
- nginx를 이용해 http basic auth 적용하기
2015. 09. 05 도커 서울 밋업 4번째(Open Container Korea 주최).
elasticsearch에 은전한닢 한국어 형태소 분석기를 적용하고 운영한 사례 발표.
- 사용자 사전별로 이미지를 만들기
- nginx를 이용해 http basic auth 적용하기
6. A. 아닙니다.
환경의 메타데이터를 관리하
고, 노드의 역할을 조정하는
OPS의 프레임워크다.
※일반적인 자동 빌드 툴로 생각해도 된다.
6
7. Q. DevOps라고 자주 말하고
있는데,
Developer와 Operater가
사이 좋게 만든 것인가?
7
8. A. 정확히 말하면,
OPS의 분노가 집약된
툴이라고 생각한다.
※DevOps의 본질은 특정 툴과 관계가 없다.
※Ohai와 Chef::Providers의 소스에서는 특히 그런 인상
을 받는다.
8
9. Chef의 인식 정오표 1
✕ 레시피로 화려하게 서버를 자동 설정
◯ 플랫폼의 구분과 리소스 확인 결과에 따른
조정을 실시
✕ ChefServer는 그다지 필요한지 않다.
◯ 인벤토리야말로 ChefServer의 전부다.
9
10. Chef의 인식 정오표 2
✕ Cookbook에 미들웨어의 서버별 고유 정보도 사용한다.
◯ Role/Node의 Override Attribute나 ChefServer로의 쿼리
를 사용해 Cookbook은 범용적으로 작성해야 한다.
✕ 서버 설정을 변경하면 별도로 만들어져 있는 시스템
구성 관리 대장을 갱신한다.
◯ 서버에 직접 로그인하는 것을 포함하여 ChefServer 상
의 구성 관리만으로 끝내는 것이 이상적이다.
10
12. 먼저 인벤토리 수집에서부터
• Chef-Client(Chef-solo)가 가동하기 위해
서는 실행된 플랫폼의 판별이 무엇보다
중요하다.
• Chef의 멀티 플랫폼성을 지원하기 위해
서는 고도의 인벤토리 수집력이 필요!
12
13. 그래서 OHAI다.
• Ohai(https://github.com/opscode/ohai)
• quot: Ohai detects data about your
operating system.
• 참고자료: Chef의 심장, Ohai의 속성(이하 생
략)
http://qiita.com/items/5ce72101f8dee906ccb4
• OS/분배를 시작하여 동작 환경을 판별
13
14. OHAI 예제 소스,플랫폼의 판별하는 소스
# platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching
if File.exists?("/etc/oracle-‐release")
contents = File.read("/etc/oracle-‐release").chomp
platform "oracle"
platform_version get_redhatish_version(contents)
elsif File.exists?("/etc/enterprise-‐release")
contents = File.read("/etc/enterprise-‐release").chomp
platform "oracle"
platform_version get_redhatish_version(contents)
elsif File.exists?("/etc/debian_version")
# Ubuntu and Debian both have /etc/debian_version
# Ubuntu should always have a working lsb, debian does not by default
if lsb[:id] =~ /Ubuntu/i
platform "ubuntu"
platform_version lsb[:release]
else
if File.exists?("/usr/bin/raspi-‐config")
platform "raspbian"
else
platform "debian"
end
platform_version File.read("/etc/debian_version").chomp
end
elsif File.exists?("/etc/redhat-‐release")
contents = File.read("/etc/redhat-‐release").chomp
platform get_redhatish_platform(contents)
platform_version get_redhatish_version(contents)
elsif File.exists?("/etc/system-‐release")
contents = File.read("/etc/system-‐release").chomp
platform get_redhatish_platform(contents)
platform_version get_redhatish_version(contents)
elsif File.exists?('/etc/gentoo-‐release')
platform "gentoo"
플랫폼 판별을 위해
자세하게 조사
14
15. AWS(EC2) 상에 있는지도 확인한다!
def has_ec2_mac?
network[:interfaces].values.each do |iface|
unless iface[:arp].nil?
if iface[:arp].value?("fe:ff:ff:ff:ff:ff")
Ohai::Log.debug("has_ec2_mac? == true")
return true
end
end
end
Ohai::Log.debug("has_ec2_mac? == false")
false
end
def looks_like_ec2?
# Try non-‐blocking connect so we don't "block" if
# the Xen environment is *not* EC2
hint?('ec2') || has_ec2_mac? && can_metadata_connect?
(EC2_METADATA_ADDR,80)
end
역시 자세하게 조사
if looks_like_ec2?
Ohai::Log.debug("looks_like_ec2? == true")
15
16. 플랫폼은 판별하면
• 패키지 관리 시스템을 알 수 있다.
• 서비스 관리 방법을 알 수 있다.
• 환경 특유의 관리 방법을 파악할 수 있다.
• Ex) ec2라면 IP가 아닌 public hostname을
접속 주소로 사용하는 등…
16
17. Cookbook DSL 예제
package ‘nginx’ do
action :install
end
예를 들어, 이것만으로도
• Redhat 계열이라면 yum/rpm을 사용
• Debian 계열이라면 apt/deb를 사용
• Solaris 계열이라면 pkgin/pkg을 사용
Chef::Runner이 표준 패키지 시스템에서
nginx를 설치한 상태로 노드를 조정한다.
17
21. Convergence 란
• Chef에서는 서버 설정 변경을
Convergence(조정)하다고 부르고 있다.
• (사상으로) 스크립트를 실행하여 서버를
설정하는 것이 아닌, Client의 실행에 따
라 서버의 상태를 레시피에 쓰여진 내용
처럼 서버를 조정하는 것을 표현하고 있
기 때문이다.
21
22. 어떤 방법일까
• 서버 상태를 받아와 레시피에 쓰여진 내용
과 비교
• 레시피와 틀리다면 「맞춘다」, 이 작업을 반
복하여 설정을 “조정”한다.
(※Cookbook은 멱등성에서 설명한다.)
• 다음의 Resouce Corection에서도 설명한다.
22
25. 서버 요소들은 모두 RESOURCE로 정의
• 종류와 요소 = 리소스
• 예 : 패키지
• 설치 상태는? / 버전은?
• 예 : 서비스
• 가동중? / 자동 가동?
• 파일
• 경로는? / 소유자는? / 내용은?
25
26. Curennt Resouce와 New Resouce
1.
Client/Solo는 목적의 리
소스를 정의=New
Resorce
2.
현재 리소스를 불러옴
=Current Resorce
3.
Current Resorce의 요소
를 변경
※ 플랫폼별 변경 방법은 다
름
[New Resorce]
File (
:path => “/etc/hoge”,
:owner => “root”,
:mode => 0644,
:content => “piyo”)
[Current Resorce]
File (
:path => “/etc/hoge”,
:owner => “root”,
:mode => 0600,
:content => “hoge”)
26
Converge!
27. Current Resouce 불러오기 예제
패키지 관리자=PackMan의 경우
패키지 상태을 불러온다.
Chef::Log.debug("#{@new_resource} checking pacman for #{@new_resource.package_name}")
status = popen4("pacman -‐Qi #{@new_resource.package_name}") do |pid, stdin, stdout, stderr|
stdout.each do |line| line.force_encoding(Encoding::UTF_8) if line.respond_to?(:force_encoding)
case line
when /^Version(s?)*: (.+)$/
Chef::Log.debug("#{@new_resource} current version is #{$2}")
@current_resource.version($2)
end
명령어를 입력하여 패스…
27
28. New Resource 적용 예제
패키지를 설치 상태로 변경
def install_package(name, version)
run_command_with_systems_locale(
:command => "pacman --sync --noconfirm --noprogressbar#{expand_options(@new_resource.options)} #{name}"
)
end
Cron 등도 도움이 되는 검출 Source
if @cron_exists
unless cron_different?
Chef::Log.debug("Skipping existing cron entry '#{@new_resource.name}'")
return
end
read_crontab.each_line do |line|
case line.chomp
when "# Chef Name: #{@new_resource.name}"
cron_found = true
28
29. RESOURCE와 멱등성
• 자세한 Resouce Correction
• CookBook 레시피= New Resource
• Current Resouce를 New Resource와 같은 S
tatus로 조정
• = > Client/Solo는 몇 번이고 실행해도 같은
결과, 같은 상태가 되도록 하고, 항상 실행
되도록 해두는 것이 중요
29
33. Env / Role의 할당 예제
Server의 인벤토리를 기반으로 설정 변경
Chef-Server
Node
Node
Recipe[nagios-server]
・Role[Nagis-Client]등록 Node의 IP를 불
러와 감시한다.
・감시 대상 Node의 Attribute에서 감시 항
목을 설정
Recipe[nagios-client]
・Role[Nagis-Server]등록 Node의 IP에서
요청을 허가
・감시 대상 리소스의 플러그인을 설치
Role[Nagios-Server]
Role[Nagios-Client]
33
34. 환경의 구성 관리를 통해
서버 구성을 자동으로 조정
(Configuration Management
First)
34
35. 새로운 Node에 Role을 할당=조정하여 환경에 적용
Chef-Server
Node
New
Node
Role에 추가=Server
에 인벤토리된다.
Node
. Nagios의 관계 설정
이 조정된다.
Recipe[nagios-server]
. Role[Nagios-Server]은 ・Role[Nagis-Client] 등록 Node의 IP를 불
Recipe[nagios-client]
・Role[Nagis-Server]등록 Node의 IP에서Client의 Node 증감에 따러와 감시한다.
라 자동으로 감시 대상의
요청을 허가
・감시 대상 Node의 Attribute에서 감시 항
추가 삭제가 이루어진다.
・감시 대상 리소스의 플러그인을 설치
목을 설정
Role[Nagios-Server]
Role[Nagios-Client]
35
36. 구성 관리=환경 구축
• Chef 상의 요소를 변경=구성 관리 정
보를 갱신한다면
• Client 들이 적당히 조정되어진다.
• 구성 관리하는 모든 것이 연결된다.
36
37. 마치며
• Chef를 그냥 한 번에 빌드하는 툴로
생각해도 틀린 것은 아니지만 부족한
부분이 있다.
• Solo로 갱신해 나가는 것도 좋으나
이것 또한 부족한 부분이 있다.
이것이 Active Directory가 아니냐고 생각하시는 분들이 있는데, 대
략 맞습니다.
37