-
Notifications
You must be signed in to change notification settings - Fork 0
/
note-2023-02-10-kubernetes.qmd
177 lines (124 loc) · 5.7 KB
/
note-2023-02-10-kubernetes.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
파드란?
- 최소 워크로드 단위
- 하나 또는 여러 컨테이너를 배포하는 기본 단위
- 네트워크 기본 할당 단위
- 저장공간 연결 최소 단위
쿠버네티스 리소스의 기본 단위는 파드이다.
다른 노드 상의 파드와 자원을 공유하기 위해선 문제가 발생하는데,
하나의 파드는 하나의 노드에서 실행이 된다.
파드 안에 여러 컨테이너가 있을 수 있는데, 이 컨테이너들도 해당 파드가 속한 노드에서 실행된다.
네임스페이스란?
논리적으로 클러스터를 파티셔닝하여 오브젝트들을 논리적으로 분리시키는 오브젝트이다.
오브젝트 용도에 따라 별도로 관리하기 위해 사용한다.
* 네임스페이스 종류
+ default
+ kube-node-lease
+ kube-public
+ kube-system
: 쿠버네티스 클러스터 동작을 위해 핵심적으로 필요한 오브젝트들을 모아놓은 네임스페이스
kubectl get pods -L release -l 'release=testing'
kubectl get pods -L release -l 'release!=testing
kubectl get pods --show-labels -l '!tier'
kubectl get pods --show-labels -l env=debug
kubectl get pods --show-labels -l 'env!=debug'
kubectl get pods -L release -l 'release in (stable)'
kubectl get pods
kubectl annotate pods myapp-pod devops-team/developer="Sungmin Woo"
kubectl describe pod myapp-pod
kubectl get pods myapp-pod -o yaml
kubectl get namespaces
kubectl get pods -n kube-system
kubectl get all -n kube-system
kubectl describe namespaces
kubectl create namespace development
kubectl get namespaces
apiVersion: v1
kind: Namespace
metadata:
name: example-namespace
kubectl apply -f exmaple-pod.yaml -n example-namespace
kubectl get pods -n example-namespace
kubectl delete pods POD
kubectl delete -f POD.yaml
kubectl delete pods -l LABEL_KEY=VALUE
kubectl get pods -A : 모든 네임스페이스의 파드 조회
kubectl get svc -A : 모든 ns 안의 서비스 조회
kubectl get all = kubectl get all -n default : 해당 ns 안의 모든 오브젝트 조회
kubectl get all -n kube-system
---
kubernetes.io/ 레이블 접두어 : 쿠버네티스에서 관리가 되는 오브젝트들에 붙는 레이블
---
#### 파드의 라이프 사이클
Pending -> Running -> Succeeded -> Failed
* 라이프 사이클
+ Pending
+ 파드, 클러스터에서 승인 but 실행 X / 스케줄링 되기 전
+ 이미지 풀링
+ 파드 생성 요청 -> kube-scheduler가 Node에 Pod를 할당(assign, schedule)
-> 해당 노드 kubelet에서 생성할 오브젝트 주기적으로 체크 -> 정보 확인 후 오브젝트 생성
+ Running
+ 파드가 노드에 할당됨
+ 파드 내 하나 이상의 컨테이너가 실행 중
+ 시작 또는 재시작 중
+ Succeeded
+ 모든 컨테이너가 정상(zero) 종료
+ 재시작되지 않음
+ Failed
+ 모든 컨테이너가 종료
+ 하나 이상의 컨테이너가 실패(non-zero) 종료
+ Unkown
+ 알 수 없음
+ 일반적으로 노드와의 통신 오류
* 파드
+ 임시 워크로드 리소스(일회용)
+ 생성 시 UID 할당
+ 종료시까지 스케줄링되 노드에서만 실행
+ 프로세스가 실행되고 난후 결과를 부모 프로세스에게 exit 코드를 반환되는데,
return 0; -> 정상 종료 / 다른 값이 반환되면 비정상 종료
+ 기본적으로 컨테이너의 애플리케이션의 exit 코드 반환값으로 정상/비정상 종료 판단한다.
(다른 방법으로 판단할 수도 있다.)
* kubelet이 하는 일
+ 파드 및 파드 내 컨테이너 상태 추적, 오류 발생 시 컨테이너 재시작
(파드 전체 재시작 or 컨테이너 재시작?)
+ 컨테이너 런타임을 이용하여 컨테이너 생성
+ 컨테이너의 상태를 주기적으로 체크
파드 삭제(gracefully) <-> --force
kube-node-lease namespace : cluster가 node의 가용성을 Node Heartbeat를 통해 관리
kubelet : Worker Node가 컨테이너 정상 작동 여부 확인 및 관리(장애 조치)
(그렇다면 Node -> Pod , Pod -> Container 관리 오브젝트는?)
Pod : Pending -> Running -> Succeeded -> Failed
Container : Waiting -> Running -> Terminated
(Node, Controller, Service의 상태, 라이프사이클은?)
파드의 상태 확인
kubectl get pods
kubectl describe pod POD
kubectl get pod example-pod -o jsonpath='{.status.phase}'
kubectl get pod example-pod -o json | jq ".status.phase"
kubectl get pod example-pod -o jsonpath='{.status.containerStatuses[*].state}'
kubectl get pod example-pod -o json | jq ".status.containerStatuses[].state"
Pod의 상태를 나타내는 필드 .status.phase
---
파드는 자신의 상태 및 내부 컨테이너의 상태, 두 가지의 상태를 가진다.
파드의 상태는 어떻게 볼 수 있을까? 개별 컨테이너 안의 state 필드에서 볼 수 있다.
kubectl get pods example-pod -o jsonpath='{}'
* 컨테이너 상태(실행 중/기다리는 중/종료된 상태)
+ Waiting
+ 컨테이너가 Runtime 또는 Terminated 상태가 아닌 상태
+ 컨테이너 시작 전 필요한 작업 중(이미지 풀링, 스토리지 연결 등)
+ Reaon 필드에 이유가 표시됨
+ Running
+
+ Terminated
+ 컨테이너 종료되면 Terminated = 컨테이너 실행 완료 또는 실패
+ Reason 필드에 이유가 표시됨
+ 해당 상태가 된 시각 표시
---
jq 놀이터
k get pods example-pod -o json | jq ".kind"
k get pods exmaple-pod -o json | jq ".metadata"
k get pods example-pod -o json | jq ".status.containerStatuses"
---
jsonpath 놀이터
k get pods example-pod -o jsonpath='{.status.phase}'
k get pods example-pod -o jsonpath='{.status.container}'
k get pods example-pod -o jsonpath='{.status.containerStatuses}'