컨테이너 오케스트레이션을 위한 Kubernetes (22.05.18)

박민선·2022년 5월 18일
0

Pod Lifecycle/Lifetime

Pod 상태

  • Pending: 스케줄링되기 전, 이미지 받기 전, 컨테이너가 준비 되기 전
  • Running: 컨테이너가 실행 중, 실행 전, 재시작 중
  • Succeed: 정상 종료 (0)
  • Failed: 비정상 종료 (!0)
  • Unknown: 노드의 통신 문제로 상태 알 수 없음

Container 상태

  • Waiting: 이미지 받기 전, 볼륨 연결 되기 전
  • Running: 실행 중
  • Terminated: 종료

재시작 정책

kubectl explain pod.spec.restartPolicy
  • pod.spec.restartPolicy
    - Always(기본)
    - OnFailure
    - Never

실시간 보기

#(상태가 변할때만 보임) - 여러개 지정 불가
kubectl get pods --watch

#(시간별로 보기) - 여러개 지정가능
watch -n1 -d kubectl get pods

지수 백오프

  • 파드 실패시 재시작 정책에 의해 재시작을 하게됨
    - 재시작 시간 10, 20, 40, 80 ... 300 초 까지 유예기간

컨테이너 프로브

프로브 종류

  • linveness: 애플리케이션 실행/작동 여부
  • readiness
  • startup: 애플리케이션이 시작 되었는지 확인, 성공하지 않으면 나머지 프로브 비활성화

프로브 메커니즘

  • httpGet
    - Web, WebApp
    - 응답 코드 2XX, 3XX
  • tcpSocket
    - 해당 포트 TCP 연결
  • grpc
    - grcp 프로토콜 연결
  • exec
    - 명령 실행
    - 종료 코드 0@

HTTP 응답코드
1xx 정보
2xx 성공
3xx 리디렉션
4xx 클라이언트 오류
5xx 서버오류

프로브 결과

  • success
  • failuer
  • unknown

pods.spec.containers.livenessProbe

  • exec
  • httpGet
  • tcpSocket
  • periodSeconds: 프로브 주기
  • failureThreshold: 실패 임계값
  • successThreshold: 성공 임계값
  • initialDelaySecond: 프로브 유예 기간
  • timeoutSeconds: 프로브 타임아웃

Workload Resource = Controller

ReplicationController

ReplicationController (rc)
:파드가 너무 많으면 추가적인 파드를 제거함
너무 적으면 파드를 시작함

kubectl explain rc.spec.template

pod.metadata. = rc.spec.metadata.
pod.spec. = rc.spec.template.spec.

myweb-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb-rc
spec:
  replicas: 3
  selector:
    app: web
# Pod Configure
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: myweb
          image: ghcr.io/c1t1d0s7/go-myweb
          ports:
            - containerPort: 8080
              protocol: TCP

파일을 이용한 rc 생성

kubectl create -f myweb-rc.yaml

rc 확인

watch kubectl get rc,pods --show-labels -o wide

NAME                 READY   STATUS    RESTARTS   AGE   LABELS
pod/myweb-rc-7m4v7   1/1     Running   0          29m   app=web
pod/myweb-rc-7s4vp   1/1     Running   0          78m   app=web
pod/myweb-rc-jtq7d   1/1     Running   0          78m   app=web

rc label 변경

kubectl label pod myweb-rc-jtq7d app=db --overwrite
kubectl label pod myweb-rc-jtq7d app=web --overwrite

RC 스케일링

명령형 커맨드

kubectl scale rc myweb-rc --replicas=5

명령형 오브젝트 구성

kubectl replace -f myweb-rc.yaml

yaml파일 고치고 create 대신 replace
(단, template 정보는 수정해도 변경이 되지않음 -pod 만들때 최초에 적용)

kubectl patch -f myweb-rc.yaml -p '{"spec": {"replicas": 3}}'
kubectl patch rc myweb-rc.yaml --patch-file replicas.json

replicas.json

{"spec": {"replicas": 3}}
kubectl edit -f myweb-rc.yaml
kubectl edit rc myweb-rc
kubectl edit rc/myweb-rc

선언형 오브젝트 구성

kubectl apply -f myweb-rc.yaml

ReplicaSets

ReplicationController -> ReplicaSets
rc와 rs는 거의 유사하지만 matchExpressions 이 추가됨

machLabels 사용 (rc와 유사)

apiVersion: apps/v1
kind: ReplicaSets
metadata:
  name: myweb-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
      env: dev
  template:
    metadata:
      labels:
        app: web
        env: dev
    spec:
      containers:
        - name: myweb
          image: ghcr.io/c1t1d0s7/go-myweb
          ports:
            - containerPort: 8080
              protocol: TCP
              

matchExpressions 사용 (자기영역을 잘 셀렉팅하여 관리함)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myweb-rs-set
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values: 
          - web
      - key: env
        operator: Exists
  template:
    metadata:
      labels:
        app: web
        env: dev
    spec:
      containers:
        - name: myweb
          image: ghcr.io/c1t1d0s7/go-myweb
          ports:
            - containerPort: 8080
              protocol: TCP
              

DaemonSets

: 모든 노드의 파드를 실행
노드가 추가되면 파드도 추가됨
노드가 제거되면 파드는 가비지로 수집됨
데몬셋을 삭제하면 데몬셋이 생성한 파드들이 정리

주용도 agent
app을 보조하거나 infra유지보수관리

노드마다 하나씩 파드 배치

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: myweb-ds
spec:
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
          - myweb
      - key: env
        operator: Exists
  template:
    metadata:
      labels:
        app: myweb
        env: dev
    spec:
      containers:
        - name: myweb
          image: ghcr.io/c1t1d0s7/go-myweb
          ports:
            - containerPort: 8080
              protocol: TCP
cd ~/kubespray

노드 제거

ansible-playbook -i inventory/mycluster/inventory.ini remove-node.yml -b --extra-vars="node=node3" --extra-vars reset_nodes=true

노드 추가

ansible-playbook -i inventory/mycluster/inventory.ini scale.yml -b

노드 추가 및 제거 참고링크
https://kubespray.io/#/docs/getting-started

Jobs

: 성공적으로 종료될 때까지 계속해서 파드를 실행
시작-->완료

apiVersion: batch/v1
kind: Job
metadata:
  name: mypi
spec:
  template:
    spec:
      containers:
        - image: perl  
          name: mypi
          command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: OnFailure

tip. 명령어 작성 시 esc+. 을 치면 마지막 아규먼트, 옵션이 나옴

잡 컨트롤러의 레이블

파드 템플릿의 레이블 / 잡 컨트롤러의 레이블 셀렉터는 지정하지 않는다.
-> 잘못된 매핑으로 기존의 파드를 종료하지 않게 하기 위함

파드의 종료 및 삭제

job.spec.activeDeadlineSeconds: 애플리케이션이 실행될 수 있는 시간 지정
job.spec.ttlSecondsAfterFinished: 컨트롤러 및 파드 삭제

apiVersion: batch/v1
kind: Job
metadata:
  name: mypi
spec:
  template:
    spec:
      containers:
        - image: perl
          name: mypi
          command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: OnFailure
  ttlSecondsAfterFinished: 10

작업의 병렬 처리

job.spec.completions: 완료 횟수
job.spec.parallelism: 병렬 개수
completions 수 >= parallelism 수

apiVersion: batch/v1
kind: Job
metadata:
  name: mypi-para
spec:
  completions: 3
  parallelism: 3
  template:
    spec:
      containers:
        - image: perl
          name: mypi
          command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(1500)"]
      restartPolicy: OnFailure

일시중지

kubectl edit jod mypi

suspend를 true로 변경하여 일시중지 가능 (default 값은 false)

kubectl get po -A로 보는 목록중
뒤에 -node 가 붙어있는 pod들은 static pod이며 kubelet이 관리함

CronJob

: 주기적으로 동작 시킴

kubectl explain cj --api-version=batch/v1beta1 (다른버전 상세 확인)
1.8 ~ 1.20 -> v1beta1
1.21 -> v1

apiVersion: batch/v1
kind: CronJob
metadata:
  name: sleep-cj
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: sleep
              image: ubuntu
              command: ["sleep", "80"]
          restartPolicy: OnFailure
  #concurrencyPolicy: ( Allow | Forbid | Replace )

cj.spec.concurrencyPolicy

  • Allow: 동시 작업 가능
  • Forbid: 동시 작업 금지(이전 작업이 계속 실행 됨)
  • Replace: 교체(이전 작업은 종료되고 새로운 작업 실행)

100회이상의 일정이 누락되면 잡을 실행하지않고 에러 로그를 남김

profile
클라우드신생아

0개의 댓글