[Kubernetes] Kubernetes 핵심 개념 - Section 12

liljoon·2024년 1월 16일
0

이 글은 Udemy의 "【한글자막】 Docker & Kubernetes : 실전 가이드" 강의의 학습 노트입니다.
https://www.udemy.com/course/docker-kubernetes-2022/

작업 구분

관리자가 해야 하는 작업을 구분하는 것이 중요하다.

  • 클러스터 및 노드 등 인프라 구성
  • kubernetes api 서버, kubelet 등 설치
  • 보안, 시스템 관리

kubermatic 과 같은 추가 도구를 이용하여 인프라 구성을 더 쉽게 할 수 있다. AWS의 경우에는 EKS(Elastic Kubernetes Service) 를 통해 쉽게 구성 가능하다.


주요 설치 패키지

kubectl

클러스터 외부에서 클러스터에게 명령을 실행하게 해주는 툴이다.
ex) deployment 생성, 삭제, 변경 등을 할 수 있다.

설치방법(mac)

brew install kubectl

minikube

쿠버네티스를 테스트하기 위해 실제 클러스트 구성은 어렵기 때문에, 로컬에서 데모 클러스터를 구성해준다.

설치방법(mac)

brew install minikube

실행방법

minikube start --driver=<drivername>

minikube가 돌아갈 가상환경을 따로 설정을 해야 한다.

virtualbox 등이 가능하지만 간편한 방법은 docker를 이용하는 것이다.

해당 방법으로 테스트 후 설정파일을 이용해 바로 AWS와 같은 곳에 적용가능하다.

주요 명령어

minikube status : 미니큐브 상태를 조회한다.
minikube dashboard : 클러스터 상태를 자세하게 웹사이트를 통해 조회한다.


kubectl 명령어 실행 방식

명령적 방식

마치 docker run ... 처럼 deployment 객체에 대한 설정을 명령어로 직접 다 입력하는 것이다.

선언적 방식

docker-compose 와 비슷하게 yaml파일에 작성하여 파일을 통해 실행한다.


주요 용어

Pod(파드)

  • 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위
  • 하나 또는 여러 개의 컨테이너를 포함한다.(보통은 하나)
  • 클러스터의 일부로 외부와 통신하거나 내부 ip 주소를 갖는다.
  • 임시적으로 존재한다.
  • 쿠버네티스에 의해 교체되거나 삭제되면 데이터도 전부 삭제된다.
  • deployment를 통해 파드를 관리한다.

deployment

  • 하나 또는 여러 개의 파드를 관리한다.
  • 생성하고 관리해야 하는 pod의 수와 컨테이너 수를 설정한다.
  • 일시중지, 삭제, 롤백 할 수 있다.
  • 오토스케일링을 할 수 있다.
  • 여러 개의 deployment가 존재할 수 있다.

service

  • 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법

실제 실행

minikube가 먼저 실행되는 중인지 확인하자!

  • deployment 생성
kubectl create deployment <deployment 이름> --image=<실행할 도커 이미지>

참고로 도커 이미지에는 dockerhub에 올라가 있는 이미지만 가능하다. (로컬에 존재하는 이미지 X)

  • deployments, pods 조회
kubectl get deployments // 조회
kubectl get pods //조회
  • deployment 삭제 (전부 종료)
kubectl delete deployment <deployment 이름>

하지만 이렇게만 해서는 접속할 수 없다. pod이 외부로 노출이 되어있지 않기 때문에

service 객체를 이용해 pod 노출

기본적으로 pod는 kubernetes에 의해 생성, 삭제, 변경 되므로 ip가 계속 변한다.
그래서 service를 이용하여 pod를 그룹화하여 공유 ip 주소를 제공한다.(동일한 파드가 여러 개 생성되어 로드밸런싱이 되는 상황에서 하나의 ip로 접속)
이를 이용하여 외부로 노출한다.

kubectl expose deployment <deployment name> --type=LoadBalancer --port=8080

type 종류

  • ClusterIP : 클래스터 내부
  • NodePort : 외부로 노출
  • LoadBalancer : 인프라의 로드밸런서 이용, 고르겝 분산

service 조회

kubectl get services 

조회시 EXTERNAL-IP가 pending 상태임. 클라우드 프로바이더로 배포되면 실제 외부 ip를 조회하고 접속할 수 있음. 하지만 여기서는 내부 가상머신 ip 이기에 접속 불가

minikube service <service-name>

을 통해 minikube에서 외부와 매핑해서 연결해줌.


Error 처리

에러발생해서 서버가 죽으면 자동으로 재실행 해준다. 하지만 에러를 반복할 수록 재실행되는 시간이 느려진다. 실제로 서버가 문제가 있어 무한루프 도는 것을 방지하기 위함이다.

kubectl scale deployment/first-app --replicas=3

해당 명령어를 통해 동일한 파드를 3개를 만들 수 있다. 에러가 발생하면 자동으로 에러나지 않은 파드로 연결된다. 다시 1로 설정해서 실행하면 나머지 2개는 자동 종료된다.


소스코드 업데이트

kubectl set image deployment/first-app kub-first-app=<image name>

해당 코드를 실행하면 자동으로 새로운 이미지가 변경되어 실행된다.
잘못된 이미지를 업로드하면 기존의 정상적인 파드가 유지된 상태로 새로운 파드는 에러상태를 유지한다.

  • 상태를 조회할 수 있다.
kubectl rollout status deployment/first-app
  • 최근의 deployment를 취소할 수 있다.
kubectl rollout undo deployment/first-app
  • deployment history를 조회할 수 있다.
kubectl rollout history deployment/first-app

--revison=<num> 를 이용해 구체적인 history조회가능

  • 원하는 revision으로 롤백
kubectl rollout undo deployment/first-app --to-revision=1

선언적 방법

  • deployment.yaml
apiVersion: apps/v1 # version 설정
kind: Deployment # Deployment, Service, Job 등 지정
metadata:
  name: second-app-deployment # 이름 지정
spec: # 여기가 핵심. pod 사양을 설정
  replicas: 1 # 동일한 pod 개수 설정, 기본은 1, 0으로 설정해서 처음에 시작안하게 할 수도 있음.
  selector: # 관리할 pod를 매칭해줌.
    matchLabels:
      app: second-app
      tier: backend
  template: #pod에 대한 설정
    metadata: #pod에 대한 metadata
      labels: #key-value로 원하는 거 설정가능
        app: second-app
        tier: backend
    spec: # pod에 대한 spec
      containers:
        - name: second-node # 컨테이너 이름 지정
          image: <image name> # 이미지 지정
        # - name: second-node # 이런 식으로 여러개 실행 가능.
        #   image:
  • 실행
kubectl apply -f=deployment.yaml

기본적으로 deployment 는 동적 객체이고 pod도 개별적인 객체이다. 그래서 해당 deployment가 특정 pod를 제어하려면 selector를 통해 Label을 통해 지정한다.

  • service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  selector: # Service는 matchLabels이 없음.
    app: second-app
    tier: backend
  ports:
    - protocol: "TCP"
      port: 80
      targetPort: 8080
    # - protocol: 'TCP' # 여러개 노출 가능.
    #   port: 443
    #   targetPort: 443
  type: LoadBalancer # ClusterIP - default 내부적으로 노출, NodePort - 클러스터 내부에서 액세스 가능, 외부는 LoadBalancer
  • 실행
kubectl apply -f=service.yaml
  • 종료
kubectl delete -f=deployment.yaml,service.yaml

추가 내용

  • deployment.yaml과 service.yaml을 한 파일로 관리할 수 있음.
    ---를 이용해 내용을 분리하면 된다. service를 먼저 작성하는 것이 권고 (service가 먼저 생성됨)

  • matchExpressions : matchLabels 대신 사용할 수 있다. 수식이 포함.

matchExpressions:
	- {key:app, operator: In, values: [second-app, first-app]

operator : In, NotIn, Exists, DoNotExist
주로 쓰이지는 않지만 유연한 상황에 사용

  • livenessProve

기본적으로 상태 확인 시 root path를 통해 확인. 하지만 이를 통해 시간이나 경로 수정 가능

livenessProbe:
            httpGet:
              path: /
              port: 8080
            periodSeconds: 3
            initialDelaySeconds: 5

0개의 댓글