본 포스팅은 CKA 자격증 준비를 위해 해당 강의를 보고 정리한 자료입니다.
일부 생략되었으니 꼭 강의를 수강하시고 내용 정리 용도로만 참고하시길 바랍니다.
Manual Scheduling
원하는 NODE 지정하여 스케쥴링
https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeName: kube-01
- nodeName 속성 추가
- 생성 후 assign 은 불가 ⇒ 필요시 Binding object를 생성해(kind: Binding) api post 로 요청해야함
Label & Selectors
1. object 를 group화하고, 선택할 때 사용
- label 지정
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: App1
function: Front-end
- 선택
$ kubectl get pods --selector app=App1
2. 서로 다른 object를 연결할 때 사용
apiVersion: apps/v1
kind: ReplicaSet
metadata: # replicaset 자체의 labels
name: simple-webapp
labels:
app: App1
function: Front-end
spec:
replicas: 3
selector:
matchLabels: # replicaset 이 pod을 찾기위한 labels
app: App1
template:
metadata:
labels: # pod에 대한 labels
app: App1
function: Front-end
spec: ...
- 서비스가 pod을 찾는 방식도 마찬가지
Annotations
정보를 제공하기 위한 목적으로, 세부 사항 기록
apiVersion: apps/v1
kind: ReplicaSet
metadata: # replicaset 자체의 labels
name: simple-webapp
labels:
app: App1
function: Front-end
annotations:
buildversion: 1.34
- 이름, 버전, 빌드 정보, contact 정보, email, integration목적으로 사용되는 것들 등등 ..
Taints and Tolerations
https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
어떤 pod이 어떤 node에 할당될 것인지 scheduling에 대한 규제를 설정할 수 있음
taint 가 설정된 pod에 할당되려면 pod에 toleration이 설정되어야함
- taint : 더럽히다, tolerate: 참다 ⇒ 더럽혀진 node에 가려면 참을 수 있어야한다는 의미
- taint와 toleration 이 설정되었다고해서 무조건 맞게 할당되는 걸 보장하지는 않음
Taints
Taint 설정
$ kubectl taint nodes node-name key=value:taint-effect
- taint-effect : 이 taint를 tolerate하지 않는 pod에서 무슨 effect를 줄 것 인가
- NoSchedule: 해당 taint에 toleration이 없으면 스케쥴되지 않음
- PreferNoSchedule: 스케쥴되지 않도록 노력하겠지만 보장되지 않음
- NoExecute: toleration이 없으면 스케쥴되지 않으며, 이미 존재하는 pod도 evict됨
ex. master node에 pod이 할당되지 않도록 하기위한 taint
- node-role.kubernetes.io/maste:NoSchedule
Taint 제거
$ kubectl taint node controlplane node-role.kubernetes.io/master:NoSchedule-
Tolerations
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:alpine
tolerations:
- key: "app"
operator: "Equal"
value: "blue"
effect: "NoSchedule"
Node Selector
pod을 특정 node에 할당하기 위함
- node에 label을 먼저 붙여야함
- label이 large or medium 인 노드에 할당해라 ⇒ 이런 디테일한 operation 불가
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: data-processor
image: data-processor
nodeSelector:
size: Large # node label과 매치
노드에 label 할당
- kubectl label nodes node01 size=Large
Node Affinity
https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/
노드 할당에 있어 구체적인 연산 가능
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: data-processor
image: data-processor
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values: # Meduim 또는 Large 노드에 할당
- Large
- Medium
- matchExpressions:
- key: size
operator: NotIn
values: # Small이 아닌 노드에 할당
- Small
- matchExpressions:
- key: size
operator: Exists # value에 상관없이 size라는 label이 존재하면 할당
node affinity를 만족하는 노드가 없다면
- requiredDuringSchedulingIgnoredDuringExecution: 매칭 안되면 스케쥴하지 않음
- preferredDuringSchedulingIgnoredDuringExecution: 매칭 안되면 그냥 가능한 노드에 할당
- IgnoredDuringExecution 의미는 이미 pod이 실행중인데 node의 label이 수정된다거나 해도, 기존 pod에 영향은 없음
- RequiredDuringExecution 의 경우 실행중인 pod들이 evict됨
Resource Requirements & Limits
container에 대해 resource 요청/최대 제한을 지정할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: webapp
image: webapp-color
resources:
requests:
memory: "1Gi"
cpu: 1
limits:
memory: "2Gi"
cpu: 2
LimitRange
namespace 에 대해 default로 limitRange를 걸 수 있다.
https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
- LimitRange object를 생성하고, namespace에 대해 적용해 준다.
$ kubectl apply -f ./limit_range.yaml --namespace=default
DaemonSets
daemonset은 모든 노드에 pod이 하나씩 돌도록 보장한다. 모든 노드에서 돌아야하는 cluster storage, log collector, node monitoring 같은 용도로 사용된다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-daemon
spec:
selector:
matchLabels:
app: monitoring-agent
template:
metadata:
labels:
app: monitoring-agent
spec:
containers:
- name: monitoring-agent
image: monitoring-agent
- 정의 자체는 replicaset, deployment와 유사하다.
Static Pods
kubelet daemon에 의해 직접 관리되는 pod으로, kubelet이 staticPodPath를 체크하여 생성/삭제된다.
static pod 정의 위치 찾는 법
1. kubelet config path 확인 후 해당 path에서 staticPodPath 확인
$ ps -ef | grep kubelet
- --config 옵션을 통해 kubelet config path확인
2. config file 내에서 manifest file 경로 확인
$ grep -i static /var/lib/kubelet/config.yaml
- staticPodPath: /etc/kubernetes/manifests
Multiple Scheduler
https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/
참고: Edit Resources
Edit a Pod
kubectl edit 으로 수정할 수 있는 pod 정보
- spec.containers[*].image
- spec.initContainers[*].image
- spec.activeDeadlineSeconds
- spec.tolerations
이 외의 정보를 수정하고 싶을 경우, 현재 pod의 정보를 yaml 파일로 뽑아서 (kubectl get pod pod-name -o yaml > temp.yaml) 해당 yaml 파일을 수정하고, 다시 kubectl create/apply로 생성
Edit Deployments
deployment는 edit 으로 수정하는 것이 자유롭다.
$ kubectl edit deployment deployment-name
[DevOps/Kubernetes] - [CKA] CKA 자격증 준비 자료 정리 3 (Logging & Monitoring)
'DevOps > Kubernetes' 카테고리의 다른 글
[CKA] CKA 자격증 준비 자료 정리 4 (Application Lifecycle Management) (0) | 2021.12.11 |
---|---|
[CKA] CKA 자격증 준비 자료 정리 3 (Logging & Monitoring) (0) | 2021.12.07 |
[CKA] CKA 자격증 준비 자료 정리 1 (Core Concepts) (2) | 2021.11.15 |
[kubernetes] 쿠버네티스의 로깅 아키텍쳐와 python client를 통한 로그 수집 (0) | 2021.04.12 |
[kubernetes] 쿠버네티스 watch API 사용하기 (python) (0) | 2021.04.05 |