Kubernetes 실습 2 : deployment 생성

Gyullbb·2021년 3월 23일
1

K8S

목록 보기
2/5

2. Kubectl을 사용하여 Deployment 생성하기

[^출처 : Kubernetes 공식 문서]: Kubernetes Deployment

2-1. Deployment

쿠버네티스 클러스터를 구동시킨 후 컨테이너화된 애플리케이션을 배포하기 위해서는 쿠버네티스 Deployment 설정을 해야한다.

Deployment는 쿠버네티스가 애플리케이션의 인스턴스를 어떻게 생성하고 업데이트 해야 하는지를 지시한다. Deployment가 생성되면 Control Plane이 Deployment에 포함된 애플리케이션 인스턴스클러스터의 개별 노드에서 실행되도록 스케줄링한다.

Deployment는 또한 자동 복구 기능도 존재한다. 애플리케이션 인스턴스가 생성되면 Deployment 컨트롤러는 지속적으로 해당 인스턴스를 모니터링한다. 인스턴스를 구동하는 노드에 삭제되면, Deployment 컨트롤러가 인스턴스를 클러스터 내부의 다른 노드 인스턴스로 교체를 한다.

Deployment를 생성할 때에는 애플리케이션에 대한 컨테이너 이미지와 구동시키고자 하는 파드 복제 수를 지정해야한다.

Pod란?

쿠버네티스 애플리케이션의 기본 실행 단위이다. 각 파드는 클러스터에서 실행중인 워크로드(쿠버네티스에서 구동되는 애플리케이션)의 일부를 나타낸다.

2-2. 애플리케이션 배포하기

Kubernetes에서 애플리케이션을 배포하기 위해 create deployment 명령어를 입력한다.

$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kuberne1deployment.apps/kubernetes-bootcamp created

해당 명령어를 이용하여 배포를 하면 deployment 이후의 단어 이름인kubernetes-bootcamp으로 배포가 된다. 이때 image는 애플리케이션에 대한 컨테이너 이미지로 해당 명령어에서는 gcr.io/googlesamples/kuberne1deployment.apps/kubernetes-bootcamp 이미지 주소를 지정하였다.

배포 목록을 확인하기 위해서는 get deployments 명령어를 사용한다.

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           4m37s

kubernetes-bootcamp라는 이름으로 배포가 되었음을 확인할 수 있다. 애플리케이션의 단일 인스턴스(kubernetes-bootcamp image)를 실행하는 배포가 1개 있으며, 해당 인스턴스는 Node(master - minikube)의 도커 컨테이너 내에서 실행되고 있다.

쿠버네티스 내부에서 실행중인 Pod는 개인 네트워크에서 실행되고 있다. 따라서 같은 클러스터 내의 Pod에서는 해당 Pod를 볼 수 있으나 개인 네트워크 외부에서는 볼 수 없다.

애플리케이션과 통신하기 위해서는 API endpoint를 이용해야 한다. 클러스터 외부에 애플리케이션을 노출시키기 위한 또 다른 방식은 proxy를 활용하는 것이다.

Proxy란?

직접적으로 통신할 수 없는 서버와 클라이언트 사이에서 중계기로 대리하여 통신을 수행하는 역할을 의미한다. Proxy 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. (출처 : 위키백과)

kubectl 명령을 이용하여 통신을 클러스터 전체의 전용 네트워크로 전달하는 proxy를 생성할 수 있다.

새로운 Tab을 열어서 proxy를 생성한다.

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

127.0.0.1:8001서버가 시작되었음을 확인할 수 있다. 이제 이 프록시 서버를 활용해서 다른 네트워크 서비스(배포한 애플리케이션)에 접근할 수 있다.

예를 들면, curl명령어를 활용하여 API를 통해 버전을 확인할 수 있다. curl은 웹 요청 도구이다.

$ curl http://localhost:8001/version
{
  "major": "1",
  "minor": "17",
  "gitVersion": "v1.17.0",
  "gitCommit": "70132b0f130acc0bed193d9ba59dd186f0e634cf",
  "gitTreeState": "clean",
  "buildDate": "2019-12-07T21:12:17Z",
  "goVersion": "go1.13.4",
  "compiler": "gc",
  "platform": "linux/amd64"
}

API서버는 pod이름을 기반으로 proxy를 통해 접근할 수 있는 각 pod의 endpoint를 자동으로 생성한다.

POD_NAME 환경변수에 kubectl명령어를 활용하여 Pod name을 가져와서 저장한 후 확인해본다.

$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

$ echl Name of the Pod : $POD_NAME
Name of the Pod: kubernetes-bootcamp-69fbc6f4cf-v6hf6

2-3. yaml 파일을 이용한 배포

$ vi test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

spec 필드에 따라 3개의 replica pod를 생성하고 Deployment가 관리한 pod를 찾도록 정의한다. 여기에서는 pod template에 정의된 레이블이 app:nginx인 파드들을 관리하도록 한다.

template 필드에서는 Pod에 app: nginx라는 레이블을 붙인 후 각 파드에 nginx 이미지를 실행하는 nginx 컨테이너 1개를 실행하도록 설정한다.

$ kubectl create -f test.yaml

kubeadm을 이용하여 클러스터를 구축한 경우, LB가 존재하지 않기 때문에 metalLB를 설치해야한다.

metalLB 설치 좋은 사이트

profile
🎈도전 속의 여유를 즐기자🎈

0개의 댓글