16일차_컨피그 객체, 스웜 볼륨

최지웅·2024년 12월 18일
0

인프라

목록 보기
20/31

13-2. 컨피그 객체를 이용한 설정값 관리

  • 도커 이미지에는 개발 환경 기준의 설정 기본값이 패키징되고, 테스트 환경에서는 환경 변수 값이 로컬 파일에서 읽은 값으로 오버라이드 되고, 운영 환경에서는 스웜의 비밀값과 컨피그 객체에서 제공된 설정 값이 적용된다.
  • 개발 조직에서 중요한 비밀값들은 어플리케이션 실행 환경과 분리된 보안 시스템에 저장되는데, 이를 어플리케이션에 전달할 수단으로 도커 스웜에서 컨피그 객체를 사용한다.
# 1. JSON파일을 기반으로 컨피그 객체 생성
docker config create todo-list-config ./todo-list/configs/config.json # 로컬의 JSON파일로 컨피그 객체를 생성

docker config ls # 컨피그 객체의 설정값 확인

docker config inspect --pretty todo-list-config # pretty 플래그를 이용해 컨피그 객체의 내용 확인
  • 컨피그 객체를 통해 성정 파일의 내용을 그대로 볼 수 있기 때문에 민감한 데이터를 보관하는 수단이 아니다.
  • 아래의 yml파일을 통해 어플리케이션 정의에서 컨피그 객체의 설정값을 도입하게 한다.(서비스는 컴포즈 파일에 지정된 컴포즈 객체를 사용)
# 2. 컴포즈 파일에 컨피그 객체 지정
services:
	todo-web:
    	image: diamol/ch06-todo-list
        ports:
        	- 8080:80
        configs: # 컨피그 객체의 내용이 target으로 옮겨진다.
        	- source: todo-list-config
              target: /app/config/config.json
#...

configs:
	todo-list-config:
    	external: true # 이미 config는 외부에 지정되어 있다. 즉, 여기서는 컴포즈 파일의 정의를 수행하고 위에서 실제로 가져오는 것
  • 아래의 코드로 yaml 파일을 배포에 애플리케이션을 업데이트 하자
# 3. 컨피그 객체가 지정된 컴포즈 파일을 애플리케이션에 반영
docker stack deploy -c ./todo-list/v3.yml todo # 수정된 정의에 따라 애플리케이션 배포

docker stack services todo # 스택에 포함된 서비스 목록 확인

13-3. 비밀값을 이용한 대외비 설정 정보 관리하기

  • 비밀값은 평소에는 클러스터 데이터베이스에 암호화돼 보관되다가 비밀값을 사용하는 컨테이너를 실행할 노드에 전달되어야만 복호화된다.
# 1. 로컬 파일의 내용으로 비밀값을 만들고 정보를 확인
docker secret create todo-list-secret ./todo-list/secrets/secrets.json # 로컬의 JSON파일로 비밀값을 생성

docker secret inspect --pretty todo-list-secret # 새로 만든 비밀값의 정보를 확인
  • 아래의 코드로 비밀값을 사용하는 버전의 어플리케이션 배포할 수 있다.
# 2. 비밀값과 컨피그 객체를 사용해 애플리케이션 설정 yml파일
services:
	todo-web:
    	image: diamol/ch06-todo-list
        ports:
        	- 8080:80
        configs:
        	- source: todo-list-config
              target: /app/config/config.json
        secrets: # 비밀값 가져오기
        	- source: todo-list-secret
              target: /app/config/secrets.json
 #...
 
 secrets: # 비밀값의 정의
 	todo-list-secret:
    	external: true
  • 애플리케이션 업데이트 코드는 이전 컨피그 파일과 같다. 새로이 배포 시, 스택의 모든 서비스가 업데이트 중이라고 상태를 표기하지만, 실제로는 정의가 수정된 서비스만 변경되고 있다.
docker stack deploy -c ./todo-list/v4.yml todo # 최신 버전의 애플리케이션 배포
docker stack ps todo # 스택에 포함된 레플리카 정보 확인
  • 컨피그 객체와 비밀값은 수정이 불가능하다. 수정을 위해서는 새로운 객체 혹은 비밀값을 기존과 "다른" 이름으로 만든 후 정의를 바꾸고 배포해야만한다.(로드할 때 경로를 기반으로 파일을 복사해 사용해서 그런듯)

13-4. 스웜에서 볼륨 사용하기

  • 앞서 볼륨은 외부 리소스를 컨테이너 파일으 일부처럼 사용할 수 잇는 기능이다. 애플리케이션 업데이트 시 컨테이너 교체가 진행되며 볼륨은 새 컨테이너로 자동 연결되며 데이터를 유지한다. 오케스트레이션 플랫폼에도 동일하지만 저장되는 방식의 차이가 있다.
  • 노드에 레이블을 부여하고 컴포즈 파일에서 해낭 노드에서만 래플리카를 실행하도록 강제해야만 기존 레플리카가 사용하던 로컬 볼륨에 접근할 수 있다.
# 1. 노드에 레이블 부여
docker node update --label-add storage=raid $(docker node ls -q) # 도커 노드들의 식별자를 찾아 label add한다. 


# 2. 스웜에서 실행하는 서비스에 볼륨 마운트 및 제약 사항 설정
services:
	todo-db:
    	image: diamol/postgres:11.5
        volumes:
        	- todo-db-data: /var/lib/postgresql/data # 볼륨 지정
        deploy:
       		placement:
            	constraints:
                	- node.labels.storage == raid # 노드의 레이블 저장소 지정
 
 #...
 volumns:
 	todo-db-data:
    	#이게 끝임. 스웜의 기본 볼륨 드라이버를 사용하여 로컬 디스크 볼륨들을 생성할거임
        
# 3. 로컬 볼륨 업데이트 배포
docker volume ls -q # 노드에 존재하는 모든 볼륨의 식별자 목록을 출력

docker stack deploy -c ./todo-list/v5.yml todo # 스택 업데이터

docker volume ls -q # 볼륨 목록 확인(레이블이 부여된 볼륨은 스택을 제거해도 삭제되지 않는다. 즉, 컨테이너 교체에도 이터가 안전하다)
  • 디스크를 데이터 캐시 정도로 사용하면 로컬 볼륨으로 충분하지만, 여러 노드에 걸쳐 상태를 공유해야하는 에플리케이션에는 적합하지 않다. 이런 경우엔 볼륨 드라이버에 플러그인 시스템을 저굥ㅇ하여 데이터 센터의 스토리지 장비를 분산 스토리지로 사용할 수 있게 설정해야한다.

13-5. 클러스터는 스택을 어떻게 관리하는가?

  • 스택은 도커 스웜의 클러스터가 관리하는 리소스의 모임을 의미했다. 서비스는 인그레스 네트워크를 통해 포트의 공개 여부가 관리되고, 스택은 서비스와 함께 생성되거나 업데이트 및 제거된다. 비밀값, 컨피그 객체, 네트워크는 외부에서 관리가 가능하며, 이들은 배포 전에 생성되어 스택으로 인해 서비스와 연결된다. 볼륨은 외부 혹은 스택이 관리하며 이름이 부여될 경우 스택 제거 후에도 유지된다.
  • 스택에는 서비스 간 의존 관계 정의 기능이 없기에 이미지에 헬스 체크와 디펜던시 체크를 포함시켜 애플리케이션에 일어나는 문제를 자기 수복해야한다.

꽤나 내용이 어렵네..

profile
이제 3학년..

0개의 댓글