ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(2)

18040 단어 Dockerconsul

저번에 계속.


이전 기사: ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(1)

단거리 브라이언 컨디션 컨디션 만들기


Swarm은 모든 노드와 컨테이너를 알고 있지만 Consuul은 이 노드의 설정만 책임지려고 합니다.
Doker man의/root/docker-host/nodes를 캐서 거기에 새로운docker-compose를 주세요.yml이라고 써주세요.
# cd /root/docker-host
# mkdir nodes
# cd nodes
# nano docker-compose.yml
docker-compose.yml
consul:
  command: -server -bootstrap -ui-dir /ui
  image: progrium/consul:latest
  ports:
  - "8300"
  - "8400"
  - "8500"
  - "8600/udp"
  environment:
  - "affinity:container!=nodes_consul_*"
  net: "host"

registrator:
  command: consul://127.0.0.1:8500
  image: progrium/registrator:latest
  volumes:
  - "/var/run/docker.sock:/tmp/docker.sock"
  environment:
  - "affinity:container!=nodes_registrator_*"
  net: "host"
이 구성에서.
  • 각 노드에서 Consuul은 8500에서 대기
  • Registrator는 자신이 속한 노드의 docker 컨테이너를 파악하여 자신과 같은 노드의 Consuul
  • 에 알립니다.
    서비스 정의의environmentaffinity:container!=ほにゃらら는 같은 노드의 다중 시작을 방지하기 위해 설정된 것입니다
    여기까지도 고민거리가 없으니 빨리 시동을 걸어라
    DOCKER_HOST를 2380 포트(swarm manage)로 향한 후 docker-compose를 진행하면 Swarm API를 통해 컨테이너 제어 가능
    # export DOCKER_HOST=tcp://localhost:2380
    # pwd
    /root/docker-host/nodes
    # docker-compose up -d consul
    Creating nodes_consul_1...
    # docker-compose scale consul=3
    Creating nodes_consul_2...
    Creating nodes_consul_3...
    Starting nodes_consul_2...
    Starting nodes_consul_3...
    # docker-compose up -d registrator
    Creating nodes_registrator_1...
    # docker-compose scale registrator=3
    Creating nodes_registrator_2...
    Creating nodes_registrator_3...
    Starting nodes_registrator_2...
    Starting nodes_registrator_3...
    # docker-compose ps
           Name                      Command               State   Ports
    --------------------------------------------------------------------
    nodes_consul_1        /bin/start -server -bootst ...   Up
    nodes_consul_2        /bin/start -server -bootst ...   Up
    nodes_consul_3        /bin/start -server -bootst ...   Up
    nodes_registrator_1   /bin/registrator consul:// ...   Up
    nodes_registrator_2   /bin/registrator consul:// ...   Up
    nodes_registrator_3   /bin/registrator consul:// ...   Up
    
    아, 얼마나 가벼운가.

    docker loadbalance 구축


    이 docker-loadbalancer는Consuul과 통신하여 서비스의 상태 변화에 따라Consuul-templete를 시작하고 설정 파일을 펼치며 Nginx를 제어합니다.
    노드 아무거나 가능하니 수정 설정을 펼치세요
    # pwd
    /root/docker-host
    # git clone https://github.com/bellycard/docker-loadbalancer.git loadbalancer
    Cloning into 'loadbalancer'...
    remote: Counting objects: 40, done.
    remote: Total 40 (delta 0), reused 0 (delta 0), pack-reused 40
    Unpacking objects: 100% (40/40), done.
    Checking connectivity... done.
    # cd loadbalancer
    # ls -al
    -rwxr-xr-x 1 root root  151 Mar  7 10:21 consul-template.service
    -rw-r--r-- 1 root root  619 Mar  7 10:21 Dockerfile
    -rw-r--r-- 1 root root  164 Mar  7 10:21 .envrc
    -rw-r--r-- 1 root root  532 Mar  7 10:21 fig.yml
    drwxr-xr-x 8 root root 4096 Mar  7 10:21 .git
    -rw-r--r-- 1 root root  420 Mar  7 10:21 nginx.conf
    -rwxr-xr-x 1 root root  123 Mar  7 10:21 nginx.service
    -rw-r--r-- 1 root root 1064 Mar  7 10:21 README.md
    
    여기에 편집해야 할 것은nginx다.conf와 consuul-template.service
    nginx.conf
    upstream nohost {
      least_conn;
      server 127.0.0.1:65535;
    }
    
    upstream testweb {
      least_conn;
      {{range service "production.testweb"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;
      {{else}}server 127.0.0.1:65535; # force a 502{{end}}
    }
    
    server {
      listen 80 default_server;
    
      location / {
        proxy_pass http://nohost;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
      }
    }
    
    server {
      listen 80;
      server_name docker.example.com;
    
      location / {
        proxy_pass http://testweb;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
      }
    }
    
    이렇게 하면...
    서비스 이름(SERVICE NAME) testweb
    태그 이름(SERVICE TAGS)
    이러한 환경 변수가 있는 컨테이너가 증가할 경우 Consuul-templete는 위의 설정 파일을 실제 IP 및 포트 번호로 확장합니다.
    consul-template.service
    #!/bin/sh
    
    exec consul-template \
         -consul=127.0.0.1:8500 \
         -template "/etc/consul-templates/nginx.conf:/etc/nginx/conf.d/app.conf:sv hup nginx"
    
    
    Consuul-template의 시작 옵션에 Consul의 연결 주소가 쓰여 있기 때문에 여기를 바꾸었습니다.
    (127..0.1이면 이 컨테이너 안에 있다고 생각되나? 넌 예민해. 호스트 네트워크 기능 덕분에)
    만약 다시 쓰기가 완성되었다면, 그것을 구축하여 개인 등록표에 push하시오
    # docker build .
    Sending build context to Docker daemon 113.2 kB
    Sending build context to Docker daemon
    Step 0 : FROM nginx:1.7
     ---> 2485b0f89951
    Step 1 : MAINTAINER Shane Sveller <[email protected]>
     ---> Using cache
     ---> 8b00a2293a97
    ...
    ...
    ...
    Step 5 : ADD nginx.service /etc/service/nginx/run
     ---> b1b0b05a408b
    Removing intermediate container ee6e15440531
    Step 6 : ADD consul-template.service /etc/service/consul-template/run
     ---> 1daacc85e833
    Removing intermediate container bb545c650ac1
    ...
    ...
    ...
    Removing intermediate container 33bab34d8d86
    Successfully built d0b8fa1bb2df
    # docker tag d0b8fa1bb2df 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
    # docker push 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
    The push refers to a repository [10.10.0.110:5000/zerobytezero/docker-loadbalancer] (len: 1)
    Sending image list
    Pushing repository 10.10.0.110:5000/zerobytezero/docker-loadbalancer (1 tags)
    ...
    ...
    ...
    1daacc85e833: Image successfully pushed
    c878bca3ec0c: Image successfully pushed
    9201627715ed: Image successfully pushed
    d0b8fa1bb2df: Image successfully pushed
    Pushing tag for rev [d0b8fa1bb2df] on {http://10.10.0.110:5000/v1/repositories/zerobytezero/docker-loadbalancer/tags/latest}
    
    push가 끝나면 각 노드에서 미리 pull하면 OK.
    Dockor-compose로 돌아갑니다.yml에 다음 정의를 추가합니다
    docker-compose.yml
    loadbalancer:
      image: 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
      ports:
      - "80"
      expose:
      - "80"
      environment:
      - "affinity:container!=nodes_loadbalancer_*"
      net: "host"
    
    docker loadbalancer도 각 노드가 하나만 남는 것을 제한해야 합니다
    자, loadbalancer도 일어났어요!
    # docker-compose up -d loadbalancer
    Creating nodes_loadbalancer_1...
    # docker-compose scale loadbalancer=3
    Creating nodes_loadbalancer_2...
    Creating nodes_loadbalancer_3...
    Starting nodes_loadbalancer_2...
    Starting nodes_loadbalancer_3...
    
    나머지는 그냥 내용입니다.

    네트워크 컨테이너 준비


    아무런 표시가 없으면 외로우니까...
    # mkdir -p /docker-volumes/testweb
    # nano /docker-volumes/testweb/index.php
    
    index.php
    <?php ini_set('date.timezone', 'Asia/Tokyo'); ?>
    <html>
    <head>
      <title>docker-container</title>
    </head>
    <body>
      <h1>
        docker00:<?php echo $_SERVER['SERVER_ADDR']; ?>
      </h1>
      <ul>
      <?php
        foreach (getallheaders() as $name => $value) {
          echo "<li>$name: $value</li>";
        }
      ?>
      </ul>
    </body>
    </html>
    
    이러한 PHP 파일은 노드별로 구성됩니다.
    나는'docker 00'의 부분을 각 절로 바꾸어 출석을 부르면 어느 노드가 내용을 회답하고 있는지 쉽게 알 수 있을 것이라고 생각한다.
    Dockor-compose.yml에 다음 내용 추가
    docker-compose.yml
    webapps:
      image: php:5.6-apache
      volumes:
       - "/docker-volumes/testweb:/var/www/html"
      ports:
       - "80"
      environment:
       - "affinity:container!=nodes_webapps_*"
       - SERVICE_80_NAME=http
       - SERVICE_NAME=testweb
       - SERVICE_TAGS=production
    
    scalewebapps:
      image: php:5.6-apache
      volumes:
       - "/docker-volumes/testweb:/var/www/html"
      ports:
       - "80"
      environment:
       - SERVICE_80_NAME=http
       - SERVICE_NAME=testweb
       - SERVICE_TAGS=production
    

    왜 두 개 골랐어요?


    Nginx가 살아있기 때문에 웹 용기가 없으면 502가 되돌아오기 때문에 최저 노드와 같은 웹 서버를 준비해야 한다. 이것이 바로 웹 앱 서비스다.
    scalewebapps의 설정은 규칙이 필요 없이 람덤을 노드에 분산시키는 것이고 힘이 부족한 것은 이를 비례자로 대응하는 것이다.
    적도 가동
    # docker-compose up -d webapps
    Creating nodes_webapps_1...
    # docker-compose scale webapps=3
    Creating nodes_webapps_2...
    Creating nodes_webapps_3...
    Starting nodes_webapps_2...
    Starting nodes_webapps_3...
    
    registrator_2 | 2015/03/07 23:21:37 registrator: added: 540cc048a95b ip-10-10-0-50:nodes_webapps_1:80
    consul_2      |     2015/03/07 23:21:37 [INFO] agent: Synced service 'ip-10-10-0-50:nodes_webapps_1:80'
    registrator_3 | 2015/03/07 23:21:39 registrator: added: 665e35e82457 ip-10-10-0-51:nodes_webapps_2:80
    consul_1      |     2015/03/07 23:21:39 [INFO] agent: Synced service 'ip-10-10-0-51:nodes_webapps_2:80'
    registrator_1 | 2015/03/07 23:21:39 registrator: added: e9aaf6a0c092 ip-10-10-0-49:nodes_webapps_3:80
    consul_3      |     2015/03/07 23:21:39 [INFO] agent: Synced service 'ip-10-10-0-49:nodes_webapps_3:80'
    
    잘, Registrator가 Consuul에 등록되어 있어!
    Macbook에/etc/hosts를 써서 각 노드를 방문하고 정상적으로 작동시키면, 노드를 ELB 아래에 놓으십시오.

    무거운 짐을 실을 때마다 노드를 잘 만들어서 그린이 하면 대성공!
    아이고, 오랜만이다
    인프라점의 영혼 ◯!!황금신위
    길어졌으니 다음 기사에'비기 노드 트랩'이나'필살 300용기 시동'같은 걸 쓰세요.
    파치야, 난 이미 피곤해...
    다음 기사: ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(3)

    좋은 웹페이지 즐겨찾기