본문 바로가기

Develop/DevOps

[MLOps] Kubernetes CKA자격증 공부(1)

반응형

평소에 Data Engineering쪽에 관심이있어서 어떤걸공부할까 생각하다가, 해당 부서에서 일하시는분이 Certified Kubernetes Administrator(CKA)자격증이 도움이 될것이라고 하셔서 공부를하게 됐다.

Kubernetes 구조

udemy - CKA Class

[참조/정리를 너무 잘해놓으셨다...]=> https://ooeunz.tistory.com/118

Master Node

모든 클러스터(Worker Nodes)를 관리하는 노드. 모니터링, 스케쥴링, 매니징, 플래닝등등 을 담당. 아래는 Master Node에 속하는 요소들.

  • kube-apiserver

kube-apiserver는 쿠버네티스 클러스터의 api를 사용할 수 있도록 하는 컨트롤 플레인 컴포넌트 입니다. 즉 api 서버는 쿠버네티스 프론트 엔드로서 클러스터로 온 요청이 유효한지 검증하고, api서버를 통해 다른 컴포넌트가 서로 필요한 정보를 주고받게 됩니다. 특히 etcd에는 kube-apiserver만 접근할 수 있습니다(아무래도 보안때문에 이러는것같다).

  • kube-scheduler

현재 클러스터 안에서 자원 할당이 가능한 노드 중 알맞은 노드를 선택해서 새로운 파드를 실행해주는 역할을 합니다. 처음 파드가 실행될 때 최소 할당되어야 하는 ram과 같은 설정들을 할 수 있는데, 이러한 조건에 맞추어 알맞은 노드에 파드를 실행시켜주는 자동화 작업해주게 됩니다.

  • ETCD Cluster

etcd는 쿠버네티스에서 필요한 모든 데이터를 키-값 형태로 저장하는 저장하는 데이터베이스 역할을 합니다. etcd는 서버 하나당 프로세스 1개만 사용할 수 있는데, 보통 etcd 자체를 클러스터링 한 후 여러 개 마스터 서버에 분산해서 실행해 안정성을 보장하도록 합니다.

  • Controller-Manager

쿠버네티스의 파드들을 관리하는 컨트롤러입니다. 컨트롤러 각각은 논리적으로 개별 프로세스지만 복잡도를 줄이려고 모든 컨트롤러를 바이너리 파일로 컴파일해서 단일 프로세스로 실행합니다.

 

Worker Node

특정 Application을 컨테이너 형식으로 돌아가게끔 해주는 역할.

  • kubelet

kubelet은 클러스터 안 모든 노드에서 실행되는 에이전트입니다. 파드스펙(PodSpec) 설정을 전달받아서 파드 컨테이너의 실행을 직접적으로 관리하고 해당 컨테이너가 정상적으로 실행되는지 헬스 체크를 진행합니다.

단, 노드 안에 있는 컨테이너라도 쿠버네티스를 통해서 만들어지지 않은 컨테이너는 관리하지 않습니다.

 

  • kube-proxy

쿠버네티스는 클러스터 안에서 별도의 가상 네트워크를 생성하고 관리하게 되는데, kube-proxy는 이런 가상 네트워크의 동작을 관리하는 컴포넌트입니다.

 

yaml 파일 구조

apiVersion

kind - 만들고자 하는 유형 (ex. Pod, ReplicaSet, Deployment ... 대문자를 가리는것같다)

metadata

spec

kubectl 관련 명령어

현재 작동하고 있는 노드 검색

kubectl get nodes

현재 작동하고 있는 pod검색

kubectl get pods

현재 작동하고 있는 pod 삭제

kubectl delete pod [POD-NAME]

만일 현재 작동하고 있는 모든 pod을 삭제하고싶을땐

kubectl delete pod --all

현재 동작하고 있는 서비스에 대한 정보

- TargetPort정보를 수집할수있음

kubectl describe service

 

작동하고 있는 pod 정보 수정

kubectl edit pod [POD-NAME]

Replicasets 관련 명령어

Replicaset.yaml파일 작성

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicaset
  labels:
    app: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 3
  template:
    metadata:
      name: nginx-2
      labels:
        app: myapp
    spec:
      containers:
        - name: nginx
          image: nginx

다음명령어로 대응하는 replicaset생성

kubectl create -f Replicatset.yaml

 

replicaset개수 변경

- command로 변경하는 방법

kubectl scale replicaset myapp-replicaset --replicas=2

- yaml파일 수정해서 변경하는 방법

kubectl edit replicaset myapp-replicaset

spec 부분에서 replicas대응하는 변수를 고쳐주면된다. 그리고 저장하면 자동으로 반영하게됨.

이러한 방법은 고치면 바로 적용되기때문에 신중하게 작업해야한다고 함.

 

Update & Rollback

새로운 환경을 업데이트 시켜주거나, 잘못업데이트 했을시 롤백하는 방법

# 현재 myapp-deployment라는 deployment가 띄워진상태
# deployment2.yaml 버전으로 업데이트 해줄때(안에는 nginx버전을1.9.1로 올려주려는 파일내용이 있음)
kubectl apply -f deployment2.yaml

kubectl set image deployment/myapp-deployment nginx=nginx:1.9.1

만일 잘못작동하여 롤백하고싶을때

# deployment 변경 상태
kubectl rollout status deployment/myapp-deployment

# deployment 변경 기록
kubectl rollout history deployment/myapp-deployment

# 이전버전으로 deployment 롤백
kubectl rollout undo deployment/myapp-deployment

 

Service

노드안에있는 Pod과 연결하기 위해서는 다음과 같은 포트유형에 값을 정해줘야함

  • NodePort - 노드에 대응하는 포트
  • Port - 외부와 Pod을 연결을 해주기위한 포트(서비스 포트)
  • TargetPort - Pod의 포트

반응형