ARM 보드 여러 가지로 집 DockerSwarm 클러스터 traefik편

클러스터를 만들고 있는 곳(진행형)이므로 그 메모를 남겨 갑니다.
이 기사에서는 집 ARM 보드에 traefik를 넣습니다.

참고: Traefik v2 및 Traefik v1 설정 방법은 호환되지 않습니다.
이 기사에서는 Traefik v2.5를 사용한 구성을 보여줍니다.

집 클러스터 시리즈


  • 제1탄: 하드웨어편
  • 제2탄: Portainer편
  • 제3탄: Ceph편(실패)
  • 제4탄: SeaweedFS편
  • 제5탄: traefik편

  • Traefik 정보



    Go제의 컨테이너와 궁합이 좋은 느낌의 리버스 프록시입니다. 컨테이너에 라벨을 붙이면 동적으로 라우팅해 주거나 LetsEncrypt의 증명서의 자동 발행을 할 수 있거나, 좋은 느낌의 API가 있는 멋있는 사람입니다. 컨테이너 간의 네트워크를 제대로 구성하면 물리적 포트에 할당하지 않고 (어떤 포트를 사용했는지 생각하지 않고!) 서비스를 배포 할 수 있습니다.

    왜 nginx 나 apache를 사용하지 않습니까?



    둘 다 라즈파이 1대로 설치했을 때 사용했습니다. 그대로 설정해도 아마도 잘 갈 것이라고 생각합니다만, 모처럼 DockerSwarm을 도입했으므로, 그것에 맞는 현대적인 툴을 시험해 보려고 생각합니다.

    소개



    지금까지 Portainer와 SeaweedFS를 설정했으므로 WebUI에서 서비스를 추가 할 수있는/mnt/seaweedfs에 구성 파일을 저장할 수 있다고 가정합니다.

    1 traefik에서 사용할 네트워크 만들기



    미리 Swarm 내에서 사용할 overlay 네트워크를 만듭니다.


    2 필요한 파일을 /mnt/seaweedfs에 준비



    traefik 폴더와 파일 준비
    sudo mkdir /mnt/seaweedfs/traefik
    sudo mkdir /mnt/seaweedfs/traefik/certs
    sudo touch /mnt/seaweedfs/traefik/certs/certs.json
    sudo nano /mnt/seaweedfs/traefik/traefik.yml
    

    traefik.yml에 다음 내용을 붙여넣기
    providers:
      docker:
        exposedByDefault: false
        # テスト用(公開時は要変更)
        defaultRule: "Host(`{{ index .Labels \"traefik.host\" }}.192.168.0.11.nip.io`)"
        swarmMode: true
    api:
      insecure: true
    

    nip.io 란 무엇입니까?





    이 기사에서 소개되었지만 서브 도메인을 붙인 채로 지정된 IP 주소로 라우팅을 반환하는 DNS 서비스 인 것 같습니다. LAN 내의 주소에도 사용할 수 있으므로 테스트 용으로 이용하겠습니다.

    3 compose 파일 배포



    stacks에서 아래의 compose 파일을 배포합니다.


    docker-compose.yml
    version: "3.4"
    
    services:
      traefik:
        image: traefik:v2.5
        ports:
          - 80:80 # HTTP
          - 443:443 # HTTPS
          - 1204:8080 # API
        networks:
          - traefik-net
        volumes:
          - /mnt/seaweedfs/traefik/certs/certs.json:/certs.json:ro
          - /mnt/seaweedfs/traefik/traefik.yml:/etc/traefik/traefik.yml:ro
          - /var/run/docker.sock:/var/run/docker.sock
        deploy:
          replicas: 1
          placement:
            constraints:
              - node.role==manager
          restart_policy:
            condition: on-failure
    
    networks:
      traefik-net:
        external: true
    

    4 Traefik을 사용해보십시오



    다른 정의 파일로 서비스를 만들고 labels에 traefik를 설정합니다.
    whoami는 각종 IP 주소나 호스트명 ​​등을 확인할 수 있는 컨테이너입니다.

    whoami-compose.yml
    version: "3.4"
    
    services:
      whoami:
        image: containous/whoami
        networks:
          - traefik-net
        deploy:
          replicas: 3
          restart_policy:
            condition: on-failure
          labels:
            - "traefik.enable=true"
            # アクセスする際のホスト名 (テスト用の場合 ホスト名+アドレス+nip.ioになる)
            - "traefik.host=whoami"
            # Traefikの属するのと同じネットワークを指定
            - "traefik.docker.network=traefik-net"
            # Traefikで指定したアクセスする際のエントリーポイント(http/https等)
            - "traefik.http.routers.whoami.entrypoints=http"
            # コンテナ内で動作しているサービスのポート
            - "traefik.http.services.whoami.loadbalancer.server.port=80"
    networks:
      # traefik作成時に作成したネットワーク名
      traefik-net:
        external: true
    

    위를 배포하고 액세스해 보면 아래 그림과 같이 됩니다. 다시 로드하면 최상위 호스트 이름이 변경되어 여러 호스트에서 응답이 반환되는지 확인할 수 있습니다.



    완주한 감상



    격한 개그

    설정 파일을 읽을 수 없는 문제



    전회만큼 곤란하지 않아서 멋지게 끝났습니다만, 어쩐지, 설정 파일을 기입할 때에 수수께끼의 NULL이 삽입되어 잘 동작하지 않는 수수께끼 현상에 곤란했습니다. 원인은 SeaweedFS인 것 같고, 사용하고 있는 디렉토리는 아무리 사이즈가 작아도 즉시 동기화되는 것은 아니기 때문에, 그 폴더에 액세스 하고 있는 서비스를 완전하게 멈추거나 파일을 지워 다시 한번 재작성하지 않는다 그리고 좋지 않은 것 같습니다. Traefik 자체는 뭔가 몹시 편리할 것 같으므로, 향후 말 오랫동안 이용하고 싶습니다.

    온프레로 설정한 사이트 연결되지 않는 문제



    유저 씨로부터 연락 있어 깨달았습니다만, Swarm 내의 노드로, 이미 포트 80으로 움직이고 있던 nginx의 포트를 가로채 버려, 사이트에 연결되지 않게 되어 있었습니다. 이미 움직이는 프로세스가 있다면 다른 포트를 사용하고 사이트가 멈추지 않도록 조심합시다.

    참고

    좋은 웹페이지 즐겨찾기