CentOS 7에서 Docker Swarm (CE)을 사용한 고정 세션

소개

Docker Swarm은 개별 서버를 컴퓨터 클러스터로 전환하여 확장, 고 가용성 및로드 밸런싱을 용이하게합니다. Swarm로드 밸런서는 라운드 로빈로드 밸런싱 전략을 구현하며 이는 여러 인스턴스를 사용하여 고 가용성 설정을 허용하기 위해 일정한 형식의 고정 세션이 필요한 (레거시) 상태 저장 애플리케이션의 올바른 기능을 방해 할 수 있습니다. Docker Enterprise Edition은 Layer-7 고정 세션을 지원하지만이 안내서에서는 Docker의 무료 (CE) 버전에 중점을 둘 것입니다. 고정 세션을 구현하기 위해 Traefik을 사용합니다.

전제 조건

  • 프라이빗 네트워킹이 활성화 된 동일한 서브넷에서 새로 배포되고 업데이트 된 CentOS 7 인스턴스 2 개 이상
  • 이러한 인스턴스에 설치된 Docker CE
  • 인스턴스는 동일한 Swarm의 일부 여야하며 개인 네트워크를 통해 서로 통신 할 수 있어야합니다
  • Docker 및 Docker Swarm에 대한 사전 지식
  • sudo 권한을 가진 관리자가 아닌 사용자 (선택 사항이지만 루트 사용자를 사용하지 않는 것이 좋습니다)

이 자습서에서는 프라이빗 IP 주소가 192.168.0.100 및 192.168.0.101 인 두 개의 Vultr 인스턴스를 사용합니다. 둘 다 Docker Swarm 관리자 노드입니다 (제작에는 적합하지 않지만이 자습서에는 충분합니다).

우와 미

이 학습서는 jwilder/whoami도커 이미지를 데모 애플리케이션으로 사용합니다 . 이 간단한 컨테이너는 응답 컨테이너의 이름으로 REST 호출에 응답하므로 고정 세션이 작동하는지 테스트하기가 매우 쉽습니다. 이 이미지는 데모 용으로 만 사용되며 자신의 응용 프로그램 이미지로 교체해야합니다. 는 whoami-service다음과 같이 구성된다 :

sudo docker network create whoaminet -d overlay
sudo docker service create --name whoami-service --mode global --network whoaminet --publish "80:8000" jwilder/whoami
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload

curl에서 whoamiREST 엔드 포인트를 계속 사용 하는 경우 http://192.168.0.100/직장에서 Docker Swarm의 라운드 로빈로드 균형 조정을 볼 수 있습니다.

curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3

Chrome 또는 Firefox와 같은 최신 브라우저에서는 연결을 유지 (개방)하도록 설계되어 있으며 Docker Swarm로드 밸런서는 새로운 연결 마다 다른 컨테이너로만 전환하므로이 테스트에 사용할 필요가 없습니다 . 브라우저에서이를 테스트하려면 연결이 닫힐 때까지 30 초 이상 기다려야 새로 고칠 수 있습니다.

Traefik 설정

Traefik은 기본적으로 Docker Swarm을 지원하며 컨테이너를 즉시 감지 및 등록 또는 등록 취소 할 수 있으며 내부 오버레이 네트워크를 통해 애플리케이션과 통신합니다. Traefik은 요청 처리를 시작하기 전에 애플리케이션에 대한 정보가 필요합니다. 이 정보는 Swarm 서비스에 레이블을 추가하여 Traefik에 제공됩니다.

sudo docker service update --label-add "traefik.docker.network=whoaminet" --label-add "traefik.port=8000" --label-add "traefik.frontend.rule=PathPrefix:/" --label-add "traefik.backend.loadbalancer.stickiness=true" whoami-service

아래 목록은 각 레이블의 의미를 설명합니다.

  • traefik.docker.network: Traefik이 서비스와 통신 할 Docker 오버레이 네트워크
  • traefik.port: 서비스가 청취중인 포트 (게시 된 포트가 아니라 내부적으로 노출 된 포트 임)
  • traefik.frontend.rule: PathPrefix:/컨텍스트 루트 /를이 서비스에 바인딩합니다 .
  • traefik.backend.loadbalancer.stickiness:이 서비스에 고정 세션을 사용합니다.

가 지금 whoami-service필요한 라벨로 구성되어, 우리는 떼에 Traefik 서비스를 추가 할 수 있습니다 :

sudo docker service create --name traefik -p8080:80 -p9090:8080 --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock --mode=global --constraint 'node.role == manager' --network whoaminet traefik --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG

이 명령은 한 번에 많은 작업을 수행합니다. 아래 목록에 자세한 내용이 설명되어 있습니다.

  • --name traefik: 새로운 Docker 서비스 이름은 traefik
  • -p8080:80: Traefik의 포트 80를 포트에 게시합니다 8080(포트 80는 이미 포트 에서 사용 중입니다 whoami-service)
  • -p9090:8080: Traefik의 자체 웹 인터페이스를 포트에 게시 9090
  • --mount ...: Traefik이 호스트의 Docker 런타임에 액세스 할 수 있도록 Docker Socket을 컨테이너에 마운트합니다.
  • --global: 고 가용성을 위해 각 관리자 노드에 Traefik 컨테이너가 필요합니다.
  • --constraint 'node.role == manager': 작업자 노드는 Traefik에 필요한 정보를 제공 할 수 없으므로 관리자 노드에서만 Traefik을 실행하려고합니다. 예를 들어 docker service ls작업자 노드에서 작동하지 않으므로 Traefik은 실행중인 서비스를 찾을 수조차 없습니다.
  • --network whoaminet: Traefik을와 동일한 네트워크에 whoami-service연결합니다. 그렇지 않으면 연결할 수 없습니다. 우리는 이전에 Traefik에게 traefik.docker.network라벨 이있는이 네트워크를 통해 서비스에 연결하라고 했습니다
  • traefik: 도커에게이 서비스에 최신 Traefik 도커 이미지를 사용하도록 지시하십시오.
  • --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG: Docker swarm 모드에서 실행할 수 있도록 Traefik에 직접 전달되는 명령 행 인수 ( --loglevel=DEBUG선택 사항이지만 설정 및이 학습서에서는 흥미 롭습니다)

CentOS 방화벽에서 필요한 포트를 열면됩니다.

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=9090/tcp --permanent
sudo firewall-cmd --reload

작동 원리

Traefik이 시작 되 자마자 Traefik이 두 whoami컨테이너를 발견 한 로그를 볼 수 있습니다 . 또한 고정 세션을 처리하는 데 사용할 쿠키 이름을 출력합니다.

time="2018-11-25T13:17:30Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami-service\":{\"servers\":{\"server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1}},\"loadBalancer\":{\"method\":\"wrr\",\"stickiness\":{}}}},\"frontends\":{\"frontend-PathPrefix-0\":{\"entryPoints\":[\"http\"],\"backend\":\"backend-whoami-service\",\"routes\":{\"route-frontend-PathPrefix-0\":{\"rule\":\"PathPrefix:/\"}},\"passHostHeader\":true,\"priority\":0,\"basicAuth\":null}}}"
time="2018-11-25T13:17:30Z" level=debug msg="Wiring frontend frontend-PathPrefix-0 to entryPoint http"
time="2018-11-25T13:17:30Z" level=debug msg="Creating backend backend-whoami-service"
time="2018-11-25T13:17:30Z" level=debug msg="Adding TLSClientHeaders middleware for frontend frontend-PathPrefix-0"
time="2018-11-25T13:17:30Z" level=debug msg="Creating load-balancer wrr"
time="2018-11-25T13:17:30Z" level=debug msg="Sticky session with cookie _a49bc"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05 at http://10.0.0.5:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6 at http://10.0.0.4:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating route route-frontend-PathPrefix-0 PathPrefix:/"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :80"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :8080"

우리가 말을 걸면 http://192.168.0.100:8080새로운 쿠키 _a49bc가 설정되었음을 알 수 있습니다 .

curl -v http://192.168.0.100:8080
* About to connect() to 192.168.0.100 port 8080 (#0)
*   Trying 192.168.0.100...
* Connected to 192.168.0.100 (192.168.0.100) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.0.100:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 17
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 25 Nov 2018 13:18:40 GMT
< Set-Cookie: _a49bc=http://10.0.0.5:8000; Path=/
<
I'm a6a8c9294fc3
* Connection #0 to host 192.168.0.100 left intact

후속 전화에서이 쿠키를 Traefik으로 보내면 항상 동일한 컨테이너로 전달됩니다.

curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3

쿠키에는 Traefik이 요청을 보내야하는 컨테이너의 내부 (오버레이) IP 주소 만 포함됩니다. 쿠키 값을 http://10.0.0.4:8000로 변경하면 요청이 다른 컨테이너로 효과적으로 전달됩니다. 쿠키를 Traefik으로 다시 보내지 않으면 고정 세션이 작동하지 않고 응용 프로그램 컨테이너와 Traefik 컨테이너간에 요청이 균형을 이룹니다.

이것이 CentOS 7의 Docker CE에서 레이어 7 고정 세션을 설정하는 데 필요한 전부입니다.



CentOS 7 서버에 CyberPanel을 설치하고 구성하는 방법

CentOS 7 서버에 CyberPanel을 설치하고 구성하는 방법

다른 시스템을 사용하십니까? 소개 CyberPanel은 오픈 소스이며 OpenLiteSpeed를 사용하는 최초의 제어판 중 하나입니다. 무슨 티

CentOS 7에 채팅 서버를 배포하는 방법

CentOS 7에 채팅 서버를 배포하는 방법

Lets Chat은 소규모 팀을위한 자체 호스팅 메시징 서비스를 제공하도록 설계된 오픈 소스 채팅 응용 프로그램입니다. 채팅이 NodeJS 및 MongoDB를 기반으로 함

CentOS 7에 예약 스케줄러를 설치하는 방법

CentOS 7에 예약 스케줄러를 설치하는 방법

다른 시스템을 사용하십니까? 전제 조건 Vultr CentOS 7 서버 인스턴스. sudo 사용자 1 단계 : 시스템 업데이트 먼저 시스템 서버를 업데이트하십시오.

CentOS 7에 Netdata 설치

CentOS 7에 Netdata 설치

다른 시스템을 사용하십니까? Netdata는 실시간 시스템 메트릭 모니터링 분야에서 떠오르는 별입니다. 같은 종류의 다른 도구 인 Netdata와 비교하면 :

CentOS 7에 DreamFactory 오픈 소스를 설치하는 방법

CentOS 7에 DreamFactory 오픈 소스를 설치하는 방법

DreamFactory는 모든 데이터베이스를 RESTful API 플랫폼으로 전환 할 수있는 오픈 소스 프로그램입니다. DreamFactory는 다양한 플랫폼에 배포 할 수 있습니다. 티에서

CentOS 7에 JC2-MP (Just Cause 2) 서버를 설치하는 방법

CentOS 7에 JC2-MP (Just Cause 2) 서버를 설치하는 방법

이 튜토리얼에서는 Just Cause 2 멀티 플레이어 서버를 설정하는 방법을 배웁니다. 전제 조건 시작하기 전에 시스템이 완전히 업데이트되었는지 확인하십시오

CentOS 7에서 Leanote 서버를 설정하는 방법

CentOS 7에서 Leanote 서버를 설정하는 방법

Leanote는 Golang으로 작성된 Evernote의 무료, 경량 및 오픈 소스 대안입니다. 사용자 경험을 염두에두고 Leanote는 사용자에게 재치를 제공합니다.

CentOS 7에 Starbound Server를 설치하는 방법

CentOS 7에 Starbound Server를 설치하는 방법

다른 시스템을 사용하십니까? 이 튜토리얼에서는 CentOS 7에서 Starbound 서버를 설정하는 방법을 설명하겠습니다. 전제 조건이 게임을 소유해야합니다

CentOS 8, Ubuntu 18.04, Debian 10 및 Fedora 31에 Golang 1.13을 설치하는 방법 31

CentOS 8, Ubuntu 18.04, Debian 10 및 Fedora 31에 Golang 1.13을 설치하는 방법 31

Go (Golang이라고도 함)는 Google에서 개발 한 정적으로 형식이 지정된 컴파일 된 C 유사 프로그래밍 언어입니다. 단순성과 다목적 성으로 인해 b가되었습니다.

CentOS 7에 Django를 설치하는 방법

CentOS 7에 Django를 설치하는 방법

Django는 웹 응용 프로그램을 작성하는 데 널리 사용되는 Python 프레임 워크입니다. Django를 사용하면 휠을 재발 명하지 않고도 응용 프로그램을 더 빠르게 구축 할 수 있습니다. 당신이 원하는 경우

CentOS 6에서 SA-MP San Andreas 멀티 플레이어 서버 설정

CentOS 6에서 SA-MP San Andreas 멀티 플레이어 서버 설정

다른 Vultr 튜토리얼에 오신 것을 환영합니다. 여기에서는 SAMP 서버를 설치하고 실행하는 방법에 대해 설명합니다. 이 안내서는 CentOS 6 용으로 작성된 것입니다. 전제 조건

CentOS 7 LAMP VPS에 TextPattern CMS를 설치하는 방법

CentOS 7 LAMP VPS에 TextPattern CMS를 설치하는 방법

다른 시스템을 사용하십니까? TextPattern CMS 4.6.2는 간단하고 유연하며 무료이며 오픈 소스 CMS (콘텐츠 관리 시스템)로 웹 디자이너는

CentOS 7에 Elgg 설치

CentOS 7에 Elgg 설치

다른 시스템을 사용하십니까? Elgg는 캠퍼스 소셜 네트워크와 같은 소셜 환경을 만들 수있는 오픈 소스 소셜 네트워킹 엔진입니다.

CentOS 7 개발을위한 Sails.js 설정

CentOS 7 개발을위한 Sails.js 설정

다른 시스템을 사용하십니까? 소개 Sails.js는 Ruby on Rails와 비슷한 Node.js 용 MVC 프레임 워크입니다. 그것은 현대적인 응용 프로그램을 개발할 수 있습니다

CentOS 7에 PufferPanel (무료 Minecraft 제어판)을 설치하는 방법

CentOS 7에 PufferPanel (무료 Minecraft 제어판)을 설치하는 방법

소개이 자습서에서는 Vultr VPS에 PufferPanel을 설치하십시오. PufferPanel은 사용자를 관리하기위한 무료 오픈 소스 제어판입니다.

PHP를 5에서 7로 업데이트하는 방법 (NGINX / Apache, CentOS 7)

PHP를 5에서 7로 업데이트하는 방법 (NGINX / Apache, CentOS 7)

소개이 튜토리얼은 NGINX 또는 Apache로 PHP 5 *를 7로 업데이트하는 방법을 다룹니다. 전제 조건 시작하기 전에 저장소를 추가해야합니다.

CentOS 7에 MoinMoin을 설치하는 방법

CentOS 7에 MoinMoin을 설치하는 방법

MoinMoin은 Python으로 작성된 오픈 소스 파일 시스템 기반 위키 엔진입니다. 오늘날 MoinMoin은 오픈 소스 커뮤니티에서 널리 사용됩니다. 많은 공급 업체

CentOS 7에 SonarQube를 설치하는 방법

CentOS 7에 SonarQube를 설치하는 방법

다른 시스템을 사용하십니까? SonarQube는 품질 시스템 개발을위한 오픈 소스 도구입니다. Java로 작성되었으며 여러 데이터베이스를 지원합니다. 그것은 제공

OS 선택 : CentOS, Ubuntu, Debian, FreeBSD, CoreOS 또는 Windows Server

OS 선택 : CentOS, Ubuntu, Debian, FreeBSD, CoreOS 또는 Windows Server

이 기사는 Vultr에서 템플릿으로 제공되는 서버 운영 체제에 대한 간략한 개요를 제공합니다. CentOS CentOS는 RHEL의 공개 소스 버전입니다 (Re

CentOS 7에 phpPgAdmin 설치

CentOS 7에 phpPgAdmin 설치

phpPgAdmin은 널리 사용되는 PostgreSQL 관리 도구입니다. 직관적 인 웹 인터페이스에서 PostgreSQL 데이터베이스를 관리하는 데 사용할 수 있습니다. 이 기사에서 우리는

AI가 랜섬웨어 공격의 증가와 싸울 수 있습니까?

AI가 랜섬웨어 공격의 증가와 싸울 수 있습니까?

랜섬웨어 공격이 증가하고 있지만 AI가 최신 컴퓨터 바이러스를 처리하는 데 도움이 될 수 있습니까? AI가 답인가? AI boone 또는 bane인지 여기에서 읽으십시오.

ReactOS: 이것이 Windows의 미래입니까?

ReactOS: 이것이 Windows의 미래입니까?

오픈 소스이자 무료 운영 체제인 ReactOS가 최신 버전과 함께 제공됩니다. 현대 Windows 사용자의 요구 사항을 충족하고 Microsoft를 무너뜨릴 수 있습니까? 이 구식이지만 더 새로운 OS 환경에 대해 자세히 알아보겠습니다.

WhatsApp 데스크톱 앱 24*7을 통해 연결 유지

WhatsApp 데스크톱 앱 24*7을 통해 연결 유지

Whatsapp은 마침내 Mac 및 Windows 사용자용 데스크톱 앱을 출시했습니다. 이제 Windows 또는 Mac에서 Whatsapp에 쉽게 액세스할 수 있습니다. Windows 8 이상 및 Mac OS 10.9 이상에서 사용 가능

AI는 어떻게 프로세스 자동화를 다음 단계로 끌어올릴 수 있습니까?

AI는 어떻게 프로세스 자동화를 다음 단계로 끌어올릴 수 있습니까?

인공 지능이 소규모 회사에서 어떻게 인기를 얻고 있으며 어떻게 인공 지능이 성장할 가능성을 높이고 경쟁자가 우위를 점할 수 있는지 알아보려면 이 기사를 읽으십시오.

macOS Catalina 10.15.4 추가 업데이트로 인해 해결보다 더 많은 문제가 발생함

macOS Catalina 10.15.4 추가 업데이트로 인해 해결보다 더 많은 문제가 발생함

최근 Apple은 문제를 해결하기 위해 macOS Catalina 10.15.4 추가 업데이트를 출시했지만 이 업데이트로 인해 Mac 컴퓨터의 브릭킹으로 이어지는 더 많은 문제가 발생하는 것 같습니다. 자세히 알아보려면 이 기사를 읽어보세요.

빅데이터의 13가지 상용 데이터 추출 도구

빅데이터의 13가지 상용 데이터 추출 도구

빅데이터의 13가지 상용 데이터 추출 도구

저널링 파일 시스템이란 무엇이며 어떻게 작동합니까?

저널링 파일 시스템이란 무엇이며 어떻게 작동합니까?

우리 컴퓨터는 모든 데이터를 저널링 파일 시스템이라고 하는 체계적인 방식으로 저장합니다. 검색을 누르는 즉시 컴퓨터에서 파일을 검색하고 표시할 수 있는 효율적인 방법입니다.https://wethegeek.com/?p=94116&preview=true

기술적 특이점: 인류 문명의 먼 미래?

기술적 특이점: 인류 문명의 먼 미래?

과학이 빠른 속도로 발전하고 우리의 많은 노력을 인수함에 따라 설명할 수 없는 특이점에 처할 위험도 높아집니다. 특이점이 우리에게 무엇을 의미할 수 있는지 읽어보십시오.

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

2021년 의료 분야에서 인공 지능의 영향

2021년 의료 분야에서 인공 지능의 영향

의료 분야의 AI는 지난 수십 년 동안 큰 도약을 했습니다. 따라서 의료 분야에서 AI의 미래는 여전히 나날이 성장하고 있습니다.