
해당 포스팅은 "쿠버네티스 인 액션"을 공부하고 정리한 글입니다. 모든 내용은 해당 도서를 기준으로 합니다.
⬛ 9장 - 디플로이먼트: 선언적 애플리케이션 업데이트
◼️ 9.1 파드에서 실행 중인 애플리케이션 업데이트
쿠버네티스에서 실행되는 기본 애플리케이션은 다음 그림과 같음.

모든 파드를 새 버전으로 바꾸려고 할 때 파드를 업데이트 하는 방법에는 두가지가 있음.
- 기존 파드를 모두 삭제한 다음 새 파드를 시작.
- 새로운 파드를 시작하고 기동하면 기존 파드를 삭제. 새 파드를 모두 추가 한 다음 한꺼번에 기존 파드 삭제하거나 순차적으로 새 파드를 추가하고 기존 파드를 점진적으로 제거 해 작업 수행.
첫번째는 짧은 시간 동안 애플리케이션을 사용할 수 없음.
두번째는 애플리케이션이 동시에 두 가지 버전을 실행해야 함.
◾ 9.1.1 오래된 파드를 삭제하고 새 파드로 교체
레플리케이션컨트롤러는 새 인스턴스를 생성할 때 업에이트 된 파드 템플릿을 사용.

이전 파드가 삭제 되고 새 파드가 시작되는 동안 짧은 시간의 다운 타임을 허용할 수 있다면 이는 파드 세트를 업데이트 하는 가장 간단한 방법임.
◾ 9.1.2 새 파드 기동과 이전 파드 삭제
동시에 두 배의 파드가 실행되므로 더 많은 하드웨어 리소스가 필요함.
새 버전을 실행하는 파드를 불러오는 동안 서비스는 파드의 이전 버전에 연결 됨. 그 다음 새 파드 모두 실행되는 서비스 레이블 셀렉터를 변경하고 서비스를 새 파드로 전환할 수 있음.
이를 블루-그린 디플로이먼트라고 함.

롤링 업데이트 수행
파드를 단게별로 교체하는 롤링 업데이트를 수행할 수 있음.
레플리케이션컨트롤러를 천천히 스케일 다운하고 새 파드를 스케일 업해 이를 수행.
이 경우 서비스의 파드 셀럭터에 이전 파드와 새 파드를 모두 포함하게 해 요청을 두 파드 세트로 보낼 수 있음.

◼️ 9.2 레플리케이션컨트롤러로 자동 롤링 업데이트 수행
◾ 9.2.2 kubectl을 이용한 롤링 업데이트

롤링 업데이트가 시작되기 전 kubectl이 수행한 단계 이해하기
kubectl은 레플리케이션컨트롤러를 복사하고 해당 파드 템플릿에서 이미지를 변경 해 새 레플리케이션컨트롤러를 만듦.
이전 레플리케이션컨트롤러가 동일한 파드 세트에서 작동하지 않도록 해야 함.
롤링 업에이트 프로세스는 첫번째 레플리케이션컨트롤러의 셀렉터도 수정함.
kubectl이 레플리케이션 컨트롤러의 셀렉터를 변경하기 전에 실행 중인 파드의 레이블을 먼저 수정하기 때문.

kubectl은 스케일업 또는 스케일 다운을 시작하기 전에 이 모든 작업을 수행해야 함.
레플리케이션 컨트롤러 두 개를 스케일업 해 새 파드로 교체
kubectl은 먼저 새 컨트롤러를 스케일 업 해 파드를 하나씩 교체함.
컨트롤러는 첫번째 파드를 만들고 kubectl은 이전 레플리케이션컨트롤러를 하나씩 스케일 다운함.
서비스를 해당 레이블이 있는 모든 파드를 대상으로 하기 때문에 루프를 몇번 반복할 때 마다 curl 요청이 새로운 파드로 전달됨.

kubectl이 롤링 업데이트를 계속 하면 파드에 대한 요청 비율이 점점 더 높아지기 시작.
업데이트 프로세스가 이전 파드를 더 삭제하고 새 이미지를 실행하는 파드로 교체되기 때문.
◾ 9.2.3 kubectl roling-update를 더 이상 사용하지 않는 이유
롤링 업데이트의 모든 단계를 수행하는 것이 kubectl 클라이언트.
kubectl 클라이언트가 쿠버네티스 마스터 대신 스케일링을 수행하는 중임을 보여줌.
이는 네트워크가 끊어지면 업데이트 프로세스가 중간에 중단될 것으로 파드와 레플리케이션컨트롤러는 중간 상태에서 끝이 남.

때문에 쿠버네티스에 파드를 추가하거나 초과된 파드를 제거하라고 지시하면 안됨. 단지 원하는 레플리카 수를 변경하면 됨.
파드 스펙에서 원하는 이미지 태그를 변경하고 쿠버네티스가 파드를 새 이미지로 실행하는 새로운 파드로 교체할 것.
이것이 현재 쿠버네티스에서 애플리케이션을 배포하는 가장 좋은 방법인 디플로이먼트라는 새로운 리소스를 도입하게 된 원동력임.
◼️ 9.3 애플리케이션을 선언적으로 업데이트하기 위한 이플로이먼트 사용하기
디플로이먼트
- 애플리케이션을 배포하고 선언적으로 업데이트하기 위한 높은 수준의 리소스.
- 이를 생성하면 레플리카셋 리소스가 그 아래 생성됨.
- 이를 사용하면 디플로이먼트의 레플리카셋에 의해 파드가 생성되고 관리됨.

애플리케이션을 업데이트 할 때는 추가 레플리케잇녀컨트롤러를 도입하고 두 컨트롤러가 잘 조화되도록 조정해야 함.
전체적으로 통제하는 것이 필요하며 이를 디플로이먼트 리소스가 관리함.
디츺로이먼트를 사용하면 하나의 디플로이먼트 리소스를 통해 원하는 상태를 정의하면 쿠버네티스가 나머지를 처리할 수 있으므로 애플리케이션 업데이트를 훨씬 쉽게 할 수 있음.
◾ 9.3.2 디플로이먼트 업데이트
디플로이먼트 리소스에 정의된 파드 템플릿을 수정하기만 하면 쿠버네티스가 실제 시스템 상태를 리소스에 정의된 상태로 만드는데 필요한 모든 단계를 수행함.
디플로이먼트 파드 템플릿에서 새 이미지 태그를 참조해 시스템이 의도하는 상태가 될 수 있도록 쿠버네티스에 맡기면 됨.
사용 가능한 디플로이먼트 전략
RolingUpdate 전략은 이전 파드를 하나씩 제거하고 동시에 새 파드를 추가해 전체 프로세스에서 애플리케이션을 계속 사용할 수 있도록 하고 서비스 다운 타임이 없도록 함.

특정 디플로이먼트 개정으로 롤백

롤아웃 일시 정지
카나리 릴리스
- 잘못된 버전의 애플리케이션이 롤아웃돼 모든 사용자에게 영향을 주는 위험을 최소하는 기술.
새 파드가 가동되면 서비스에 관한 모든 요청의 일부가 새 파드로 전달되고 이렇게 되면 카나리 릴리스를 효과적으로 실행할 수 있음.
롤아웃 대신 하나 또는 적은 수의 이전 파드만 새 버전으로 바꿔 소수의 사용자만 초기에 새 버전을 사용 하게 됨.
레디니스 프로브가 잘못된 버전으로 롤아웃되는 것을 방지하는 법
새 파드가 시작되자마자 레디니스 프로브가 매초마다 시작됨.

새 파드를 사용할 수 없으므로 롤아웃 프로세스가 계속되지 않음.
사용 가능한 것으로 간주되려면 10초 이상 준비 돼 있어야 함.
롤아웃이 10분동안 진행되지 않으면 실패한 것으로 간주됨
