본문 바로가기
GOORM

GOORM: Kubernetes-43

by hxunz 2022. 1. 5.
  1. Facts 
    : 배운것 - 어피니티와 안티 어피니티 / 테인트와 톨러레이션 / 커든과 드레인 

  2. Findings
    :
    노드 어피니티
     - 노드셀렉터와 비슷하게 노드의 레이블 기반으로 파드를 스케줄링
     - 노드셀렉터와 함께 설정할 수도 있으며 이때는 노드 어피니티와 노드셀렉터의 조건을 모두 만족하는 노드에 파드를 스케줄링
    requireDuringSchedulingIgnoredDuringExecution 스케줄링하는 동안 꼭 필요한 것
    preferredDuringSchedulingIgnoredDuringExecution 스케줄링하는 동안 만족하면 좋은 조건

    파드의 어피니티와 안티 어피니티
     - 디플로이먼트나 스테이트풀세트로 파드를 배포했을 때 개별 파드 사이의 관계를 정의하는 용도로 사용
     - 실제 서비스 운용시 요긴
     - 데이터베이스타 캐시 같은 서비스와 통신하는 앱 컨테이너를 같은 노드에 두어 네트워크 통신 비용 삭감
     - 안티 어피니티 : CPU나 네트워크 같은 ㅏ드웨어 자원을 많이 사용하는 앱 컨테이너가 있을 떄 여러 노드로 파드 분산

    테인트와 톨러레이션
     - 테인트를 설정한 노드에는 파드들을 스케줄링하지 않는다
     - 테인트를 설정한 노드에 파드들을 스케줄링하려면 톨러레이션을 설정
     - 주로 노드를 특정 역할만 하도록 만들 때 사용
     - 테인트는 키, 값, 효과의 세가지로 구성

    커든
     - kubectl cordon 명령 : 지정된 노드에 추가로 파드를 스케줄링해서 실행하지 않도록 한다.
     - kubectl uncordon 노드이름 명령 : 노드에 정상적으로 파드를 스케줄링

    드레인
     - kubectl drain : 노드 관리 등의 이유로 지정된 노드에 있는 파드들을 다른 노드로 이동시키는 명령
     - 노드에 데몬세트로 실행한 파드들이 있으면 드레인 설정을 적용할 수 없다
     - 컨트롤러를 이용하지 않고 실행한 파드들도 드렝니 설정을 적용할 수 없다
     - kubelet이 직접 실행한 스태틱 파드들은 kube-apiserver 컴포넌트를 이용해서 실행하지 않았으므로 삭제 되지 않는다.

 

<수업 메모>

컨피그맵
- 파드에 추가적인 값(파일) 전달
- 사용환경 / 목적 에 따라 달라질 수 있는 값을 전달 ( ex.환경변수 )
- 동일한 이미지를 사용할 수 있게 해줌
- kubectl create configmap 	--from-literal=KEY=VALUE
			--from-file=DIR	-> 디렉토리 지정도 가능 / 파일도 가능
	=> 명령어 사용 시 재사용이 힘들다.

- 템플릿 작성
	컨피그맵 / 디플로이먼트 각각에 설정
	컨피그맵 : data 라는 필드에 키:값 형태로 사용할 데이터 입력
	디플로이먼트 : 컨피그맵을 사용하는 방법 ( env 로 환경변수로 설정하거나 volume 으로 설정 )


시크릿
- 컨피그맵과 사용 방식 비슷
- 데이터가 인코딩된 방식으로 저장
- 비밀번호 / 숨기고 싶은 데이터들을 설정
- 인증서 / 개인키 / 사설 레지스트리 인증 정보 등

파드 스케줄링

1. 노드 셀렉터
- 파드를 실행할 때에 원하는 노드를 선택하기 위한 하나의 방법
- 각 노드에 레이블(Label) 설정
- 각 파드에서 노드 셀렉터(NodeSelector) 지정
- 알맞은 노드가 없을 경우 파드는 Pending 상태	-> 알맞은 노드가 생기면 Running


2. 어피니티 / 안티 어피니티
1) 노드 어피니티 : 파드를 실행할 노드를 선택하는 방식
	- required... : 필수적으로 만족해야 하는 조건 ( 노드 셀렉터와 동일 )
	- preferred... : 우선적으로 선택하는 조건 ( 만족하지 않아도 생성 될 수는 있음 )
		weight 는 1~100 설정

matchExpressions 에서 노드에 설정한 레이블과 비교 연산자를 사용
- In : 여러 항목 중에 하나라도 일치하면 선택
- NotIn : 모든 항목과 일치하지 않는 대상을 선택
- Exists : 키만 존재하면 그 값은 상관 없이 선택
- DoesNotExist : 키가 존재하지 않을 경우 선택
- Gt : 더 큰 값을 선택
- Lt : 더 작은 값을 선택


2) 파드 어피니티 : 같은 노드에서 실행하도록 파드들을 그룹화
3) 파드 안티 어피니티 : 파드들을 분산시키는 방식

규칙 설정 방식
파드를 실행할 때,
파드의 레이블을 확인 (기존의 파드 + 현재 새로운 파드)
requiredDuringSchedulingIgnoredDuringExecution 항목에서 지정한 조건과 비교
일치하는 경우 서로 분산	-> 토폴로지 키 기준으로 배치 (hostname 을 일반적으로 사용)

토폴로지 키 : 노드에 설정해둔 레이블을 지정

3. 테인트 : 노드에 설정해서 파드를 배치하지 않는 방식
4. 톨러레이션 : 테인트 설정을 무시하고 배치하는 방식

규칙
각 노드 별로 테인트(키=값:효과) 를 설정
파드를 실행할 때에 노드들의 테인트를 확인
	1) 파드 설정에 톨러레이션 값이 있으면 일치하는 테인트를 찾아서 해당 노드에서 실행
	2) 일치하는 테인트가 없으면, 테인트가 아에 없는 노드를 선택
	3) 일치하는 테인트도 없고 비어있는 곳도 없으면 Pending
효과에 따라
NoSchedule 방식은 실행할 때에만 테인트를 확인해서 강력하게 설정
PreferNoSchedule 방식은 실행할 때에만 선택하는데, 만족하는 대상이 없으면 무시
NoExecute 방식은 실행할 때 + 실행 후에도 테인트가 변화가 발생하면 바로 이동/제거


5. 커든 : 명령어를 통해서 특정 노드에 배치가 불가능하게 비활성화 설정
	테인트와 유사하지만 예외가 없음

6. 드레인 : 기본적으로 디플로이먼트 등의 컨트롤러로 실행 중인 파드들을 종료하고 다른 노드에서 재시작
	 데몬셋 / 단독 파드 / 스토리지 연결 경우에는 예외처리 필요


실습 (노드 2개 기준)
1. 노드1 에 ram=4 , 노드2에 ram=8 로 레이블 설정. 
   디플로이먼트로 파드를 실행할 때 노드 1에서 동작하도록 템플릿 작성
2. 노드1 에 disktype=ssd 로 레이블 설정.
   디플로이먼트로 파드를 실행할 때 가급적이면 노드1에서 실행하도록 설정 (노드어피니티 사용)
3. 위 2 문제에서 만든 파드와 같은 노드에서 동작하는 파드를 생성 (파드 어피니티)
4. 1,2번에서 만든 파드들과 다른 노드에서 실행하는 파드 생성 (파드 안티 어피니티)
5. 앞으로 만드는 파드가 모두 2번 노드에 생성하도록 1번 노드에 테인트 설정하기.
6. 디플로이먼트로 파드를 실행할 때 1번 노드에서 동작하도록 톨러레이션 설정

'GOORM' 카테고리의 다른 글

GOORM: Kubernetes-45  (0) 2022.01.07
GOORM: Kubernetes-44  (0) 2022.01.07
GOORM: Kubernetes-42  (0) 2022.01.05
GOORM: Kubernetes-41  (0) 2022.01.05
GOORM: Kubernetes-40  (0) 2022.01.04

댓글