[주제] 쿠버네틱스에 도커 컨테이너 배포
이번에는 도커 컨테이너를 서비스 하기 위해 Kubernetes 환경을 구성후 그 위에 컨테이너를 배포를 해보도록 합니다. 전세계적으로 쿠버네틱스를 통해 효과적으로 서비스를 배포, 운영 할 수 있기 때문에 가장 각광받는 오케스트레이션 도구 입니다. 클라우드 위에서 환경을 구성해보고 쿠버네틱스에 서비스 배포를 해보세요.
1) AWS를 통해 쿠버네틱스 인프라 환경 구성
2) 웹 어플리케이션, DB 어플리케이션을 쿠버네틱스에 배포
3) 옵션) 구축된 쿠버네틱스에 Grafana 모니터링 환경 연동
지원하는 기능
- 클러스터 – 중앙 제어, 네트워킹, 노드 스케일 관리
- 상태 관리 – (설정해놓은)원하는 상태 유지, 장애 복구
- 배포 관리 – 컨테이너 생성 시 서버 배치, 추가 리소스 자동 할당
- 버전 관리 – 버전 변경시 자동 배포, 중앙에서 롤백시 일괄 롤백 가능
- 서비스 등록 및 조회 – 서비스 추가시 자동 설정, 프록시 서버의 설정 반영
- 볼륨 스토리지 – 각 컨테이너의 볼륨관리를 추상적인 레벨에서 관리 가능
Kubernetes란?
컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다. 쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다.
즉, Kubernetes란 최신 떠오르는 컨테이너 오케스트레이션의 일종으로 컨테이너를 통한 서버 배포시 해당 서버를 탄력적으로 실시간 상에서 관리해주는 도구이다.
- AWS console에 루트 계정으로 접속하여 IAM에 접속
- 계정 생성시, 권한 설정 AdministratorAccess의 체크박스 클릭 후, 다음으로 넘어감
- 사용자 추가단계에서 csv를 다운받아놓는다.
- AWS에 IAM으로 로그인후 console창의 사용자탭에 들어간다.
- 방금만든 IAM사용자클릭 > 보안자격증명탭 > 엑세스 키 만들기 > csv파일을 다운받는다.
- csv파일의 내용에 맞춰서 AWS CLI설정을 해준다.
설정
$ aws configure
IAM 엔터티 확인
$ aws sts get-caller-identity
$ curl –o kubectl.exe https://amazon-eks.s3.us-west-2.amazonaws.com/1.20.4/2021-04-12/bin/windows/amd64/kubectl.exe
이번에 나는 공식사이트의 설치명령어가 안되어서 인터넷에 찾아서 아래코드를 입력하여 해결하였다. 참고1 참고2
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin“
이후 choco명령어로 버전확인
choco install –y eksctl
choco upgrade –y eksctl
설치할 때처럼 powershell을 관리자권한으로 실행하여 위의 명령어 입력
eksctl version
버전확인까지 완료
eks-cluster-config.yml파일을 준비한다. 예제참고
(편집기를 열어서 yml파일을 생성, 본인은 간단하게 sublime을 활용)
해당 yml파일을 desktop에 놓고 해당위치에서 명령어 입력
$ eksctl create cluster –f ./eks-cluster-config.yml
대략 15분~20분 정도 기다리면 완료
이후 접속상태확인
$ kubectl get nodes
flask-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloud-flask
labels:
app: cloud-flask
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: cloud-flask
strategy:
rollingUpdate:
maxSurge: 20%
maxUnavailable: 20%
type: RollingUpdate
template:
metadata:
labels:
app: cloud-flask
spec:
containers:
- image: gustjr123/docker-test:master
imagePullPolicy: Always
name: cloud-flask
ports:
- containerPort: 5000
protocol: TCP
env:
- name: DB_USER
value: admin
- name: DB_PASSWORD
value: admin1234
- name: DB_NAME
value: flask_db
- name: DB_HOST
value: devops-cd.cldqdwlkg9c1.ap-northeast-2.rds.amazonaws.com
flask-service.yaml
apiVersion: v1
kind: Service
metadata:
name: cloud-flask-svc
spec:
selector:
app: cloud-flask
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: LoadBalancer
deployment는 app배포를 위한 yaml이며, service는 EKS에서 서비스 동작을 지시하는 yaml이다.
본래는 RDS와 위의 배포한 EKS가 같은 VPC상에 만들어져서 보안그룹에 통일시켜서 접근하도록해야 보안상 안전하다. 나는 그 부분까지는 잘 모르겠어서 임시로 RDS의 접근을 public으로 바꿔서 접근하도록 설정해 주었다.
$ kubectl apply –f flask-deployment.yaml
$ kubectl describe deployment cloud-flask
$ kubectl apply -f flask-service.yaml
$ kubectl get pods -l app=cloud-flask
$ kubectl get svc cloud-flask-svc
http://a5247a6a6fbe447c8b955a721139593d-1224857478.ap-northeast-2.elb.amazonaws.com/ (테스트때 URL, 현재는 작동하지 않음)
$ eksctl delete cluster --region=ap-northeast-2 --name=eks-cluster --wait
완전히 삭제되는지 확실하게 판단하기 위해 —wait를 붙여서 삭제를 확인한다.
(삭제하는데 오래걸린다.)
이번 프로젝트는 코멘토라는 사이트에서 실제 실무자로써의 경험을 쌓기위한 경력개발 과정으로써 참여하게 되었다. 과거에 프론트엔드와 백엔드 개발자로 나뉘어서 하던것이 최근엔 DevOps라는 분야가 백엔드에서 분리되어 CI/CD과정을 맡는 분야로 전문화되었다는 얘기를 들었고, 백엔드쪽에 관심이 있던 차에 프로그램에 참여하게 되었다.
기본적으로 CI/CD의 개념을 모르고 있던 나에겐 상당히 흥미로운 부분이었고, 모든 과정을 완벽하게 따라가진 못했지만 80%정도는 프로젝트를 따라갔었던 것 같고, 이정도만 해도 충분히 만족할만한 성과라고 생각된다.
파이썬 환경변수
Chololatey 설치
Chololatey 오류
kubectl 설치
eksctl 설치
전반적인 과정 참고