본문 바로가기

컴퓨터/도커

6. 쿠버네티스를 활용한 웹 서비스 배포

웹 서비스 배포를 위한 사전 준비

이제 앞에서 도커 허브에서 다운 받았던 이미지들을 우리가 배포해볼 것이다.

이를 위해서 먼저 도커 허브에 가입을 해야하는데 추후 우분투에서 로그인을 해야함으로 다른 방법으로 로그인 보다는 이메일 주소와 비밀번호를 통해서 계정을 생성해주면 좋다.

도커 허브에 회원가입

이후의 배포를 위해 PostgreSQL이 동작중인지 확인하다.

여기서 postgreSQL을 사용하는 이유는 django의 데이터베이스 백엔드로 사용되기 때문이다.

 

postgreSQL실행 확인

인그레스를 통해 django실행

이전에 실습에 사용한 인그레스를 활용해 django를 배포한 뒤 인그레스를 통해 외부 트래픽을 django 서비스로 라우팅하는 실습을 진행하겠다.

먼저 이전에 도커 실습에서 사용한 django관련 파일들을 복사한다.

여기서 setting.py파일을 수정해줘야하는데 postgreSQL이 설치된 노드의 주소를 HOST로 설정하고 postgreSQL의 기본 포트번호인 5432를 입력해준다.

setting.py 수정

이제 django이미지를 빌드를 진행한다.

 

현재 디렉토리의 Dockerfile을 참조하여 django 이미지 빌드

 

빌드 결과

이제 처음에 가입한 도커 허브에서 빌드한 django이미지와 이름이 동일하게 리포지토리를 생성한다.

 

django 리포지토리 생성

그 후 다시 터미널로 돌아와 도커 허브에 로그인을 해주면 도커 허브에 우리가 만든 이미지를 업로드 할 수 있게 된다.

 

우분투에서 도커 허브에 로그인

로그인을 끝냈으면 docker tag를 통해서 도커 이미지 태그를 생성하고 push를 해주면 도커 허브에 업로드 할 수 있다.

이는 깃허브의 브랜치와 비슷한 느낌으로 다른 이름을 통해서 특정 버전이나 상태를 구분해 줄 수 있게 한다.

 

도커 허브에 배포

배포를 하고 나면 위에서 지정한 tag인 0.2로 django의 이미지가 잘 배포된것을 확인할 수 있다.

 

배포 결과

Nginx 이미지 빌드

이번에는 위와 동일한 과정으로 Nginx이미지를 생성해볼것이다.

먼저 default.conf파일을 수정한다.

이전에는 upstream을 통해 여러 백엔드 서버로 트래픽을 라우팅하는 과정이 들어갔는데 여기서는 하나의 백엔드만 사용하기 때문에 고정된 IP주소로 직접 전달되게 수정해줘야 한다.

 

# default.conf파일 수정

server{
    listen 80;
    server_name localhost;

    location /{
        proxy_pass http://127.0.0.1:8000; # 트래픽 고정된 주소
    }
}

 

nginx 빌드

그 후 위의 django에서 한 과정과 동일하게 도커 허브에 리포지토리를 생성한 후 터미널을 통해서 생성된 nginx이미지를 배포한다.

 

nginx이미지 도커 허브에 배포

그렇게 하면 아래와 같이 이미지가 잘 배포되었음을 볼 수 있다.

 

실행 결과

디플로이먼트 실습

 

# django-deploy.yml파일
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-django
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: web-deploy
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web-deploy
    spec:
      containers: # 컨테이너 설정
      - name: nginx-d	
        image: eeveek8s/mynginxd_ch10:0.3 # 도커 허브에 업로드한 nginx이미지 선택
        ports:
        - containerPort: 80

      - name: django-web
        image: eeveek8s/mydjango_ch10:0.2 # 도커 허브에 업로드한 django이미지 선택
        ports:
        - containerPort: 8000
        
# django-ingress.yml파일        
apiVersion: networking.k8s.io/v1
kind: Ingress	
metadata:
  name: django-ingress	
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2 # 인그레스 컨트롤러 옵션을 입력
spec:
  ingressClassName: nginx	
  rules:
  - http:
      paths:
      - path: /test01(/|$)(.*) # http접근 경로에 하위 경로를 위한 특수 기호 추가	
        pathType: Prefix
        backend:
          service:
            name: django-service # 연동할 서비스 이름
            port:
              number: 80
              
# django-service.yml파일              
apiVersion: v1
kind: Service	
metadata:
  name: django-service # 서비스 이름
spec:
  selector:
    app.kubernetes.io/name: web-deploy # 서비스와 연결할 파드 설정
  type: ClusterIP	
  ports:
  - protocol: TCP	
    port: 80	
    targetPort: 80

 

위와 같이 앞에서 했던 디플로이먼트, 서비스, 인그레스 코드를 작성한다.

이제 이들을 각각 실행해보면 아래와 같이 연결이 잘 됨을 볼 수 있다. 

 

디플로이먼트, 서비스, 인그레스 실행

작성한 코드의 실행결과로 아래와 같이 웹 브라우저에 인그레스 경로로 접근을 하면 잘 동작되고 있음을 볼 수 있다. 

 

실행 결과

인그레스를 활용한 Flask 실행

이제 인그레스를 활용해서 Flask를 실행하는 실습을 진행할 것이다.

앞에서 진행하였던 Flask관련 파일을 방금과 유사하게 복사해서 가져온다.

이전에 실습을 진행했던 파일에 특별히 수정할 부분없이 이미지를 빌드해주면 된다.

 

Flask 이미지 빌드

빌드를 했으면 도커 허브 사이트에서 리포지토리를 생성해주고 터미널에서 허브에 push를 하여 이미지를 배포해준다.

 

Flask 이미지 배포

배포를 하면 아래와 같이 잘 배포 되었음을 볼 수 있다.

 

배포 결과

이제 웹에서 flask를 실행시키기 위해서 Nginx를 django실습과 동일하게 허브에 배포할 것이다.

위의 과정과 동일하게 nginx의 이미지를 빌드하고 배포를 하면 아래와 같은 결과를 얻을 수 있다.

 

Nginx 배포

이제 웹에서 실행시키기 위해서 deployment, service, ingress관련 코드를 아래와 같이 만든다.

 

# flask-deploy.yml파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-flask
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: flask-web-deploy # 디플로이먼트가 관리할 파드
  template:
    metadata:
      labels:
        app.kubernetes.io/name: flask-web-deploy
    spec:
      containers:
      - name: nginx-f		
        image: eeveek8s/mynginxf_ch10:0.3 # 도커 허브를 통해 사용할 nginx이미지
        ports:
        - containerPort: 80

      - name: flask-web	
        image: eeveek8s/myflask_ch10:0.2 # 도커 허브를 통해 사용할 flask이미지
        ports:		
        - containerPort: 8001	

# flask-ingress.yml파일 생성
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: flask-ingress	
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2	
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /test02(/|$)(.*) # http경로
        pathType: Prefix
        backend:
          service:
            name: flask-service # 연동할 서비스
            port:
              number: 80

# flask=service.yml파일 생성
apiVersion: v1
kind: Service	
metadata:
  name: flask-service	
spec:
  selector:
    app.kubernetes.io/name: flask-web-deploy # 서비스 이름 및 연결할 파드 종류
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 80	
    targetPort: 80

 

이렇게 코드를 만들고 다음처럼 실행을 하면 Flask에서 설정한 내용인 hello world!가 웹 브라우저에 다음과 같이 나오게 된다.

 

웹에서 실행
실행 결과

인그레스를 활용한 django와 Flask 실행

이제 위에서 진행한 django와 Flask를 합쳐서 동시에 실행하는 실습을 할 것이다.

위에서 만든 deploy파일과 service파일을 그대로 사용하고 ingress부분은 원하는 웹 서비스 화면에 맞게 수정을 아래와 같이 해줘야 한다.

 

# django-flask-ingress.yml 파일 생성

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: django-flask-ingress # 인그레스 이름 설정
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx # 인그레스 클래스 이름
  rules:
  - http:
      paths:
      - path: /test01(/|$)(.*) # django로 접속하기 위한 경로
        pathType: Prefix
        backend:
          service:
            name: django-service
            port:
              number: 80

      - path: /test02(/|$)(.*) # Flask로 접속하기 위한 경로
        pathType: Prefix
        backend:
          service:
            name: flask-service	
            port:
              number: 80

 

실습을 진행하면 쿠버네티스 클러스터 외부에서 인그레스로 요청을 보내면 요청한 URL에 따라 django에 요청을 보내거나 Falsk에 요청을 보낼 수 있다.

URL에 따라 달라지는 실행 결과