쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을 자동화하고 관리하기 위한 오픈 소스 플랫폼입니다.
오늘의 포스팅은 도커 컨테이너 App 실행방법을 시작으로 쿠버네티스에 대한 설명과 deploy, service, ingress, pipelins YAML YAML 설정 방법에 대해 설명하겠습니다.
1. 도커 컨테이너 App 실행
쿠버네티스 없이 도커 컨테이너만으로도 애플리케이션을 실행시킬 수 있습니다. 도커는 컨테이너화 기술을 제공하여 애플리케이션과 그에 필요한 모든 종속성을 컨테이너로 패키징할 수 있게 해줍니다.
도커 컨테이너는 애플리케이션 실행에 필요한 모든 라이브러리, 종속성, 환경 설정 등을 포함하고 있으며, 호스트 시스템에서 독립적으로 실행될 수 있습니다. 따라서 특정 운영 체제나 환경에 종속되지 않고, 어떤 환경에서든 동일한 방식으로 실행할 수 있습니다.
컨테이너는 가상화 기술을 사용하지만 전체 가상 머신보다 가볍고 빠르게 시작되며, 호스트 운영 체제와 커널을 공유하므로 자원 효율성이 뛰어납니다.
기본적으로 도커 컨테이너를 실행시키기 위해서는 Dockerfile이라는 파일에 애플리케이션의 설정과 종속성을 정의하고, 이를 사용하여 도커 이미지를 빌드한 후, 이 이미지를 실행하는 방식을 사용합니다.
아래는 간단한 예시입니다
"JDK 1.8 기반의 웹 시스템을 Maven으로 빌드하고 실행시키는 도커 파일(Dockerfile)과 실행 명령어"
Dockerfile
FROM openjdk:8-jdk-alpine
# WAR 파일 복사
COPY target/your-web-app.war /app.war
# 실행 명령어
CMD ["java", "-jar", "/app.war"]
Bash
# Maven 빌드
mvn clean package
# 도커 이미지 빌드
docker build -t my-java-web-app .
# 도커 컨테이너 실행
docker run -p 8080:8080 my-java-web-app
2. 쿠버네티스란?
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을 자동화하고 관리하기 위한 오픈 소스 플랫폼입니다. 컨테이너 기술을 기반으로 하는 이 도구는 다수의 컨테이너화된 서비스 및 애플리케이션을 확장하고 배포하며, 자동화된 운영 및 스케일링을 제공합니다.
쿠버네티스의 주요 특징과 구성 요소는 다음과 같습니다:
(1) 컨테이너 오케스트레이션
쿠버네티스는 컨테이너 기반의 애플리케이션을 효율적으로 관리하기 위한 오케스트레이션 시스템을 제공합니다. 이를 통해 여러 컨테이너를 자동으로 조절하고 배치하며, 안정적으로 운영할 수 있습니다.
(2) 자동화된 배포 및 스케일링
쿠버네티스는 애플리케이션을 여러 노드에 자동으로 배포하고, 필요에 따라 자동으로 스케일링할 수 있습니다. 이를 통해 트래픽 증가나 감소에 유연하게 대응할 수 있습니다.
(3) 서비스 디스커버리와 로드 밸런싱
서비스 디스커버리 기능을 통해 컨테이너화된 서비스를 찾고 접근할 수 있으며, 로드 밸런싱을 통해 트래픽을 분산시킬 수 있습니다.
(4) 자동 복구와 롤링 업데이트
쿠버네티스는 서비스의 고가용성을 유지하기 위해 자동 복구 메커니즘을 제공하며, 롤링 업데이트를 통해 애플리케이션을 업데이트할 때에도 가용성을 유지할 수 있습니다.
(5) 선언형 오브젝트 구성 및 리소스 관리
쿠버네티스에서는 YAML 또는 JSON과 같은 선언형 오브젝트를 사용하여 애플리케이션 구성을 정의하고, 리소스를 효율적으로 관리할 수 있습니다.
(6) 다양한 배포 환경 지원
쿠버네티스는 온프레미스, 클라우드, 멀티 클라우드 등 다양한 환경에서 동작할 수 있습니다. 이는 이식성을 향상시켜 개발자가 다양한 환경에서 일관된 방식으로 애플리케이션을 배포하고 관리할 수 있도록 합니다.
(7) 컨테이너 운영 및 관리
쿠버네티스는 컨테이너의 생명 주기를 관리하며, 컨테이너의 배포, 확장, 스케일링, 모니터링, 로깅, 업데이트 등을 효율적으로 수행할 수 있도록 지원합니다.
쿠버네티스는 클라우드 네이티브 환경에서 마이크로서비스 아키텍처를 구축하고 관리하기 위한 핵심 도구로 널리 사용되고 있습니다.
3. deploy, service, ingress YAML 설정 방법
쿠버네티스에서 어플리케이션을 배포하고 외부로 노출하며, 내부에서 통신할 수 있도록 하는데 사용되는 리소스들인 Deployments, Ingress, 그리고 Services에 대해 간단히 설명하겠습니다.
(1) Deployment (배포)
Deployment는 어플리케이션을 쿠버네티스 클러스터에 배포하기 위한 리소스입니다. Deployment은 어플리케이션의 복제본을 관리하고, 업데이트 및 롤백과 같은 배포 전략을 정의합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-registry/my-app:latest
(2) Service (서비스)
Service는 쿠버네티스 클러스터 내부에서 서비스 간 통신을 가능케 하는 리소스입니다. Service는 어플리케이션에 대한 로드 밸런싱과 네트워크 라우팅을 담당하며, 클러스터 내부에서 서비스 간 통신을 위해 사용됩니다.
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
(3) Ingress
Ingress는 클러스터 외부에서 어플리케이션에 접근할 수 있도록 해주는 리소스입니다. Ingress는 도메인 기반 라우팅 및 SSL 인증서와 같은 기능을 제공하여 여러 서비스에 대한 외부 액세스를 관리합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
- replicas: 배포할 복제본 수.
- selector: 어떤 Pods를 선택할 것인지 지정.
- template: Pod의 템플릿을 정의.
- containers: 컨테이너 설정.
- ports: 서비스 포트 설정.
- rules: Ingress 룰 정의.
- backend: 룰에 대한 백엔드 서비스 설정.
4. pipelins YAML 설정 방법
GitLab에서 사용되는 CI/CD 파이프라인은 .gitlab-ci.yml 파일에 정의됩니다. 아래는 GitLab CI/CD를 사용하여 간단한 파이프라인을 정의한 예시입니다. 이 예시에서는 소스 코드를 빌드하고, Docker 이미지를 생성하여 GitLab Container Registry에 푸시하고, 마지막으로 Kubernetes 클러스터에 배포합니다.
stages:
- build
- deploy
variables:
CONTAINER_REGISTRY: registry.gitlab.com
CONTAINER_IMAGE: $CONTAINER_REGISTRY/your-group/your-app
KUBE_NAMESPACE: your-namespace
KUBE_SERVER: https://your-kube-api-server
KUBE_TOKEN: $CI_JOB_TOKEN
before_script:
- echo "$CI_JOB_TOKEN" | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com
build:
stage: build
script:
- docker build -t $CONTAINER_IMAGE .
- docker push $CONTAINER_IMAGE
deploy:
stage: deploy
script:
- kubectl config set-cluster cluster --server=$KUBE_SERVER
- kubectl config set-credentials user --token=$KUBE_TOKEN
- kubectl config set-context default-context --cluster=cluster --user=user
- kubectl config use-context default-context
- kubectl set image deployment/your-deployment your-container=$CONTAINER_IMAGE
only:
- master
- stages: 파이프라인의 실행 단계를 정의합니다. 여기서는 build와 deploy 두 단계가 있습니다.
- variables: 파이프라인에서 사용할 환경 변수들을 정의합니다.
- before_script: 스크립트 실행 전에 수행할 명령어를 정의합니다. 여기서는 Docker 레지스트리에 로그인합니다.
- build stage: Docker 이미지를 빌드하고, GitLab Container Registry에 푸시합니다.
- deploy stage: Kubernetes 클러스터에 배포합니다.
해당 예시에서는 단순히 이미지를 업데이트하는 것으로 나타냈습다.이러한 .gitlab-ci.yml 파일은 프로젝트 루트 디렉토리에 위치하며, GitLab이 각 코드 변경에 대해 자동으로 파이프라인을 실행합니다. 이 예시는 간단한 설정이며, 실제로는 빌드 및 배포에 필요한 세부 정보들을 추가해야 합니다. GitLab CI/CD는 다양한 기능과 확장성을 제공하므로 필요에 따라 파이프라인을 확장하고 조정할 수 있습니다.
'#IT 업무노트' 카테고리의 다른 글
JavaScript의 역사 (0) | 2024.01.06 |
---|---|
EAI Inhouse 개발 VS 솔루션 도입 (0) | 2024.01.06 |
JAVS VS C# (0) | 2024.01.05 |
시스템 오픈 전 통합테스트란 무엇인가? (0) | 2024.01.05 |
도커 컨테이너 도커이미지 가상머신 도대체 무슨 말이야? (0) | 2024.01.04 |