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

비밀값 * 비밀값은 컨피그 객체와 비슷한 점이 많다. * 로컬 파일로부터 생성한 후, 클러스터 데이터베이스에 저장했다가 서비스 정의에서 비밀값을 참조하면 실행된 컨테이너의 파일 시스템에 비밀값의 값이 전달된다. * 비밀값이 컨피그 객체와 가장 크게 다른 점은 비밀값을 사용하는 워크플로 중 비밀값이 컨테이너에 전달된 상태에서만 복호화된 비밀값을 볼 수 있다는 것이다. * 평소에는 클러스터 데이터베이스에 암호화돼 보관되다가 해당 비밀값을 사용하는 컨테이너를 실행할 노드로만 전달된다. * 매니저 노드에서 워커 노드로 전달되는 중에도 여전히 암호화된 상태를 유지하며 사용할 컨테이너 안에서만 복호화된다.

실습 로컬 파일의 내용으로 비밀값을 만들고, 새로 만든 비밀값의 정보를 확인해 보자.

001)  cd ch13/exercises
002) 
003) # 로컬에 위치한 JSON 파일의 내용으로 비밀값을 생성한다.
004)  docker secret create todo-list-secret ./todo-list/secrets/secrets.json 
005) x7icdhr2583s2vbat80ro38ml
006) 
007) # 새로 만든 비밀값의 정보를 확인한다.
008) # pretty 플래그를 적용하면 데이터를 볼 수 있다.
009)  docker secret inspect --pretty todo-list-secret
010) ID:              x7icdhr2583s2vbat80ro38ml
011) Name:              todo-list-secret
012) Driver:            
013) Created at:        2023-07-22 08:38:18.938932083 +0000 utc
014) Updated at:        2023-07-22 08:38:18.938932083 +0000 utc
  1. 004: 비밀값은 스웜 데이터베이스에 암호화돼 저장되며 매니저 노드에서 다른 노드로 전달될 때도 암호화된 채로 전달된다.
  2. 009~014: 비밀값의 정보를 확인해 봐도 원래 내용을 알 수 없다. 원래 내용은 비밀값을 실제 사용하는 컨테이너 안에서만 볼 수 있다.

  3. 이제 비밀값이 스웜에 저장됐으니 이 비밀값을 사용하는 새로운 버전의 애플리케이션을 배포할 수 있다.

  4. 컴포즈 파일에서 비밀값을 참조하는 문법 역시 컴피그 객체와 매우 유사하다.
  5. 원본이 되는 비밀값과 비밀값의 내용이 들어갈 대상 파일의 경로를 지정하면 된다.

예제 13-4 비밀값과 컨피그 객체를 사용해 애플리케이션 설정하기

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

실습 이전 버전에서 빠져 있었던 데이터베이스 접속 문자열이 추가된 최신 버전의 애플리케이션을 배포해 애플리케이션을 정상 상태로 되돌린다. 이 과정에서 서비스가 업데이트된다.

001) # 최신 버전의 애플리케이션을 배포한다.
002)  docker stack deploy -c ./todo-list/v4.yml todo
003) Updating service todo_todo-db (id: 1dku4wwx3m8fi1zdh5b0l03lb)
004) Updating service todo_todo-web (id: kvr2ij57ccj7zz424af8kmi6v)
005) 
006) # 스택에 포함된 레플리카의 정보를 확인한다.
007)  docker stack ps todo
008) ID             NAME                  IMAGE                          NODE             DESIRED STATE   CURRENT STATE             ERROR     PORTS
009) vc1nf84echce   todo_todo-db.1        diamol/postgres:11.5           docker-desktop   Running         Running 3 hours ago                 
010) 42dtj3a8inh4   todo_todo-web.1       diamol/ch06-todo-list:latest   docker-desktop   Running         Running 12 seconds ago              
011) m9ouwn6e13k3    \_ todo_todo-web.1   diamol/ch06-todo-list:latest   docker-desktop   Shutdown        Shutdown 13 seconds ago             
  1. 002~004: 도커 명령행 도구로 스택을 업데이트할 때 스택에 포함된 모든 서비스가 업데이트 중이라고 나오지만, 사실 정의가 수정되지 않은 서비스는 변경되지 않는다.
  2. 009~011: 데이터베이스 서비스는 처음 만들어진 레플리카로 동작 중인 반면에 웹 서비스는 종료된 이전 레플리카, 비밀값과 컨피그 객체로 설정된 새로운 레플리카를 볼 수 있다.

  3. 여기서 꼭 알아 둘 점은 컨피그 객체와 비밀값은 수정이 불가하다는 것이다.

  4. 클러스터에서 컨피그 객체와 비밀값을 한번 만들고 나면 이들의 내용은 변하지 않는다.
  5. 만약 내용을 변경할 필요가 생긴다면 새로운 컨피그 객체나 비밀값을 만들어야 한다.
  6. 이를 위해서는 다음 세 단계를 거친다.
  7. 변경된 내용을 담은 새로운 컨피그 객체 혹은 비밀값을 기존의 것과 다른 이름으로 만든다.
  8. 컴포즈 파일의 정의에 사용된 컨피그 객체 혹은 비밀값의 이름을 새로 만든 이름으로 바꾼다.
  9. 변경된 컴포즈 파일로 스택을 배포한다.
  10. 결국 설정값을 수정하려면 서비스를 업데이트해야 한다.

links

social