Docker Swarm in LXD

51366 단어 Dockerswarmtech
어버이날 잘 보내세요
예전에 LXD에서 K8s를 해봤는데 이번에 Swarm을 해봤어요. 그래서 그 메모.
당시의 보도
https://zenn.dev/tantan_tanuki/articles/23e9285f98a6bf
https://zenn.dev/tantan_tanuki/articles/3650b852ec3461

차리다


먼저 Swarm으로 이동하는 LXD 환경 1개를 만들어 LXD에 삭제 노드를 간단하게 추가할 수 있도록 이미지를 저장합니다.

LXD를 통해 이동하는 swarm 소개 만들기


$ lxc profile create swarm
Profile swarm created
$ wget -O - -q https://raw.githubusercontent.com/ubuntu/microk8s/master/tests/lxc/microk8s-zfs.profile | lxc profile edit swarm
!
  • 기본적으로 이동하지 않기 때문에 LXD에서 k8s를 이동하는 데 사용되는 간단한 파일 유용
  • 호스트의 파일 시스템은 zfs
  • 에서 사용
  • mk8s용이라 필요 없는 설정도 포함
  • 간단한 시작 용기 적용


    $ lxc launch -p default -p swarm ubuntu:20.04 manager
    

    Docker 설치


    $ lxc exec manager -- apt update
    $ lxc exec manager -- apt install -y docker.io
    

    여기까지만 하고 싶어서 돌려서 저장.


    $ lxc stop manager
    $ lxc publish manager --alias swarm
    

    그림을 저장하는 데 사용할 간단한 파일에 swarm을 추가합니다


    마지막 줄 추가- swarm
    $ lxc image edit swarm
    
    확인
    $ lxc image show swarm
    auto_update: false
    properties:
      architecture: x86_64
      description: Ubuntu 20.04 LTS server (20220308)
      os: ubuntu
      release: focal
    public: false
    expires_at: 0001-01-01T00:00:00Z
    profiles:
    - default
    - swarm
    

    swarm 시작


    두 개의 워크맨 노드로 관리자 노드를 시작합니다
    우선 처음 만든 용기가 멈췄기 때문에 관리자로 작동합니다
    $ lxc start manager
    $ lxc exec manager docker swarm init
    

    작업 노드 작성 및 참여


    우선 워크맨으로 참가하는 영패를 획득합니다
    또한 이 정보는 init에서도 표시됩니다
    $ lxc exec manager -- docker swarm join-token worker
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-3u72kjwwe38yxzlpx29km6a7l4gliagus00eb1ivx9jd5ocbhs-d5p7682dtv6998pz26vidhn39 10.129.61.177:2377
    
    워커용 용기 2개 만들기 및 스warm 참가
    첫번째
    $ lxc launch swarm worker1
    $ lxc exec worker1 -- docker swarm join --token SWMTKN-1-3u72kjwwe38yxzlpx29km6a7l4gliagus00eb1ivx9jd5ocbhs-d5p7682dtv6998pz26vidhn39 10.129.61.177:2377
    
    보조
    $ lxc launch swarm worker2
    $ lxc exec worker2 -- docker swarm join --token SWMTKN-1-3u72kjwwe38yxzlpx29km6a7l4gliagus00eb1ivx9jd5ocbhs-d5p7682dtv6998pz26vidhn39 10.129.61.177:2377
    
    참가 여부 확인
    $ lxc exec manager -- docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    pwyisd5zyjgbpkep7isbka9m2 *   manager    Ready     Active         Leader           20.10.7
    60t0m4m637tcyvg4v8bv6vmmu     worker1    Ready     Active                          20.10.7
    lcvgurxwu6lye0ulfl816enbn     worker2    Ready     Active                          20.10.7
    

    서비스 를 이동해 보다


    Docker 튜토리얼을 만드는 이 그림을 Swarm으로 실행합니다
    http://docs.docker.jp/v19.03/get-started/part2.html?highlight=bulletinboard#define-a-container-with-dockerfile
    git 명령이 필요하므로 Docker 이미지를 추가로 작성합니다.
    $ lxc exec manager -- apt install -y git
    $ lxc exec manager -- git clone https://github.com/dockersamples/node-bulletin-board
    $ lxc exec manager -- docker build --tag bulletinboard:1.0 node-bulletin-board/bulletin-board-app/
    $ lxc exec manager -- docker images bulletinboard
    REPOSITORY      TAG       IMAGE ID       CREATED              SIZE
    bulletinboard   1.0       d371c334f1f3   About a minute ago   260MB
    
    swarm으로 이동하는yaml을 제작한다(stack 파일인 것 같다)
    !
    문서에서 발췌하다
  • 최종적으로 모든 스warm 대상은 선언이라고 불리는 Stack 파일에 기술해야 한다.
  • $ lxc shell manager 
    root@manager:~# cat <<EOF > bb.yaml
    version: '3.7'
    
    services:
      bb-app:
        image: bulletinboard:1.0
        ports:
          - "80:8080"
    EOF
    root@manager:~# logout
    
    Swarm에 등록
    $ lxc exec manager -- docker stack deploy -c bb.yaml demo
    
    이렇게 수행해야 하니까 확인
    $ lxc exec manager -- docker service ls
    ID             NAME          MODE         REPLICAS   IMAGE               PORTS
    jrfuvndpk5hs   demo_bb-app   replicated   1/1        bulletinboard:1.0   *:80->8080/tcp
    
    REPLICAS가 가동된 컨테이너 수로 LXD 컨테이너의 80포트에 접근할 때 Docker 컨테이너에 접근하는 8080포트를 가동한다.
    다음에 어느 노드에서 운행하는지 확인하세요
    $ lxc exec manager -- docker service ps demo_bb-app
    ID             NAME            IMAGE               NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
    u9dg3koqso2l   demo_bb-app.1   bulletinboard:1.0   manager   Running         Running 2 minutes ago
    
    관리자 노드에서 실행
    먼저 브라우저에서 LXD 컨테이너의 IP 주소를 확인하기 위해
    $ lxc list
    +---------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    |  NAME   |  STATE  |             IPV4             |                     IPV6                      |   TYPE    | SNAPSHOTS |
    +---------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | manager | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:fe40:5bda (eth0) | CONTAINER | 0         |
    |         |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |         |         | 10.129.61.177 (eth0)         |                                               |           |           |
    +---------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | worker1 | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:feb7:91c3 (eth0) | CONTAINER | 0         |
    |         |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |         |         | 10.129.61.51 (eth0)          |                                               |           |           |
    +---------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | worker2 | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:fe5b:2a16 (eth0) | CONTAINER | 0         |
    |         |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |         |         | 10.129.61.144 (eth0)         |                                               |           |           |
    +---------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    
    브라우저에서 확인
    Imgur
    URL을 보면 알 수 있듯이 프로그램은 관리자 노드에서 실행되지만worker2에 접근해도 화면을 확인할 수 있습니다
    내부에서는 이런 느낌으로 요청을 하기 때문에 참가한 노드의 어디로 요청을 보내든 행동할 수 있다
    flowchart TB
        HTTPリクエスト([HTTPリクエスト])
        HTTPリクエスト --> worker1 & worker2 & manager
        docker_worker1 & docker_worker2 --> WEBアプリ
        subgraph manager
        docker_manager --> WEBアプリ
        end
        subgraph worker1
        docker_worker1
        end
        subgraph worker2
        docker_worker2
        end

    확대해 봐요.

    このWEBアプリを3つにスケールアップしてみます

    $ lxc exec manager -- docker service scale demo_bb-app=3
    $ lxc exec manager -- docker service ps demo_bb-app -f DESIRED-STATE=running
    ID             NAME            IMAGE               NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
    u9dg3koqso2l   demo_bb-app.1   bulletinboard:1.0   manager   Running         Running 48 minutes ago             
    a9700b189luq   demo_bb-app.2   bulletinboard:1.0   manager   Running         Running 5 minutes ago              
    ox4gaxcogczm   demo_bb-app.3   bulletinboard:1.0   manager   Running         Running 5 minutes ago
    
    다 관리자로 움직이다니.
    이것은 관리자가 로컬로 만든 그림을 사용하기 때문에worker에서 해당하는 그림을 찾을 수 없습니다
    다음 지령으로 워크맨에서 작동할 때 실패했습니다
    $ lxc exec manager -- docker service ps demo_bb-app -f DESIRED-STATE=shutdown
    ID             NAME                IMAGE               NODE      DESIRED STATE   CURRENT STATE            ERROR                              PORTS
    w7ljnpj4cl4d   demo_bb-app.2       bulletinboard:1.0   worker1   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"   
    t74j7r244u0b    \_ demo_bb-app.2   bulletinboard:1.0   worker1   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"   
    s5zs7vsmaeht    \_ demo_bb-app.2   bulletinboard:1.0   worker1   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"   
    1cn73nqm7ith    \_ demo_bb-app.2   bulletinboard:1.0   worker2   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"   
    ygc1u61rv6zn   demo_bb-app.3       bulletinboard:1.0   worker2   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"   
    ez3qde6jqu87    \_ demo_bb-app.3   bulletinboard:1.0   worker2   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"   
    oikzsxrtx1dy    \_ demo_bb-app.3   bulletinboard:1.0   worker2   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"   
    o2k69ehwhfoe    \_ demo_bb-app.3   bulletinboard:1.0   worker1   Shutdown        Rejected 7 minutes ago   "No such image: bulletinboard:…"
    
    No such image: bulletinboard:….
    Doker Hub 등 위의 이미지를 사용하면 문제가 없지만 로컬로 구축된 이미지를 사용하면 각node에 같은 이미지를 추가하거나 어느 노드가 접근할 수 있는 창고에 인상을 두어야 합니다. 이번에는 각worker 1,worker 2에서 관리자의 이미지를 복제하여 대응해 봅시다.
    $ lxc exec manager -- docker save bulletinboard | lxc exec worker1 -- docker load
    Loaded image: bulletinboard:1.0
    $ lxc exec manager -- docker save bulletinboard | lxc exec worker2 -- docker load
    Loaded image: bulletinboard:1.0
    $ lxc exec worker1 -- docker images
    REPOSITORY      TAG            IMAGE ID       CREATED             SIZE
    bulletinboard   1.0            d371c334f1f3   About an hour ago   260MB
    node            current-slim   e71ac23fcd7e   17 hours ago        241MB
    $ lxc exec worker2 -- docker images
    REPOSITORY      TAG            IMAGE ID       CREATED             SIZE
    bulletinboard   1.0            d371c334f1f3   About an hour ago   260MB
    node            current-slim   e71ac23fcd7e   17 hours ago        241MB
    
    그럼 비율을 다시 한번 바꿔볼게요.
    먼저 비율을 1로 설정한 후에 원상태로 회복하다
    $ lxc exec manager -- docker service scale demo_bb-app=1
    $ lxc exec manager -- docker service ps demo_bb-app -f DESIRED-STATE=Running
    ID             NAME            IMAGE               NODE      DESIRED STATE   CURRENT STATE               ERROR     PORTS
    u9dg3koqso2l   demo_bb-app.1   bulletinboard:1.0   manager   Running         Running about an hour ago
    
    다시 시도 3
    $ lxc exec manager -- docker service scale demo_bb-app=3
    $ lxc exec manager -- docker service ps demo_bb-app -f DESIRED-STATE=Running
    ID             NAME            IMAGE               NODE      DESIRED STATE   CURRENT STATE               ERROR     PORTS
    u9dg3koqso2l   demo_bb-app.1   bulletinboard:1.0   manager   Running         Running about an hour ago             
    m3mytsmtchi0   demo_bb-app.2   bulletinboard:1.0   worker1   Running         Running 16 seconds ago                
    367ghy7ujl7y   demo_bb-app.3   bulletinboard:1.0   worker2   Running         Running 16 seconds ago
    
    이번에는 각 노드에 정상적으로 분배되었다
    그럼 제가 일지를 전달해 드릴게요.
    $ lxc exec manager -- docker service logs -n0 -f demo_bb-app
    
    이 상태에서 브라우저에서 화면을 다시 열 때
    demo_bb-app.2.m3mytsmtchi0@worker1    | GET / 304 0.403 ms - -
    demo_bb-app.1.u9dg3koqso2l@manager    | GET /node_modules/vue/dist/vue.min.js 304 0.549 ms - -
    demo_bb-app.3.367ghy7ujl7y@worker2    | GET /site.css 304 0.601 ms - -
    demo_bb-app.3.367ghy7ujl7y@worker2    | GET /app.js 304 0.693 ms - -
    demo_bb-app.2.m3mytsmtchi0@worker1    | GET /node_modules/bootstrap/dist/css/bootstrap.min.css 304 0.734 ms - -
    demo_bb-app.2.m3mytsmtchi0@worker1    | GET /node_modules/vue-resource/dist/vue-resource.min.js 304 2.830 ms - -
    demo_bb-app.2.m3mytsmtchi0@worker1    | GET /api/events 304 0.639 ms - -
    demo_bb-app.2.m3mytsmtchi0@worker1    | GET /fonts/geomanist/hinted-Geomanist-Book.woff2 304 0.375 ms - -
    demo_bb-app.2.m3mytsmtchi0@worker1    | GET /null 404 0.514 ms - 143
    demo_bb-app.3.367ghy7ujl7y@worker2    | GET /node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 304 0.524 ms - -
    
    이러한 상황에서 요청은 각 노드에 분산되어 집행된다는 것을 알 수 있다

    관리자를 추가하여 고장에 대한 내구성을 확보하다


    문서 기반
    최대 N-manager 클러스터 수(N-1)/2manage 장애
    따라서 고장 저항성을 확보하기 위해 최소한 3개의 관리자 노드가 필요하기 때문에 2개의 관리자 노드를 추가하여
    $ lxc launch swarm manager2
    $ lxc launch swarm manager3
    
    관리자용 영패로 스마트 가입
    $ lxc exec manager -- docker swarm join-token manager
    To add a manager to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-3u72kjwwe38yxzlpx29km6a7l4gliagus00eb1ivx9jd5ocbhs-7y5i7tpuv3qpqkzx2qpomp1e0 10.129.61.177:2377
    
    $ lxc exec manager2 -- docker swarm join --token SWMTKN-1-3u72kjwwe38yxzlpx29km6a7l4gliagus00eb1ivx9jd5ocbhs-7y5i7tpuv3qpqkzx2qpomp1e0 10.129.61.177:2377
    This node joined a swarm as a manager.
    $ lxc exec manager3 -- docker swarm join --token SWMTKN-1-3u72kjwwe38yxzlpx29km6a7l4gliagus00eb1ivx9jd5ocbhs-7y5i7tpuv3qpqkzx2qpomp1e0 10.129.61.177:2377
    This node joined a swarm as a manager.
    
    확인
    $ lxc exec manager -- docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    pwyisd5zyjgbpkep7isbka9m2 *   manager    Ready     Active         Leader           20.10.7
    h9vyiz86y4cvpl2zkzln1a64u     manager2   Ready     Active         Reachable        20.10.7
    zlsym5cfjavdt2gs5qhqmejnq     manager3   Ready     Active         Reachable        20.10.7
    60t0m4m637tcyvg4v8bv6vmmu     worker1    Ready     Active                          20.10.7
    lcvgurxwu6lye0ulfl816enbn     worker2    Ready     Active                          20.10.7
    
    어렵기 때문에 어플리케이션도 모두 구성
    $ lxc exec manager -- docker save bulletinboard | lxc exec manager2 -- docker load
    $ lxc exec manager -- docker save bulletinboard | lxc exec manager3 -- docker load
    $ lxc exec manager -- docker service scale demo_bb-app=5
    $ lxc exec manager -- docker service ps demo_bb-app -f DESIRED-STATE=running
    ID             NAME            IMAGE               NODE       DESIRED STATE   CURRENT STATE               ERROR     PORTS
    u9dg3koqso2l   demo_bb-app.1   bulletinboard:1.0   manager    Running         Running 2 hours ago                   
    m3mytsmtchi0   demo_bb-app.2   bulletinboard:1.0   worker1    Running         Running about an hour ago             
    367ghy7ujl7y   demo_bb-app.3   bulletinboard:1.0   worker2    Running         Running about an hour ago             
    09kkoprfbpz9   demo_bb-app.4   bulletinboard:1.0   manager2   Running         Running 12 seconds ago                
    zhrcudp3895f   demo_bb-app.5   bulletinboard:1.0   manager3   Running         Running 13 seconds ago
    
    이 상태에서 Leader의 관리자로 중지
    $ lxc stop manager
    
    리더 3이 Leader로 선택됨
    $ lxc exec manager2 -- docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    pwyisd5zyjgbpkep7isbka9m2     manager    Unknown   Active         Unreachable      20.10.7
    h9vyiz86y4cvpl2zkzln1a64u *   manager2   Ready     Active         Reachable        20.10.7
    zlsym5cfjavdt2gs5qhqmejnq     manager3   Ready     Active         Leader           20.10.7
    60t0m4m637tcyvg4v8bv6vmmu     worker1    Ready     Active                          20.10.7
    lcvgurxwu6lye0ulfl816enbn     worker2    Ready     Active                          20.10.7
    
    이 상태에서 서비스를 확인한 후 관리자에서 일하는 서비스가worker1에 계승되어 정상적으로 축소됨
    $ lxc exec manager2 -- docker service ps demo_bb-app -f DESIRED-STATE=running
    ID             NAME            IMAGE               NODE       DESIRED STATE   CURRENT STATE           ERROR     PORTS
    hg8qarxfsjoc   demo_bb-app.1   bulletinboard:1.0   worker1    Running         Running 2 minutes ago             
    m3mytsmtchi0   demo_bb-app.2   bulletinboard:1.0   worker1    Running         Running 2 minutes ago             
    367ghy7ujl7y   demo_bb-app.3   bulletinboard:1.0   worker2    Running         Running 2 minutes ago             
    09kkoprfbpz9   demo_bb-app.4   bulletinboard:1.0   manager2   Running         Running 2 minutes ago             
    zhrcudp3895f   demo_bb-app.5   bulletinboard:1.0   manager3   Running         Running 2 minutes ago
    
    관리자를 재부팅하면 Swarm 클러스터에 다시 삽입되는지 확인
    $ lxc start manager
    $ lxc exec manager2 -- docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    pwyisd5zyjgbpkep7isbka9m2     manager    Ready     Active         Reachable        20.10.7
    h9vyiz86y4cvpl2zkzln1a64u *   manager2   Ready     Active         Reachable        20.10.7
    zlsym5cfjavdt2gs5qhqmejnq     manager3   Ready     Active         Leader           20.10.7
    60t0m4m637tcyvg4v8bv6vmmu     worker1    Ready     Active                          20.10.7
    lcvgurxwu6lye0ulfl816enbn     worker2    Ready     Active                          20.10.7
    

    서비스 업데이트


    microbot이라는 운행 중 호스트의 확인과 업데이트 확인을 위한 컨테이너가 있으니 확인해 보세요
    !
    처음부터 이걸 사용하려고 했는데 원래였다면 실행 중인 호스트 이름이 화면에 뜨는 WEB 화면이 열렸을 텐데 호스트 이름이 안 뜨더라고요.
    swarm에서 실행할 때hostname -f 지령이 정상적으로 작동하지 못하는 것은 원인이지만 왜 이렇게 변했는지 아직 잘 모르겠어요.
    먼저 기존 서비스 삭제
    $ lxc exec manager2 -- docker service rm demo_bb-app
    
    디자인 마이크로봇
    $ lxc exec manager2 -- \
    docker service create --replicas 5 \
    --name microbot \
    --publish 80:80 \
    dontrebootme/microbot:v1
    
    화면 확인
    Imgur
    v1에서 v2로의 이미지 업데이트
    $ lxc exec manager -- docker service update --image dontrebootme/microbot:v2 microbot
    
    브라우저를 계속 업데이트할 경우 화면 전환
    Imgur
    프로세스 확인
    $ lxc exec manager -- docker service ps microbot
    ID             NAME             IMAGE                      NODE       DESIRED STATE   CURRENT STATE            ERROR     PORTS
    av0cpmgaq70s   microbot.1       dontrebootme/microbot:v2   manager    Running         Running 2 minutes ago              
    w3r6fuob4y4u    \_ microbot.1   dontrebootme/microbot:v1   manager    Shutdown        Shutdown 2 minutes ago             
    jolnqtaiy7mo   microbot.2       dontrebootme/microbot:v2   manager3   Running         Running 3 minutes ago              
    qmlwwytr2c9j    \_ microbot.2   dontrebootme/microbot:v1   manager3   Shutdown        Shutdown 3 minutes ago             
    wm91vtjq45ny   microbot.3       dontrebootme/microbot:v2   worker1    Running         Running 2 minutes ago              
    x7nb1cjxbgfc    \_ microbot.3   dontrebootme/microbot:v1   worker1    Shutdown        Shutdown 2 minutes ago             
    51rojcmq1iy6   microbot.4       dontrebootme/microbot:v2   manager2   Running         Running 3 minutes ago              
    ucfa641q8ywg    \_ microbot.4   dontrebootme/microbot:v1   manager2   Shutdown        Shutdown 3 minutes ago             
    p4u64ktzti2z   microbot.5       dontrebootme/microbot:v2   worker2    Running         Running 2 minutes ago              
    vxqeaxswe3fv    \_ microbot.5   dontrebootme/microbot:v1   worker2    Shutdown        Shutdown 2 minutes ago 
    
    각 노드에서 v1이 정지되고 v2가 시작되는 것을 발견
    모든 프로그램이 시작되기 전에 오래된 프로그램이 계속 표시되기 때문에 모든 프로그램이 정상적으로 시작되기 전에 새 프로그램으로 전환하지 않습니다
    신구가 교체되기 전에는 한순간에 접근할 수 없으니 갱신할 때 주의하는 것이 좋다--update-parallelism 0에서 지정한 매개 변수로 여러 개를 동시에 업데이트할 수 있습니다.

    HAProxy로 LB를 해보도록 하겠습니다.


    현재 적절히 선택한 노드의 IP에 대한 요청을 보내서 동작을 확인하고 있지만, 실제로는 앞부분에서 이 LB를 정리했습니다. 그 사람이 요청을 처리하는 경우가 많기 때문에 HAProxy를 놓아보려고 합니다.
    한 마디로 하면 HAProxy 동작을 만드는 LXD 용기는 Docker를 사용하기 때문에 Swarm용 이미지를 사용합니다
    $ lxc launch swarm HAProxy
    
    현재 LXD 컨테이너 일람 확인
    $ lxc list
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    |   NAME   |  STATE  |             IPV4             |                     IPV6                      |   TYPE    | SNAPSHOTS |
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | HAProxy  | RUNNING | 172.17.0.1 (docker0)         | fd42:6f2d:73e1:6009:216:3eff:fec8:5939 (eth0) | CONTAINER | 0         |
    |          |         | 10.129.61.154 (eth0)         |                                               |           |           |
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | manager  | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:fe40:5bda (eth0) | CONTAINER | 0         |
    |          |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |          |         | 10.129.61.177 (eth0)         |                                               |           |           |
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | manager2 | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:fe61:77cb (eth0) | CONTAINER | 0         |
    |          |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |          |         | 10.129.61.55 (eth0)          |                                               |           |           |
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | manager3 | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:fe3c:ad7 (eth0)  | CONTAINER | 0         |
    |          |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |          |         | 10.129.61.242 (eth0)         |                                               |           |           |
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | worker1  | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:feb7:91c3 (eth0) | CONTAINER | 0         |
    |          |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |          |         | 10.129.61.51 (eth0)          |                                               |           |           |
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    | worker2  | RUNNING | 172.18.0.1 (docker_gwbridge) | fd42:6f2d:73e1:6009:216:3eff:fe5b:2a16 (eth0) | CONTAINER | 0         |
    |          |         | 172.17.0.1 (docker0)         |                                               |           |           |
    |          |         | 10.129.61.144 (eth0)         |                                               |           |           |
    +----------+---------+------------------------------+-----------------------------------------------+-----------+-----------+
    
    각 컨테이너의 eth0 기반 IP 생성 설정 파일
    cat <<EOF > /tmp/haproxy.cfg
    frontend web_proxy
        default_backend test
        bind *:80
    
    backend test
        option redispatch
        retries 3
        server manager 10.129.61.177:80 weight 1
        server manager2 10.129.61.55:80 weight 1
        server manager3 10.129.61.242:80 weight 1
        server worker1 10.129.61.51:80 weight 1
        server worker2 10.129.61.144:80 weight 1
    EOF
    
    HAProxy 컨테이너에 복사
    $ lxc file push /tmp/haproxy.cfg HAProxy/haproxy.cfg
    
    HAProxy 시작
    $ lxc exec HAProxy -- docker run -d -p 80:80 -v /haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg --name web haproxy
    
    부팅 확인
    $ lxc exec HAProxy -- docker ps -a
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
    87abe54b9256   haproxy   "docker-entrypoint.s…"   27 seconds ago   Up 19 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web
    
    브라우저에서 HAProxy에 액세스하면 Swarm에 로그인한 서비스의 이미지가 표시됩니다.
    Imgur
    관리자, 워크맨 1, 워크맨 2 노드를 정지해 보십시오
    $ lxc stop manager worker1 worker2
    $ lxc exec manager2 -- docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    pwyisd5zyjgbpkep7isbka9m2     manager    Down      Active         Unreachable      20.10.7
    h9vyiz86y4cvpl2zkzln1a64u *   manager2   Ready     Active         Reachable        20.10.7
    zlsym5cfjavdt2gs5qhqmejnq     manager3   Ready     Active         Leader           20.10.7
    60t0m4m637tcyvg4v8bv6vmmu     worker1    Down      Active                          20.10.7
    lcvgurxwu6lye0ulfl816enbn     worker2    Down      Active                          20.10.7
    
    노드의 절반 이상이 정지 상태이며 HAProxy를 경유하면 정상 노드에 연결됩니다.

    총결산


    시간이 길어졌으니 우선 여기까지만 하자
    아직 만지고 싶은 게 많으니까 추기할지 부기할지 나중에 생각해 보자
    K8s 때보다 쉬울 것 같아서 docker 지령에 어느 정도 익숙해지면 연장선상에서 사용할 수 있다
    고물 PC를 생산해서 모여서 Docker 클러스터 조립처럼 막 굴면 이걸로 할까 해요
    나중에 추가하면 콘피그와 시크릿이 편할 것 같아서 독립된 ARON이라도 스warm을 효과적으로 사용할 수 있을 것 같아요.

    P.S.


    사회에서 반도체 부족이 오랫동안 일어났다
    애플리케이션 쪽이라서 자기랑 상관없는 말인 줄 알았는데 실제 피해를 줄 줄은 몰랐어요.
    구식 현장이기 때문에 가동된 서버가 많을 텐데, 이미 보수적인 낡은 것들은 새것으로 바꿔야 한다
    따라서 서버를 교체할 때 확보한 예산에도 추가 애플리케이션 기능에 대한 예산이 포함돼 있다.
    거기 반도체 부족 직접 충격 서버 납기 미정😇
    결국
    휘말린 앱의 대응도 무한 연기!🤣
    그럼 이 상태는 언제까지 이어질까...

    좋은 웹페이지 즐겨찾기