본문 바로가기
도커&쿠버네티스

[도커/쿠버네티스] 5장 쿠버네티스 설치 / 6장 쿠버네티스 시작하기 (포드, 레플리카셋, 디폴로이먼트, 서비스)

by bzerome240 2022. 2. 7.

도커엔진과 달리 쿠버네티스는 사용 환경과 목적에 따라 설치하는 방법이 매우 다양하다

 

개발 용도의 설치

  • Minikube
  • Docker Desktop for Mac/Windows 에 내장된 쿠버네티스

 

서비스 테스트 또는 운영 용도의 설치

  • Kops
  • Kubespray
  • kubeadm
  • EKS, GKE 등의 매니지드 서비스

 

실제 서비스 또는 운영 용도 쿠버네티스 환경 종류

1. 클라우드 플랫폼 환경

  • ex) AWS, GKE
  • 매니지드 서비스를 사용해 설치할 지 또는 서버 인스턴스만을 사용해 설치할 지 선택

2. 자체적으로 보유한 온프레미스(on-premis) 서버 환경

  • 장점: 쿠버네티스와 서버 인프라의 세밀한 부분까지 원하는 대로 구성 가능
  • 단점: 쿠버네티스를 포함한 모든 인프라 직접 관리하여 운영 및 유지보수 복잡해짐
  • 설치 툴: kubespray, kubeadm

 

 


쿠버네티스의 특징

  • 모든 리소스는 오브젝트 형태로 관리된다.
  • 쿠버네티스는 명령어로도 사용할 수 있지만 YAML 파일을 더 많이 사용한다.
  • 쿠버네티스는 여러 개의 컴포넌트로 구성돼 있다.
    • 마스터 노드 - API 서버, 컨트롤러 매니저, 스케줄러, DNS 서버 등 실행
    • 모든 노드 - proxy, 네트워크 플러그인 (calico, flannel 등) 실행

 

 

쿠버네티스를 잘 사용하는 방법은 YAML 파일을 잘 작성하는 것!

 

 

kublet

: 컨테이너 생성, 삭제와 마스터와 워커 노드 간의 통실 역할을 담당하는 매우 중요한 에이전트

  • 모든 노드에서 기본적으로 실행되며, 마스터 노드에는 API 서버 등이 컨테이너로 실행된다
  • 정상적으로 실행되지 않으면 해당 노드는 쿠버네티스와 연결되지 않을 수 있다

 


 

컨테이너 애플리케이션을 구동하기 위해 반드시 알아야 할 오브젝트
-> 포드(Pod), 레플리카셋(Replica Set), 서비스(Service), 디플로이먼트(Deployment)

 

 

6.2 포드(Pod)

* 쿠버네티스에서 가장 기초적이고 중요한 개념

 

 

도커 엔진의 기본 단위 - 도커 컨테이너

스웜 모드의  기본 단위 - 여러개의 컨테이너로 구성된 서비스(service)

쿠버네티스의 기본 단위 - 포드 

 

 

쿠버네티스와 도커의 차이점

: 도커는 컨테이너를 만들지만, 쿠버네티스는 컨테이너 대신 Pod을 만든다. (Pod는 한 개 또는 여러 개의 컨테이너를 포함한다.)

 

 

포드

: 1개 이상의 컨테이너로 구성된 컨테이너의 집합

ex) Nginx 웹 서비스를 쿠버네티스에서 생성할 때, 포드 1개에 Nginx 컨테이너 1개 포함해 생성한다.

ex) 동일한 Nginx 컨테이너를 여러개 생성하고 싶다면 1개의 Nginx 컨테이너가 들어 있는 동일한 포드를 여러개 생성하면 된다.

-> Nginx 컨테이너로 구성된 포드 yaml 생성

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

책의 git yaml 예제 참고: https://github.com/alicek106/start-docker-kubernetes/tree/master/chapter6

 

 

YAML 파일 구성

1. apiVersion

: YAML 파일에서 정의한 오브젝트의 API 버전

 

2. kind

: 해당 리소스의 종류

- 사용할 수 있는 리소스 오브젝트 종류 확인 명령어: kubectl api-resources 의 KIND 항목

 

3. metadata

: 라벨, 주석, 이름과 같은 리소스의 부가 정보

 

4. spec

: 리소스를 생성하기 위한 자세한 정보

- containers: 포드에서 실행될 컨테이너 정보

- image: 사용할 도커 이미지

- name: 컨테이너의 이름

- ports: 컨테이너가 사용할 포트

- command, args: 컨테이너 내부에서 가장 먼저 실행될 프로세스 지정

 

 

작성한 YAML 파일을 쿠버네티스에 생성하기

kubectl apply -f nginx-pod.yaml

 

 

특정 오브젝트의 목록 확인

kubectl get [오브젝트명]

kubectl get pods

 

리소스의 자세한 정보 확인

kubectl describe

kubectl describe pods my-nginx-pod

 

포드의 컨테이너 내부에 들어가 명령어 전달도 가능하다

kubectl exec -it my-nginx-pod bash

root@my-nginx-pod:/# ls /etc/nginx
...

 

쿠버네티스 로그 확인

kubectl logs

kubectl logs my-nginx-pod

 

쿠버네티스 오브젝트 삭제

kubectl delete -f

kubectl delete -f nginx-pod.yaml

 

 


 

 

* 포드와 도커 컨테이너의 개념이 비슷하다. 그렇지만, 쿠버네티스가 포드를 사용하는 이유

-> 여러 리눅스 네임스페이스를 공유하는 여러 컨테이너들을 추상화된 집합으로 사용하기 위해서! (?)

 

네트워크 네임스페이스의 역할: 컨테이너의 고유한 네트워크 환경을 제공해준다.

 

포드 내부의 컨테이너들은 네트워크와 같은 리눅스 네임스페이스를 공유한다

 

 

* 실제 쿠버네티스 환경에서는 1개의 컨테이너로 구성된 포드를 사용하는 경우가 많다.

 

 

사이드카 컨테이너

: 포드에 정의된 부가적인 컨테이너

- 포드 내의 다른 컨테이너와 네트워크 환경 공유 -> 포드에 포함된 컨테이너들은 모두 같은 워커 노드에서 함께 실행된다

 

 

포드 VS 도커 컨테이너

- 포드에 정의된 여러개의 컨테이너는 하나의 완전한 애플리케이션으로 동작하게된다.

 


6.3 레플리카셋(Replica Set)

 

레플리카셋 역할

  • 정해진 수의 동일한 포드가 항상 실행되도록 관리
  • 노드 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성

 

레플리카셋 목적은 일정 개수의 포드를 유지하는 것 

 

 

ex) Nginx 포드를 생성하는 레플리카셋

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx-pods-label
  template:
    metadata:
      name: my-nginx-pod
      labels: 
        app: my-nginx-pods-label
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
  • spec.replicas: 동일한 포드를 몇 개 유지시킬 것인지 설정
  • spec.template: 포드를 사용할 때 사용할 템플릿 정의 (포드 스펙, 포드 템플릿)

 

 

레플리카셋 목록 확인

kubectl get rs

 


 

6.4 디플로이먼트(Deployment)

 

레플리카셋 상위 오브젝트 이므로 디플로이먼트를 생성하면 레플리카셋도 함께 생성된다

-> 디플로이먼트를 사용하면 포드와 레플리카셋을 직접 생성할 필요 없다.

 

ex) 디플로이먼트 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

 

디플로이먼트 목록 확인

kubectl get deployment

 

디플로이먼트를 사용하는 이유? 애플리케이션의 업데이트와 배포를 편하게 하기 위해

  • 업데이트할 때 레플리카셋 변경사항을 저장하는 리비전을 남겨 롤백 가능
  • 무중단 서비스를 위해 포드의 롤링 업데이트 전략을 지정 가능

6.5 서비스(Service)

 

도커 컨테이너 외부 노출 방법

  • 컨테이너 생성과 동시에 외부 노출 방법: -p 옵션
  • 컨테이너들이 서로의 이름으로 접근하는 방법: docker run --link 옵션

 

쿠버네티스의 포드에 접근하는 방법

  • 서비스 오브젝트 생성

 

서비스의 기능

  • 여러개의 pod에 쉽게 접근할 수 있도록 고유한 도메인 이름 부여
  • 여러개의 pod에 접근할 때 요철을 분산하는 로드 밸런서 기능 수행
  • 클라우드 플랫폼의 로드 밸런서, 클러스터 노드의 포드 등을 통해 포드를 외부로 노출

 

포드의 IP 확인

kubectl get pods -o wide

 

서비스 종류

목적에 맞는 적절한 서비스 종류 선택

 

1. ClusterIP 타입

  • 쿠버네티스 내부에서만 포드 접근할 때 사용
  • ex) k8s 대시보드 관리, 각 포드의 서비스 상태 디버깅, 프론트엔드 or 벡엔드 서비스 아키텍처 계획

https://www.learnitguide.net/2020/05/kubernetes-services-explained-examples.html

2. NodePort 타입

  • 포드에 접근할 수 있는 포트를 클러스터의 모든 노드에 개방 -> 외부에서 포드에 접근 가능
  • ex) 내부에서 개발하다가 외부에 대모를 하는 경우

https://www.learnitguide.net/2020/05/kubernetes-services-explained-examples.html

3. LoadBalancer 타입

  • 로드밸런서를 동적으로 포드에 연결 -> 외부에서 포드에 접근 가능
  • 클라우드 환경에서만 작동 가능 ex) aws, google cloud
  • ex) 외부에 시스템을 노출시키는 경우

https://www.learnitguide.net/2020/05/kubernetes-services-explained-examples.html

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

댓글