1.7.0에서 1.7.2로의 부하 분산기 업그레이드 공지

Kubernetes 버전 1.7.0부터 type LoadBalancer를 사용하여 만드는 새로운 서비스는 기본적으로 노드 상태 확인을 사용하도록 설정됩니다(클러스터의 모든 노드가 v1.7.0 이상을 실행하는 경우).

하지만 Kubernetes 버전 1.7.0과 1.7.1에는 알려진 문제가 있어 노드가 GCP 네트워크 부하 분산기에서 상태 확인에 잘못 응답하게 됩니다. 이 문제가 발생하면 Kubernetes가 구성한 네트워크 부하 분산기는 모든 클러스터 노드에서 상태 확인이 실패했다고 지속적으로 표시하지만 트래픽은 여전히 백엔드로 전달됩니다.

이 문제는 버전 1.7.2에서 수정되었지만 버전 1.7.0 또는 1.7.1에서 1.7.2로 기존 클러스터를 업그레이드할 때 조치가 필요할 수 있습니다. 업그레이드로 부하 불균형이 발생할 수 있습니다. 버전 1.7.2가 실행되는 노드에서 상태 확인이 정상 작동하는 경우, GCP 부하 분산기는 상태 확인이 실패한 버전 1.7.0 또는 1.7.1 노드에서 이러한 노드로 모든 트래픽을 전달합니다. 클러스터의 트래픽 부하를 처리할 '정상' 노드(버전 1.7.2를 실행하는 노드)가 충분하지 않은 경우, 이 불균형은 서비스 중단을 초래할 수 있습니다.

노드를 버전 1.7.2로 업그레이드하기 전에 영향을 받는 부하 분산기에서 수동으로 상태 확인을 제거하면 이 문제를 완화할 수 있습니다.

클러스터가 영향을 받는지 확인하기

클러스터 노드가 Kubernetes 버전 1.7.0 또는 1.7.1을 실행하는 경우에 다음 중 하나라도 수행했으면 클러스터가 영향을 받을 수 있습니다.

  • --type LoadBalancer를 사용하여 새 서비스를 만들었습니다.
  • --type LoadBalancer를 사용하여 기존 서비스를 다른 유형(ClusterIP, ExternalName 등)으로 업데이트한 다음 나중에 LoadBalancer로 되돌렸습니다.
  • 기존 LoadBalancer 서비스의 sessionAffinity 필드를 업데이트했습니다.
  • 기존 LoadBalancer 서비스에서 externalTrafficPolicy 필드를 Cluster로 설정했습니다.

클러스터가 영향을 받았는지 확인하려면 다음 안내를 따르세요.

  1. Google Cloud Console에서 GKE로 이동하여 클러스터를 선택합니다.
  2. 탐색 및 부하 분산 탭을 클릭합니다.
  3. 유형 필드가 LoadBalancer인 서비스를 찾아 서비스 이름을 클릭합니다.
  4. 서비스 세부정보 창에서 LoadBalancer 필드를 찾습니다. 이것은 클러스터에 연결된 GCP LoadBalancer 리소스입니다.
  5. 부하 분산기 이름을 클릭합니다.
  6. 부하 분산 창이 표시됩니다. 연결된 상태 확인을 찾습니다. k8s-XXX-node라는 연결된 상태 확인이 있으면 클러스터가 영향을 받은 것입니다.

클러스터의 모든 부하 분산기 서비스에서 위의 단계를 반복합니다.

다음과 같이 고급 메뉴를 사용하여 해당 Kubernetes 서비스를 확인할 수 있습니다.

  1. 전달 규칙 탭을 클릭합니다.
  2. 부하 분산기 항목을 선택합니다.
  3. 서비스 이름이 설명 필드에 다음 형식으로 표시됩니다. {"kubernetes.io/service-name":"$NAMESPACE/$SERVICE_NAME"}.

업그레이드 위험 완화

잠재적인 부하 불균형 위험을 완화하고 버전 1.7.2로 안전하게 업그레이드하려면 다음 조치를 취합니다.

  1. 업그레이드하기 전에 영향을 받는 클러스터의 모든 부하 분산기에서 수동으로 상태 확인을 제거합니다.
  2. 노드를 버전 1.7.2로 업그레이드합니다.
  3. 업그레이드 후 클러스터의 각 부하 분산기에서 상태 확인을 교체합니다.

업그레이드하기 전에

부하 분산기에서 노드 상태 확인을 제거하려면 다음과 같이 합니다.

  1. Google Cloud Console에서 GKE로 이동하여 클러스터를 선택합니다.
  2. 탐색 및 부하 분산 탭을 클릭합니다.
  3. 영향을 받는 LoadBalancer 서비스를 찾아 서비스 이름을 클릭합니다.
  4. 서비스 세부정보 창에서 LoadBalancer 필드를 찾습니다. 이것은 클러스터에 연결된 GCP LoadBalancer 리소스입니다.
  5. 부하 분산기 이름을 클릭합니다.
  6. 부하 분산 창에서 고급 메뉴 링크를 클릭합니다.
  7. 고급 메뉴에서 대상 풀을 클릭합니다.
  8. 1. 상태 확인 이름 k8s-XXX-node를 확인합니다. 여기서 XXX는 클러스터의 해시 ID입니다. 나중에 상태 확인을 복원하려면 이 정보가 필요합니다.
  9. 부하 분산기의 해당 대상 풀을 '상태 확인 없음'으로 편집합니다. 이는 서비스에서 다운타임을 초래하지 않는 인플레이스 업데이트입니다.

영향을 받는 클러스터의 각 부하 분산기에 위의 단계를 반복합니다.

상태 확인을 제거한 후에는 노드 트래픽 불균형 없이 안전하게 노드를 버전 1.7.2로 업그레이드할 수 있습니다. GCP 부하 분산기는 상태와 무관하게 상태 확인 없이 노드에 계속 트래픽을 전달합니다. 이 동작은 Kubernetes 버전 1.6.x 이하를 실행하는 클러스터의 동작과 동일합니다.

업그레이드 후

업그레이드한 후 클러스터의 부하 분산기에서 다음과 같이 노드 상태 확인을 교체할 수 있습니다.

  1. Google Cloud Console에서 클러스터로 이동합니다.
  2. 탐색 및 부하 분산 탭을 클릭합니다.
  3. 영향을 받는 LoadBalancer 서비스를 찾아 서비스 이름을 클릭합니다.
  4. 서비스 세부정보 창에서 LoadBalancer 필드를 찾습니다. 이는 클러스터에 연결된 GCP LoadBalancer 리소스입니다.
  5. 부하 분산기 이름을 클릭합니다.
  6. 부하 분산 창에서 고급 메뉴 링크를 클릭합니다.
  7. 고급 메뉴에서 대상 풀을 클릭합니다.
  8. 부하 분산기의 해당 대상 풀을 업그레이드 전에 상태 확인을 제거할 때 앞서 기록한 것과 동일한 k8s-XXX-node 형식의 값으로 수정합니다. 이는 서비스에서 다운타임을 초래하지 않는 인플레이스 업데이트입니다.

영향을 받는 클러스터의 각 부하 분산기에 위의 단계를 반복합니다.