다운 타임없이 Docker 컨테이너 업데이트


17

웹 서버 (Apache 2와 같은)가있는 Docker 컨테이너가 있다고 가정 해 봅시다. 이제 OS를 업데이트하고 싶습니다. 이 SF 답변 은 가장 좋은 방법은 기본 이미지와 내 Apache 이미지를 다시 작성하는 것입니다. 그러나 이미지를 배포하면 새 컨테이너를 생성하기 전에 이전 컨테이너를 삭제해야하므로 다운 타임이 발생하므로 포트 80/443에 바인딩하는 컨테이너는 하나뿐입니다.

그러나 다운 타임없이이 업데이트를 어떻게 배포 할 수 있습니까? 로드 밸런서를 사용해야하고 컨테이너 간 통신을 사용해야합니까? 로드 밸런서를 어떻게 업데이트합니까?

답변:


18

이상적인 목표 시나리오

예,로드 밸런서를 사용하고 한 번에 하나의 인스턴스를 업데이트해야합니다. 컨테이너 간 통신이 어디서 오는지 잘 모르겠습니다.

예를 들어, 사이트 A에 서비스를 제공하는로드 밸런서가 있다고 가정하십시오. 사용자는 사이트에 연결하고 "A"로만 알고 있습니다. 로드 밸런서는 두 개 이상의 백엔드 (B, C 등)가 있으며 VM인지 컨테이너인지는 중요하지 않습니다.

그런 다음 백엔드 (이 경우 Apache 인스턴스)를 업그레이드하려고합니다.

  1. 로드 밸런서의 적격 백엔드에서 B를 제거하여 더 이상 트래픽을 허용하지 않습니다.
  2. 현재 활성 요청이 처리되고 기존 연결이 닫힐 때까지 기다립니다.
  3. B를 제공하는 컨테이너 또는 기본 VM을 업데이트합니다.
  4. B를 다시 시작하고로드 될 때까지 기다렸다가 작업을 시작하십시오.
  5. B를 테스트하여 새 요청이 올바르게 제공되는지 확인하십시오.
  6. 트래픽을 다시 활성화하기 위해로드 밸런서 백엔드 풀에 B를 다시 추가

그런 다음 C, D 등에서 동일한 프로세스를 수행하십시오.

거기에 있다고 주 도커 컨테이너의 현재 위치에서 업그레이드 열기 요청 년 11 월 2013 년,하지만 위의 솔루션은 그 동안 무엇을해야하므로 훨씬 진전이 나타나지 않습니다.

기존 라이브 사이트를 위해해야 ​​할 일

아마도이 모델에서 라이브 사이트를 이미 실행 중이고 다운 타임없이 업그레이드하기 때문에이 질문을하고있는 것 같습니다. 따라서 위의 이상적인 목표 상태에 도달해야하지만 점진적으로 증가해야합니다.

다음과 같이 가정 해 봅시다 :

  • 컨테이너를 가리키는 DNS 이름이 있습니다.
  • 컨테이너가 일부 IP 주소에서 실행됩니다
  • 사용자는 컨테이너의 IP 주소를 모르며 어디에서나 하드 코딩되지 않았습니다.

이러한 가정이 틀린 경우 먼저 이것이 올바른지 수정해야합니다.

그런 다음 다음 단계를 수행하십시오.

  1. 새 IP에서로드 밸런서를 생성하고 기존 컨테이너에서 유일한 백엔드로 지정
  2. 컨테이너 IP가 아닌로드 밸런서를 가리 키도록 DNS 변경
  3. 동일한 VM + 컨테이너 설정으로 동일한 Apache 백엔드 추가
  4. 이제 두 개의 백엔드 B와 C가있는로드 밸런서가 있으므로 "이상적인 대상 시나리오"섹션의 지침에 따라 한 번에 하나씩 업그레이드하십시오.

로드 밸런서를 업데이트하는 방법

쉬운 (호스팅 된) 방법

가장 쉬운 옵션은 자신의 밸런서를 실행하지 않는 것입니다. 예를 들어로드 밸런싱을 서비스로 제공하는 클라우드 플랫폼을 사용하는 경우이를 사용하는 것을 고려하면로드 밸런서의 유지 관리 및 업데이트는 문제가되지 않습니다.

수동 방법

자체로드 밸런서를 실행중인 경우 다른 간접 계층 (예 : DNS)을 추가하면 도움이됩니다. 다음을 가정 해 봅시다.

  • 로드 밸런서 A의 IP로 확인되는 호스트 이름이 있습니다.
  • 로드 밸런서에는 P1, P2 등의 백엔드 풀이 있습니다.

다음과 같이 진행합니다.

  • 새로운 소프트웨어 버전으로 새로운로드 밸런서 B를 만듭니다.
  • 백엔드 풀 인스턴스 P1, P2 등을 새로운로드 밸런서 B에 백엔드로 추가
  • B의 IP 주소를 A와 함께 DNS 확인에 추가

    • 이제 DNS를로드 밸런서로 효과적으로 사용하고 있습니다.
    • A와 B에 대한 항목이 가중되지 않으면 효과적으로 50-50입니다
    • 이제 B가 어떻게 작동하는지, 오류가 있는지 등을 살펴보십시오.
    • B에 문제가 있으면 다음과 같이 실행 취소하십시오.

      1. DNS 설정에서 B를 제거
      2. DNS의 B 항목이 사라질 때까지 기다립니다 (즉, TTL 이 만료 될 때까지 기다립니다 ).
      3. B를 거절
  • B에 대한 "번인 (burn-in)"테스트를 수행했으며 모든 것이 정상이라고 가정합니다.
  • DNS에서 B 의 우선 순위와 가중치 를 점차 업데이트
  • DNS에서 A를 완전히 제거
  • DNS TTL이 만료 될 때까지 기다립니다. 더 이상 요청을받지 않아야합니다.
  • A를 거절

그리고 당신은 끝났습니다.

세부 사항, 다이어그램 및 툴링

프로세스를 자동화하는 데 도움이되는 다음과 같은 문서와 도구를 참조하십시오. 그러나 일반적인 아이디어는 동일합니다.

도덕

"컴퓨터 과학의 모든 문제는 너무 많은 간접 문제를 제외하고는 다른 수준의 간접 지시로 해결할 수 있습니다." 데이비드 휠러


그러나로드 밸런서가 컨테이너에있는 경우 (CoreOS 사용시)이 컨테이너를 어떻게 업데이트합니까?
das_j

@das_j로드 밸런서를 업데이트하는 방법을 추가하기 위해 답변을 편집했습니다. 힌트 : 그것은 다른 수준의 간접적 인 문제에 관한 것입니다. :-)
Misha Brukman

1
결국 이것은 물리적 서버와 물리적로드 밸런서를 업데이트하는 방법과 같습니다.
Stefan Lasiewski

@StefanLasiewski 당신은 절대적으로 맞고 나는 제목 중 하나에서 "컨테이너"노트를 제거했습니다. 외부 사용자에게는 앱 또는로드 밸런서가 베어 메탈, 컨테이너 또는 VM에서 실행되는지 여부가 크게 보이지 않습니다.
Misha Brukman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.