kubernetes

20210825 (수) kubernetes application 관리

gusalstm 2021. 8. 25. 18:03
반응형

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초)

 

 

728x90
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

 

728x90