20210825 (수) kubernetes application 관리
9:34 review
Kubernetes 오브젝트 관리
- 명령형 커맨드
kubectl 명령어에 인수나 옵션을 사용하여 애플리케이션을 제어
별도의 Manifest 파일을 사용하지 않음
간단한 테스트 목적으로 실행하고자 할 때 주로 사용하는 오브젝트를 관리하는 단순한 방법
→ kubectl run busybox --image busybox
- 명령형 오브젝트 구성
오브젝트를 별도로 yaml이나 json형식으로 정의
kubectl 명령어에 Manifest 파일을 인수로 지정하여 오브젝트를 관리함
관리하고자하는 오브젝트에 대한 완전한 정의를 포함해야함
→ kubectl create -f MANIFESTFILE.yaml(json…)
→ kubectl delete -f MANIFESTFILE.yaml(json…)
- 선언형 오브젝트 구성
특정 디렉터리에 모든 오브젝트에 대한 정의 파일을 배치함 (다수의 manifestfile)
kubectl 명령어에 특정 디렉터리를 인수로 지정하여 오브젝트를 관리함
관리하고자 하는 모든 오브젝트에 대한 완전한 정의를 포함해야함
→ kubectl create -R -f apps/
##### Kubernetes Cluster에 metallb 설치, 컨픽 ##### metallb namespace 구성 kubectl create -f https://raw.githubusercontent.com/metallb/v0.10.2/manifests/namespace.yaml kubectl create -f https://raw.githubusercontent.com/metallb/v0.10.2/manifests/metallb.yaml vim metallb-config.yaml apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 192.168.200.200-192.168.200.210 ##### Kubernetes Cluster에 metallb 구성적용 ##### kubectl create -f metallb-config.yaml ##### Kubernetes Cluster에 metallb 확인 ##### kubectl get pods -n metallb |
파드 (Pod)
Kubernetes Cluster 에서 애플리케이션을 실행하고 배포하는 가장 작은 단위
파드 생성
kubectl run example-pod --image IMAGE
특정 파드의 상세한 정보 확인
kubectl describe pods POD
특정 파드의 로그 확인
kubelctl logs POD
특정 파드 Manifest 정보 확인
kubectl get pod POD -o yaml
레이블(Label)
Kubernetes Cluster에 있는 모든 Object에 대해 key/value 쌍으로 리소스를 식별하고 속성을 지정할 때 사용
오브젝트의 분류, 용도 등의 속성을 메모
오브젝트에 지정한 레이블을 따라 오브젝트를 제어할 수 있음.
<활용 예>
env: develop / env: production
app: docs / app: apply-app
department: company / department: operation
Pod목록확인 (Label 표시)
kubectl get pods --show-labels
레이블 지정
kubectl label pods POD LABEL
kubectl label pods POD label_key=label_value
kubectl label pods POD department=operation
레이블 변경
kubectl label pods POD LABEL --overwrite
kubectl label pods POD label_key=label_value
kubectl label pods POD department=operation --overwrite
레이블 셀렉터
오브젝트에 부여된 레이블을 식별하고 검색할 수 있음
검색 방법
- 특정 키가 있는/없는 레이블
- 특정 키와 값이 있는/없는 테이블
연산자 | label 검색 활용 |
= | vagrant@kube-control1:~/work/20210825$ kubectl get pods --show-labels -l tier NAME READY STATUS RESTARTS AGE LABELS myapp-pod-label 1/1 Running 0 7m14s env=develop,tier=frontend |
== | vagrant@kube-control1:~/work/20210825$ kubectl get pods --show-labels -l 'env=develop' NAME READY STATUS RESTARTS AGE LABELS myapp-pod-label 1/1 Running 0 8m12s env=develop,tier=frontend |
!= | vagrant@kube-control1:~/work/20210825$ kubectl get pods --show-labels -l '!tier' NAME READY STATUS RESTARTS AGE LABELS example-pod2 1/1 Running 0 43m department=operation |
in | vagrant@kube-control1:~/work/20210825$ kubectl get pods --show-labels -l 'env in (develop,operation)' NAME READY STATUS RESTARTS AGE LABELS myapp-pod-label 1/1 Running 0 13m env=develop,tier=frontend |
notin | vagrant@kube-control1:~/work/20210825$ kubectl get pods --show-labels -l 'tier notin (frontend)' NAME READY STATUS RESTARTS AGE LABELS example-pod2 1/1 Running 0 51m department=operation,tier=backend |
어노테이션 (Annotation)
오브젝트에 비식별 메타데이터를 지정
레이블처럼 레이블 셀렉터로 검색할 수 있는 기능은 없음
선언적 구성정보, 타임스탬프, 이미지 해시, 레지스트리 주소, 디버깅 정보, 관리자 정보 등의 메타데이터를 기록하는데 사용함.
Annotation 지정
vagrant@kube-control1:~ $ kubectl annotate pod myapp-pod-label devops-team/developer="Hong gildong" pod/myapp-pod-label annotated vagrant@kube-control1:~ $ kubectl describe pod myapp-pod-label vagrant@kube-control1:~ $ kubectl get pods myapp-pod-label -o yaml ▶ Annotations: 섹션에서 기록내용을 볼 수 있음. |
네임스페이스 (Namespace)
Kubernetes Cluster에 대한 논리적인 격리를 제공하는 논리적인 파티션
- default : kubernetes cluster 기본 namespace로 별도로 namespace 를 지정하지 않는 경우 기본 namespace
- kube-system : Kubernetes System에서 생성한 namespace
- kube-public :
- kube-node-lease :
생성
kubectl create -f FILE.yaml -n NAMESPACE
pod 생성시, namespace를 지정하면 논리적으로 격리되어있는 환경이므로 같은 pod명을 가질 수 있다.
vagrant@kube-control1:~/work/20210825$ kubectl create -f myapp1.yaml -n development
pod/myapp-pod-label created
vagrant@kube-control1:~/work/20210825$ kubectl get pods -n development
NAME READY STATUS RESTARTS AGE
myapp-pod-label 1/1 Running 0 19s
vagrant@kube-control1:~/work/20210825$ kubectl get pods → (-n default의 의미)
NAME READY STATUS RESTARTS AGE
myapp-pod-label 1/1 Running 0 162m
삭제
vagrant@kube-control1:~/work/20210825$ kubectl delete namespace development
vagrant@kube-control1:~/work/20210825$ kubectl delete -f qa-ns.yaml
파드(Pod)의 생명주기 및 프로브
파드의 생명주기
Pending → Running → Succeeded or Failed
파드의 생명주기단계
Pending : Pod가 Cluster에서 실행되는것이 승인이 되었으나 아직 실행되지 않은 상태
(Pod가 스케쥴링 되지 않은 상태)
Running : Pod가 노드에 할당되어 실행중인 상태
(하나 이상의 컨테이너가 실행중인 상태)
Succeeded : 모든 컨테이너가 정상적으로 종료가 된 상태
Failed : 모든 컨테이너가 종료된 상태. 하나이상의 컨테이너가 정상적이지 않은 방식으로 종료된 상태
Unknown : 알 수 없는 상태. 노드의 통신에 오류가 발생한 경우 등.
컨테이너의 상태
- Waiting : 컨테이너가 running 또는 terminated 상태가 아닌 경우
- Running : 실행된 상태 실행이 시작된 시간을 표시
- Terminated : 컨테이너 실행이 완료된 상태
컨테이너 재시작 정책 (restartPolicy)
- Always : (기본값) 종료/실패 시 항상 재시작
- Onfailure : 실패시 재시작
- Never : 재시작하지 않음
yaml파일 작성 시 spec 블럭에서 restartPolicy 지정 가능
> spec:
> restartPolicy: Always
컨테이너 프로브(Container Probe)
컨테이너의 동작 상태를 감시
kubelet이 Probe Handler를 호출함
Probe Handler의 컨테이너 진단방식
- HTTPGetAction : 특정 경로의 리소스를 요청하여 컨테이너 상태 진단
- TCPSocketAction : 특정 TCP Port에 연결을 시도하여 포트 활성화 여부를 확인
- ExecAction : 컨테이너 내의 특정 바이너리를 실행하여 정상 종료 여부를 확인
Probe Handler 상태
- Success 진단 통과
- Failure 진단 실패
- Unknown 진단 시도 실패
컨테이너 프로브 종류 (Container Probe Types)
- livenessProbe : 컨테이너가 동작중인지를 확인
→ 진단 실패 시, 재시작정책 적용(restartPolicy)
- readinessProbe : 컨테이너가 요청을 처리할 준비가 되었는지를 확인
→ 진단 실패 시, endpoint controller가 pod의 ip주소를 endpoint에서 제거함 : 다른 요청이 외부에서 오지 않도록
- startupProbe : 컨테이너 내의 애플리케이션이 시작되었는지를 확인
→ startupProbe가 선언된 경우 통과하기 전까지 다른 Probe를 활성화하지 않음
delay : probe 실행 전 지연시간 (기본값 0초)
timeout : probe의 timeout (기본값 1초)
period : probe의 주기 (기본값 10초)
success : probe의 성공 임계값 (기본값 1초)
failure : probe의 실패 임계값 (기본값 1초)
vagrant@kube-control1:~ $ kubectl get pods example-pod2 -o jsonpath='{.status.phase}'
Running
vagrant@kube-control1:~ $ kubectl get pods example-pod2 -o jsonpath='{.status.containerStatuses[*].state}'
{"running":{"startedAt":"2021-08-25T02:29:55Z"}}
vagrant@kube-control1:~ $ kubectl get pods example-pod2 -o jsonpath='{.status.containerStatuses[0].state}'
{"running":{"startedAt":"2021-08-25T02:29:55Z"}}
P133 livenessProbe
vagrant@kube-control1:~/work/20210825$ curl http://192.168.233.216:8080
Hello World!
myapp-pod-liveness
vagrant@kube-control1:~/work/20210825$ curl http://192.168.233.216:8080/health
Health Check: OK
vagrant@kube-control1:~/work/20210825$ curl -I http://192.168.9.86:8080
HTTP/1.1 200 OK
Date: Wed, 25 Aug 2021 07:49:59 GMT
Content-Length: 36
Content-Type: text/plain; charset=utf-8
vagrant@kube-control1:~/work/20210825$ curl -I http://192.168.9.86:8080/health?code=404
HTTP/1.1 404 Not Found
Date: Wed, 25 Aug 2021 07:50:08 GMT
Content-Length: 27
Content-Type: text/plain; charset=utf-8