노드 셀렉터(nodeSelector)는 파드를 특정 노드에 배치하기 위해 파드 스케줄러를 제어하는 가장 쉬운 방법
노드 셀렉터는 노드에 레이블을 지정하고, 컨트롤러 및 파드 선언시 .spec.nodeSelector 필드로 레이블을 이용해 노드를 선택할 수 있음
노드네임 또는 노드 셀렉터는 특정 파드를 배치할 때 특정 노드를 정확히 지칭하지만 어피니티는 선호하는 노드의 엄격함을 지정할 수 있음
특정 노드에 배치되는 것을 선호하지만 반드시 따라야 하는 룰은 아닐 수도 있다는 의미
어피니티는 또한 파드 간에도 선호도와 비-선호도를 지정해 같은 노드에 배치될 것이냐, 다른 노드에 배치될 것이냐를 지정할 수 있음
즉, 자주 통신하는 파드 사이에는 같은 노드에 배치되게 하고, 리소스를 많이 사용하는 파드들은 같은 노드에 배치되지 않도록 하는 방법
노드 어피니티는 노드 셀럭터와 비슷하게 파드를 특정 노드에 배치할 수 있음
그러나 노드 셀렉터는 반드시 해당 레이블이 있는 노드에만 배치되지만, 노드 어피니티는 파드의 배치를 특정 노드에 강제하지 않을 수도 있음.
#vim myapp-rs-nodeaff.yml
#kubectl explain rs.spec.template.spec.affinity.nodeAffinity
명령어로
requiredDuringSchedulingIgnoredDuringExecution(반드시 충족해야하는 조건),
preferredDuringSchedulingIgnoredDuringExecution(선호하는 조건)
복사.

#kubectl label nodes kube-node1 gpu-model='3080'
#kubectl label nodes kube-node2 gpu-model='2080'
#kubectl label nodes kube-node3 gpu-model='1660'
해당하는 레이블 노드에 파드 생성.
requiredDuringSchedulingIgnoredDuringExecution 제거한 yml파일 생성.
#vim myapp-rs-nodeaff-pre.yml

#kubectl label nodes kube-node3 gpu-model=titan --overwrite
node3에 생성되는 것을 확인.

파드 어피니티 및 안티 어피니티는 파드 간에 같은 노드에 배치할 것인지, 다른 노드에 배치할 것인지 선호도를 지정할 수 있음
대부분 노드 어피니티와 같은 구조를 가지고 있으나 몇 가지 추가적인 필드가 있음
preferredDuringSchedulingIgnoredDuringExecution 필드도 설정이 가능하나 일반적으로 어피니티 및 안티 어피니티에서는 requiredDuringSchedulingIgnoredDuringExecution 필드를 사용하는 것이 일반적임
토폴로지 키는 파드의 고가용성 및 효율적인 리소스 관리를 위해 파드를 분산하기 위한 도메인과 같은 영역으로 토폴로지 키는 지역, 영역, 노드 등을 구별할 수 있는 노드의 레이블 키
"kubernetes.io/hostname"
노드 레이블 확인.
#kubectl get nodes --show-labels
파드어피니티
#vim myapp-rs-cache
레이블이 tier:cache인 파드와 같은 노드에 배치.

파드안티어피니티
#vim myapp-rs-front
레이블이 tier:front인 파드와 다른 노드에 배치.

테인트(Taint)는 쿠버네티스 클러스터의 특정 노드에 더 이상 추가적인 파드가 배치되지 않도록 파드를 스케줄링하지 않음.
톨러레이션(Toleration)을 사용하면 테인트가 설정된 노드에 파드를 스케줄링할 수 있도록 구성할 수 있음.
테인트의 효과(Effect)
NoSchedule: 톨러레이션에 해당 레이블이 없는 파드는 스케줄링할 수 없음(기존 파드에 적용되지 않음)
PreferNoSchedule: 톨러레이션에 해당 레이블이 없는 파드는 스케줄링할 수 없으나, 리소스가 부족하면 배치될 수 있음 (기존 파드에 적용되지 않음)
NoExecute: 톨러레이션에 해당 레이블이 없는 파드는 스케줄링할 수 없고, 기존 파드도 설정을 무시할 수 없다.
즉, "Key[=Value]:Effect"의 의미는 톨러레이션에 의해 허용될 레이블이며, 해당 레이블이 없으면 효과에 의해 스케줄링하지 않는다는 의미다.

마스터 노드에는 "node-role.kubernetes.io/master" 레이블의 키가 없으면 파드를 스케줄링 하지 않는다는 테인트가 설정되어 있으며, 나머지 노드에는 테인트가 없다.
테인트 설정.
kube-node3예시
#kubectl taint nodes kube-node3 env=production:NoSchedule

#vim myapp-rs-tol.yml

테인트 삭제
#kubectl taint node kube-node3 env-
테인트 제거 확인.
#kubectl describe nodes | grep Taints
커든(Cordon)은 특정 노드에 새로운 파드가 스케줄링 되지 않도록 하는 기능
테인트와 비슷하지만, 테인트는 특정 노드를 특정 역할로 사용하기 위해 톨러레이션과 함께 사용하지만, 커든은 새로운 파드가 스케줄링 되지 않도록 하고 예외는 없음. 그러나 현재 배치되어 동작 중인 파드에는 영항을 미치지 않음.

#vim myapp-ds-cordon.yml

드레인 명령어

취소
#kubectl uncordon kube-node3
#curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
#sudo apt-get install apt-transport-https -y
#echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
#sudo apt-get update
#sudo apt-get install helm -y
#helm version
#sudo helm completion bash | sudo tee /etc/bash_completion.d/helm
#exec bash
차트(Chart): Helm 패키지
저장소(Repository): Helm 차트가 저장된 저장소
릴리즈(Release): 차트가 클러스터에 배포된 인스턴스 단위
빛나미 저장소 추가.

mydb라는 릴리즈 이름으로 bitnami 저장소의 mysql 차트를 설치.
#helm install mydb bitnami/mysql
파드가 Pending상태임. --> 동적프로비저닝할 pv의 스토리지를 설정하지 않았기 때문에.

mysql차트 삭제.
#helm uninstall mydb
동적프로비저닝 실행.
#kubectl apply -f kube-test/nfs-subdir-external-provisioner/deploy/class.yaml -f kube-test/nfs-subdir-external-provisioner/deploy/deployment.yaml

정상실행 확인.
