基於雲使用 salt 和 docker 自動化部署應用

enter image description here 若是你尚未機會使用 Salt的話,那我簡單介紹下,Salt 是一個很是強大的配置管理系統,它是一個很是容易運行,而且能支持分佈式命令執行和複雜的配置文件管理,具備高可擴展性,能同時支持上千臺服務器運行。html

注: SaltStack 的進一步學習和了解能夠加入 SaltStack 中國用戶組,SaltStack 確實是一個很是強大的工具,用 Python 編寫的,能夠經過 API 進行二次開發前端

最近,我在寫一篇關於一個事實上的集裝箱化標準怎麼成爲新一代的管理工具的文章。回到一月,SaltStack 宣佈了 Salt 2014.1.0 版本一些很是好的新特性,包括支持 Docker 容器生命週期的管理。SaltStack 早期就獲得了 Docker 的支持,Docker 本身認爲尚未準備好(tell that to Yelp and Spotify),可是這些工具爲固定不變的基礎設施提供了一個開箱即用的解決方案。python

在一年前,經過使用多個公共雲橫跨多個虛擬機來部署和管理一個應用,會被認爲是很是難的使用案例。像 Google , FaceBook 和 Ning 這些公司爲了解決擴展性難題,劃分了他們不少年來發展內部的 orchestration 技術。今天,使用 Docker 容器結合 Salt-Cloud,還有一些 Salt 狀態, 咱們只須要花費幾十分鐘就能處理好。而且,由於咱們使用了 SaltStack 的聲明式配置管理,咱們能在實際生產環境中按照如下模式操做。git

enter image description here

這個案例的核心是在一個或多個公有云供應商上,把一個或多個應用部署在一個或者多個虛擬主機上。github

爲了這個簡單的目的,咱們將對這個案例作以下限制:docker

  • 假設熟悉 Salt
  • 假設熟悉 Docker
  • 假設你已經安裝了一個 SaltSack Master
  • 假設你已經在一個公有云上作了這些事情,使用 Digital Ocean (由於添加一個新的雲到 Salt-Cloud 是很是簡單的)
  • 用一個虛擬的 apache 服務模仿真實世界的應用

enter image description here

爲了模仿一個真實的應用,須要建立一個 Apache 的 Docker 容器。從概念上講,這個容器可能一個前端代理,一個 Web 中間件服務,一個數據庫,或者是咱們須要部署在生產上的其餘類型的服務。爲了這個,咱們在一個目錄下建立一個 DockerFile,構建這個容器,而且把這個容器 PUSH 到 Docker 倉庫。數據庫

Step 1: Create a Dockerfileapache

##### An apache Dockerfile
root@salt:/some/dir/apache# cat Dockerfile
# A basic apache server. To use either add or bind mount content under /var/www
FROM ubuntu:12.04

MAINTAINER Kimbro Staken version: 0.1

RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Step 2: Build the containerbootstrap

##### Building the container
root@salt:/some/dir/apache# docker build -t jthomason/apache .
Uploading context  2.56 kB
Uploading context
Step 0 : FROM ubuntu:12.04
 ---> 1edb91fcb5b5
Step 1 : MAINTAINER Kimbro Staken version: 0.1
 ---> Using cache
 ---> 534b8974c22c
Step 2 : RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 7d24f67a5573
...
<A WHOLE LOT OF STUFF HAPPENS>
...
Successfully built 527ad6962e09

Step 3: Push the containerubuntu

##### Pushing the container
root@salt:/tmp/apache# docker push jthomason/apache
The push refers to a repository [jthomason/apache] (len: 1)
...
<A WHOLE LOT OF STUFF HAPPENS>
...
Pushing tag for rev [527ad6962e09] on {https://registry-1.docker.io/v1/repositories/jthomason/apache/tags/latest}

當咱們的應用 Demo 成功 PUSH 到了 Docker 的倉庫後,咱們準備開始協調它的部署。須要提早注意的是,咱們假設你已經安裝了一個 SaltStack ,若是沒有,你能夠根據這個文檔 來獲取 SaltStack Master 安裝。下一步,就是在你選擇的公有云供應商上配置 Salt-Cloud 。 配置 Salt-Cloud 是很是簡單的,咱們須要建立一個 SSH Key,Salt-Cloud 用它來在新建立的 VMs 上安裝 Salt Minion,把這個 keypair 添加進公有云提供商,使用認證的 API 爲咱們的公有云建立一個 Salt-Cloud 配置文件。

Step 4: Create an SSH Key Pair

##### Generate ssh keys for salt-cloud
root@salt:/etc/salt/keys# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): digital-ocean-salt-cloud
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_dsa.
Your public key has been saved in digital-ocean-salt-cloud.pub.
The key fingerprint is:
06:8f:6f:e1:97:5a:5a:48:ce:09:f3:b6:33:42:48:9a root@salt.garply.org
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|                 |
|      .          |
|    .  +         |
|   + .+ S        |
|  E . .@ + .     |
|     .  @ =      |
|      .ooB       |
|       .+o       |
+-----------------+
root@salt:/etc/salt/keys#

Step 5: Upload SSH Key Pair

enter image description here

使用 Digital Ocean 讓咱們的 SSH Keys 生效,下一步的準備時間是使用 Digital Ocean’s API key 爲咱們的帳號配置 Salt-Cloud,爲 Digital Ocean 虛擬主機的大小,地理位置,鏡像 定義配置文件,Salt-Cloud 的認證文件保存在 Salt-Master 的 /etc/salt/cloud.providers.d/ 路徑下,查看 Salt-Cloud 的文檔瞭解更加多的配置文件細節

Step 6: Configure Salt-Cloud

##### /etc/salt/cloud.providers.d/digital_ocean.conf
do:
  provider: digital_ocean
  # Digital Ocean account keys
  client_key: <YOUR KEY HERE>
  api_key: <YOUR API KEY HERE>
  ssh_key_name: digital-ocean-salt-cloud.pub
  # Directory & file name on your Salt master
  ssh_key_file: /etc/salt/keys/digital-ocean-salt-cloud
##### /etc/salt/cloud.profiles.d/digital_ocean.conf
# Official distro images available for Arch, CentOS, Debian, Fedora, Ubuntu

ubuntu_512MB_sf1:
  provider: do
  image: Ubuntu 12.04.4 x64
  size: 512MB
#  script: Optional Deploy Script Argument
  location: San Francisco 1
  script: curl-bootstrap-git
  private_networking: True

ubuntu_1GB_ny2:
  provider: do
  image: Ubuntu 12.04.4 x64
  size: 1GB
#  script: Optional Deploy Script Argument
  location: New York 2
  script: curl-bootstrap-git
  private_networking: True

ubuntu_2GB_ny2:
  provider: do
  image: Ubuntu 12.04.4 x64
  size: 2GB
#  script: Optional Deploy Script Argument
  location: New York 2
  script: curl-bootstrap-git
  private_networking: True

如今是時候爲咱們的應用容器配置 Salt。要作到這一點,咱們須要建立兩個 Salt States ,一個爲在一個新建立的 VMs 上的 Docker 準備,另一個爲應用容器準備。Salt States 是 Salt 的聲明式狀態配置,它在目標主機上被 salt-minion 執行,States 有很是豐富的功能,幾乎不多有像它這樣在教程中覆蓋瞭如此之多的各等級的細節,這個不是最聰明或是最優的 States 使用示例,可是它足夠簡單。你須要仔細研讀 Salt States 來發展你本身的環境的最佳實踐。

Step 7: Create a Salt state for Docker

##### /srv/salt/docker/init.sls
docker-python-apt:
  pkg.installed:
    - name: python-apt

docker-python-pip:
  pkg.installed:
    - name: python-pip

docker-python-dockerpy:
  pip.installed:
    - name: docker-py
    - repo: git+https://github.com/dotcloud/docker-py.git
    - require:
      - pkg: docker-python-pip

docker-dependencies:
   pkg.installed:
    - pkgs:
      - iptables
      - ca-certificates
      - lxc

docker_repo:
    pkgrepo.managed:
      - repo: 'deb http://get.docker.io/ubuntu docker main'
      - file: '/etc/apt/sources.list.d/docker.list'
      - key_url: salt://docker/docker.pgp
      - require_in:
          - pkg: lxc-docker
      - require:
        - pkg: docker-python-apt
      - require:
        - pkg: docker-python-pip

lxc-docker:
  pkg.latest:
    - require:
      - pkg: docker-dependencies

docker:
  service.running

第一個 salt state 定義了依賴和安裝 Docker 的配置

Step 8: Create Salt state for the application container

##### /srv/salt/apache/init.sls
apache-image:
   docker.pulled:
     - name: jthomason/apache
     - require_in: apache-container

apache-container:
   docker.installed:
     - name: apache
     - hostname: apache
     - image: jthomason/apache
     - require_in: apache

apache:
   docker.running:
     - container: apache
     - port_bindings:
            "80/tcp":
                HostIp: ""
                HostPort: "80"

如今終於配置完成,咱們將準備 1-n 個虛擬機,每一個運行一個應用容器實例。在咱們作這個以前,讓咱們校驗下 Salt Master 是否正常工做,這時候,咱們知道至少有一個客戶端應該與 Salt Master 通訊,這個客戶端與 Salt Master 運行在同一臺服務器上。

Step 9: Verify that Salt is working

##### Pinging the minions
root@salt:~# salt '*' test.ping
salt.garply.org:
True
root@salt:~#

很是滿意,隨着 Salt 的安裝,一切工做有序。如今咱們能夠用 Salt-Cloud 在咱們的第一個虛擬機上準備咱們的一個容器實例。

Step 10: Provision a VM with an instance of the container

##### Provisioning a VM with an instance of a container
root@salt:# salt-cloud --profile ubuntu_512MB_sf1 one.garply.org
[INFO    ] salt-cloud starting
[INFO    ] Creating Cloud VM one.garply.org
[INFO    ] Rendering deploy script: /usr/lib/python2.7/dist-packages/salt/cloud/deploy/curl-bootstrap-git.sh
...
<A WHOLE LOT OF STUFF HAPPENS>
...
one.garply.org:
    ----------
    backups_active:
        False
    created_at:
        2014-04-23T19:23:12Z
    droplet:
        ----------
        event_id:
            22373933
        id:
            1521385
        image_id:
            3101045
        name:
            one.garply.org
        size_id:
            66
    id:
        1521385
    image_id:
        3101045
    ip_address:
        107.170.230.112
    locked:
        True
    name:
        one.garply.org
    private_ip_address:
        None
    region_id:
        3
    size_id:
        66
    status:
        new

當運行完成 Salt-Cloud,它發出一個包含新近建立的 VM 實例的信息的 YAML blob,讓咱們使用這個實例的 IP 來看下咱們的應用是否在運行。

**Step 11: Verify application is running **

enter image description here

咱們已經爲咱們的基礎設施創建了基本的設置和管理模式,增長額外的公有云是很是簡單的,很是感謝 Salt-Cloud 爲咱們的應用基礎設施提供了一個控制接口。在整個持續集成和部署過程,該何去何從?一個起始點是考慮 salt states 怎樣被用來管理 VM 和 控制容器的生命週期。我計劃在將來的文章中分享個人一些明確的想法。很是明顯的,從你最後決定你的應用部署和操做的架構設計,這裏會有很是多的想法適用於你的明確目標。無論怎樣,Salt 是一個很是強大的工具,當與 Docker 組合的時候,在不可變的基礎架構上,提供了一個聲明式的框架來管理應用生命週期的開箱即用的範例。That versatility puts a whole lot of miles behind you,容許你專一於應用程序部署與操做的其餘核心挑戰。

注: 該文章由 JAMES THOMASON 編寫, 本文的原文請看這裏,如需轉載,請註明出處,謝謝!
注: 該文由 Docker 中文社區收集,而且發佈翻譯任務,各位若是對 Docker 感興趣,能夠加入 Docker 中文社區。

相關文章
相關標籤/搜索