728x90

서버의 환경을 해치지 않으면서
이미지로 공급되는 어플리케이션간의 통신을 
구현해야 하는 경우가 많이 있습니다. 

외부로 노출은 nginx로 제한하고
실제 각 어플리케이션 접근을
nginx의 location 지시자를 이용하는 경우가 
대표적인 시나리오입니다. 

사용자에 대한 노출은 nginx endpoint 만하고 싶다면?

docker-compose로 다수 컨테이너 구동하기

이 구성을 위해서는 docker-compose를 이용해서 
복수의 컨테이너를 하나의 설정으로 만들어
컨테이너를 배포하는 것이 눈에 잘 들어오고 편리합니다. 

속도 측정을 위한 오픈소스 어플리케이션인
librespeed를 별도의 컨테이너로 띄워두고
nginx도 별도로 구동하기 위해서는 
다음과 같은 설정을 활용할 수 있습니다. 

version: "2"
services:
  nginx:
    container_name: nginx-test
    image: nginx
    ports:
    - 443:443
  speedtest:
    container_name: speedtest
    image: adolfintel/speedtest
    environment:
    - MODE=standalone
    ports:
    - 80:80

nginx의 설정파일은 아래와 같습니다.

upstream speedtest {
    server speedtest:80;
}

server {
    listen      443 ssl;
    server_name example.com;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    ssl_certificate /etc/nginx/cert/fullchain.crt;
    ssl_certificate_key /etc/nginx/cert/private.key;

    access_log  /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log debug;

    location / {
        proxy_pass http://speedtest;
    }
}

컨테이너가 잘 뜰까요? 그렇지 않습니다. 
nginx는 speedtest 이름을 찾을 수 없어서 
업스트림 호스트를 찾을 수 없다는 에러를 뿜습니다.

2022/06/18 03:16:21 [emerg] 1#1: host not found in upstream "speedtest:80" in /etc/nginx/conf.d/default.conf:7
2022/06/18 03:20:00 [emerg] 1#1: host not found in upstream "speedtest:80" in /etc/nginx/conf.d/default.conf:7
2022/06/18 03:34:04 [emerg] 1#1: host not found in upstream "speedtest:80" in /etc/nginx/conf.d/default.conf:7

docker-compose 파일을 수정하여 
별도의 bridge 네트워크를 만들어
두 컨테이너가 서로 통신하도록 해보겠습니다. 

docker bridge 네트워크 구성하기

docker는 다양한 네트워크를 구성을 제공합니다. 
그 중에서 우리의 요건에 맞는 것은 bridge 네트워크입니다. 
말그대로 다리처럼 컨테이너들이 소통할 수 있는 구조입니다. 

네, 그렇다고 합니다 (출처 : https://docs.docker.com/network/bridge/)

앞서 만들었던 docker-compose 파일에 
아래와 같이 network 설정을 추가했습니다. 

version: "2"
services:
  nginx:
    container_name: nginx-test
    image: nginx
    ports:
    - 443:443
    networks:
    - backbone
  speedtest:
    container_name: speedtest
    image: adolfintel/speedtest
    environment:
    - MODE=standalone
    networks:
    - backbone
    ports:
    - 80:80
networks:
  backbone:
    driver: bridge

이번엔 잘 될까요?
설레는 마음으로 sudo docker-compose up을 해봤습니다. 
그리고 브라우저에서 도메인에 접속해보니...

떴다!

 

네, 다행히 기대한 대로 잘 동작했습니다. 
nginx 설정에서도 업스트림 서버 이름으로 
컨테이너 이름을 사용할 수 있어서 편리합니다.
컨테이너간 통신, 어렵지 않네요!

728x90
728x90

AWS에서 컴퓨팅 인프라를 운영하려면 머리가 아픕니다. 
늘 쓰던 것을 쓰면 큰 문제도 고민도(가령 묻지도 따지지도 않고 EC2) 없지만
새로운 제품을 써보려고 하면 일단 제품을 이해하는 것부터 허들입니다 ㅎㅎ
물론 한번 쓰기 시작하면 주머니가 탈탈 털릴 정도로 잘 쓰게 되긴 합니다. 

근래에 k8s 쪽을 다룰일이 계속 생기다 보니 AWS의 제품들에도 관심을 갖게 되었고
AWS가 제공하는 컨테이너 오퍼링을 한번 정리해보고 갈 필요가 생겼습니다. 
도대체 제품 설명만으로는 "뭥미?" 하는 경우가 종종 있으니...

그 중, 유명한 4가지 제품들을 한번 정리해 보겠습니다. 
순서대로 ECS, EKS, Fargate 그리고 ECR 입니다.


ECS, EKS vs. EC2, Fargate

ECS, EKS 를 하나로 묶고 EC2, Fargate를 하나로 묶을 수 있습니다. 
ECS는 Elastic Container Service로 Container 기반의 컴퓨팅 플랫폼이라 보면 되고 
EKS는 Elastic Kubernetes Service로 Container 기반이지만 k8s가 환경이라 보면 됩니다. 

이 두가지가 컨테이너에 대한 오케스트레이션을 담당한다고 보면
EC2, Fargate는 ECS, EKS가 동작하는 호스팅에 대한 레이어를 담당하는 제품들입니다. 
즉, EC2와 Fargate 위에 ECS, EKS가 동작한다고 이해하면 됩니다.

한줄 요약 : EC2, Fargate는 컨테이너를 위한 컴퓨팅 리소스이다 

 

ECS vs. EKS

그렇다면 ECS와 EKS는 어떤 차이가 있을까요?
둘다 컨테이너 오케스트레이션 환경이라는 공통점을 갖고 있지만 
ECS는 AWS 에서만 제공되는 오케스트레이션 환경이라 타플랫폼으로의 이식성이 떨어지지만
EKS는 쿠버네티스 환경이라 플랫폼간 이전이 더 용이합니다. 

한줄 요약 : ECS는 AWS Only, EKS는 범용 k8s

 

EC2 vs. Fargate

EC2는 워낙 유명하니 다들 잘 아실겁니다. 
쉽게 생각해서 가상머신(VM)이라고 봐도 무방합니다. 
즉, 독립된 환경이 있고 운영체제를 갖고 있는 컴퓨팅 리소스입니다. 

반면 Fargate는 가상머신보다 더 추상화된 컴퓨팅 환경입니다. 
서버 없이 코드를 실행하는 람다 Lambda 를 서버리스 Serverless 라고 부르는 것처럼
Fargate는 EC2의 서버리스 버전이라고 생각할 수 있겠습니다. 
서버가 없는 컴퓨팅 환경이 Fargate 입니다

한줄 요약 : 독립된 운영체제가 있으면 EC2, 서버리스 컴퓨팅 환경은 Fargate

참고 : https://aws.amazon.com/ko/blogs/korea/how-to-choose-aws-container-services/

 

AWS에서 어떤 컨테이너 서비스를 이용해야 하나요? | Amazon Web Services

“AWS에서 어떤 컨테이너 서비스를 이용해야 하나요?”는 여러분들에게 가장 많이 받는 질문 중 하나입니다. AWS는 다양한 고객의 요구를 충족하고자, 광범위하고도 폭넓은 서비스를 제공하다 보

aws.amazon.com

 

Considerations

ECS와 EKS를 봤을때 느낌적 느낌으로 EKS가 비용이 더 나올것이라고 예상됩니다.
네, 정확히 그렇고 ECS가 비용적으로는 EKS 보다 저렴합니다. 
하지만 ECS는 k8s가 아니기 때문에 이야기 한 것처럼 이식성이 떨어집니다. 

어떤 플랫폼을 쓰던 비용을 계속 체크하면서 써야 하는 것이 퍼블릭 클라우드입니다. 
ECS, EKS, 그리고 EC2, Fargate...!
여러분의 선택은 무엇입니까? :-)

728x90
728x90

 

근래에 가장 각광받는 자격시험이 쿠버네티스 Kubenetes 관련된 자격증일 것 같습니다. 리눅스 파운데이션에서 주관하는 쿠버네티스 시험은 크게 3가지 종류인데요, 최근 모 조사기관에서 발표했던 내용에 따르면 모든 자격 시험들 중 CKA(Certified Kubenetes Administrator)에 대한 관심이 가장 많다고 합니다.

쿠버네티스 관련된 시험들은 생각보다 가격이 좀 있기 때문에 할인 쿠폰이 유통(?)될 때 미리 시험을 등록해 두는 것이 좋다고 합니다. 시험을 등록하면 목표 일정을 설정하는 효과가 있으니... k8s를 학습해 나가는데 좋은 모티베이션이 될 것이라고 생각됩니다. 시험 등록일 기준으로 1년간 리스케쥴링이 가능하고 무료 재시험도 한차례 제공되니 사실상 부담도 없을 것 같습니다.

 

375달러가 25% 할인이 되면...

 

281.25 달러가 되는군요!

 

이번에 유통되는 할인 코드는 SCHOOL25 입니다. 리눅스 파운데이션의 시험 등록 페이지에서 쿠폰 코드 Coupon Code 항목에 입력해 주시면 됩니다. 환율이 요즘 급격히 변화하고 있어서 전표 매입 타이밍에 따라 실제 비용은 좀 차이가 생기겠지만 1160원 기준으로 계산해 보면 33만원 정도인 것 같네요. 할인 받아도 싸지는 않은 느낌입니다 ㅎㅎ

여튼, 쿠버네티스 자격시험 준비하고 계신다면 이번 할인 쿠폰을 잘 활용해 보시기 바랍니다. 꾸준히(?) 할인 쿠폰이 나오니 Apply 를 눌러서 쿠폰 적용이 안된다면 한달 정도 여기저기 또 검색해 보시면 할인 쿠폰을 발견하실 수 있을거라 생각합니다. 마지막으로 개인적으로 추천드리는 k8s 강의 링크 하나 드려 봅니다. 강의도 할인 중이라 대략 16,000원 정도로 저렴하네요!

 

 

Certified Kubernetes Administrator (CKA) Practice Exam Tests

Prepare for the Certified Kubernetes Administrators Certification with live practice tests right in your browser - CKA

www.udemy.com

 

(추가. 2022.09)
참고로, 저 역시 위 강의를 듣고 2022년 9월 시험에 합격했습니다. 시험 합격 후기와 시험 꿀팁, 가상 시험 환경에 대한 이야기는 다음의 포스팅에서 간략하게 정리를 해보았습니다. 시험을 준비하고 계시다면 조금이나마 도움이 될 것 같습니다!

 

따끈따끈한 CKA(Certified Kubenetes Administrator) 2022 버전 자격 취득 후기(2022.09월)

참 오래걸렸습니다. 처음 CKA 자격증을 취득해 보자고 생각했던 것이 작년 이맘때이니 정확히 1년되는 시점에 자격증을 취득했습니다. 이걸 정확히 기억하는 이유가, 시험 응시를 계획하던 시점

ondemand.tistory.com

 

본 포스팅은 제휴마케팅을 통해 소정의 수수료를 지급 받을 수 있습니다

 

728x90
728x90

간혹 새로운 장비에서 Dockerfile 을 이용하여 이미지를 빌드해야 하는 경우가 생깁니다. 늘 사용하던 장비와 빌드하던 이미지라면 특별히 문제가 생기지 않지만 새로운 오픈소스 코드나 다른 사람이 만들어둔 Dockerfile을 생각 없이 새 장비에서 빌드하다보면 에러 메세지로 당황하기 마련입니다. 

오늘도 어김 없이 새 장비에서 Dockerfile을 이용한 이미지 빌드 실패건을 겪었는데요 미래의 저를 위해 간단하게 내용을 정리해 봅니다. 한줄 요약을 하자면 Docker의 버전이 낮아서 발생한 문제였습니다. 


새로운 오픈소스를 Docker 이미지로 빌드후 구동하기 위해 소스코드를 클론하고 make docker 명령으로 이미지 빌드를 시도했습니다. go로 개발된 프로메테우스 익스포터류의 코드였는데요 잠시 빌드가 진행되는 듯 하더니 FROM으로 지정된 이미지의 포맷이 잘못되었다는 에러 메세지와 함께 빌드가 실패했습니다. 

$ make docker
docker build -t "akamai/akamai-gtm-metrics-exporter-linux-amd64:master" \
        -f ./Dockerfile \
        --build-arg ARCH="amd64" \
        --build-arg OS="linux" \
        ./
Sending build context to Docker daemon 15.25 MB
Step 1/8 : FROM docker.io/golang:1.16.6 AS builder
Error parsing reference: "docker.io/golang:1.16.6 AS builder" is not a valid repository/tag: invalid reference format
make: *** [common-docker-amd64] Error 1

 

도커 이미지가 없어서 그런가 생각해봤지만 docker image 명령을 쳐보면 이미지가 정상적으로 로컬 환경에 저장되어 있는 것이 확인되었습니다. 이미지의 빌드 넘버가 없어서 그런가하여 도커 허브에 들어가 golang 태그를 찾아봐도 분명 존재하는 태그였습니다.

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
docker.io/golang                             1.16.6              028d102f774a        3 days ago          862 MB
docker.io/victoriametrics/victoria-metrics   latest              27ae96c3f0f7        2 weeks ago         23.5 MB
docker.io/prom/prometheus                    latest              9dfc442be98c        3 weeks ago         189 MB
docker.io/victoriametrics/vmagent            latest              4d8a8d15c6ec        4 weeks ago         20.4 MB
docker.io/prom/node-exporter                 latest              c19ae228f069        4 months ago        26 MB

 

문제는 도커의 버전이었습니다. 빌드하려던 Dockerfile의 내용을 꼼꼼히 살펴보지 않아 Dockerfile이 멀티 스테이지 빌드가 필요하다는 것을 미처 확인하지 못했던 것이죠. 멀티 스테이지 빌드는 경량 도커 이미지를 만들기 위한 방법으로 제공되는 빌드 방식이고 도커 17버전 이상에서 지원되는 것으로 확인됩니다. 도커를 새로운 버전으로 업데이트 하고 다시 빌드를 시도해 보았습니다.

 

 

Use multi-stage builds

 

docs.docker.com

 

// 설치된 버전 확인
$ docker --version
Docker version 1.13.1, build 7d71120/1.13.1

// 설치된 docker 삭제
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
// Community Edition 설치를 위한 repo 정보 추가
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

// 최신 버전의 docker 설치
$ sudo yum install docker-ce docker-ce-cli containerd.io

// docker daemon 구동
$ sudo systemctl start docker

// 설치된 버전 확인
$ docker --version
Docker version 20.10.7, build f0df350

// 이제 빌드가 잘 되네요!
$ make docker
docker build -t "akamai/akamai-gtm-metrics-exporter-linux-amd64:master" \
        -f ./Dockerfile \
        --build-arg ARCH="amd64" \
        --build-arg OS="linux" \
        ./
Sending build context to Docker daemon  15.25MB
Step 1/8 : FROM docker.io/golang:1.16.6 AS builder
1.16.6: Pulling from library/golang
Digest: sha256:4544ae57fc735d7e415603d194d9fb09589b8ad7acd4d66e928eabfb1ed85ff1
Status: Downloaded newer image for golang:1.16.6
 ---> 028d102f774a
Step 2/8 : WORKDIR /go/src/github.com/akamai/akamai-gtm-metrics-exporter
 ---> Running in dab4aaede8da
Removing intermediate container dab4aaede8da
...
..
...
Successfully built a005e3513fae
Successfully tagged akamai/akamai-gtm-metrics-exporter-linux-amd64:master

 

참 쉽죠!?

 

728x90

+ Recent posts