본 포스팅은 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/
Configure Multiple Schedulers
Kubernetes ships with a default scheduler that is described here. If the default scheduler does not suit your needs you can implement your own scheduler. Moreover, you can even run multiple schedulers simultaneously alongside the default scheduler and inst
kubernetes.io
참고: 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)
[CKA] CKA 자격증 준비 자료 정리 3 (Logging & Monitoring)
본 포스팅은 CKA 자격증 준비를 위해 해당 강의를 보고 정리한 자료입니다. 일부 생략되었으니 꼭 강의를 수강하시고 내용 정리 용도로만 참고하시길 바랍니다. 쿠버네티스에서 리소스 사용량
kdeon.tistory.com
'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 |