구성 파일로 시크릿(Secret) 관리하기

구성 파일로 시크릿(Secret) 관리하기 (Managing Secrets using Configuration File)

출처: 문서

본문

시작하기 전에

Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.

시크릿 생성

먼저 Secret 객체를 JSON 또는 YAML 형식으로 매니페스트에 정의한 다음, 그 객체를 만들 수 있어요. Secret 리소스는 datastringData라는 두 개의 맵을 포함해요. data 필드는 base64로 인코딩된 임의 데이터를 저장하는 데 사용돼요. stringData 필드는 편의를 위해 제공되며, 같은 데이터를 인코딩되지 않은 문자열로 제공하게 해줘요. datastringData의 키는 영숫자, -, _, .로 구성되어야 해요.

다음 예시는 data 필드를 사용해 Secret에 두 개의 문자열을 저장해요.

  • 문자열을 base64로 변환해요. Secret data의 직렬화된 JSON과 YAML 값은 base64 문자열로 인코딩된다는 점에 주의해요. 이 문자열 안에는 줄바꿈이 유효하지 않으므로 생략해야 해요. Darwin/macOS에서 base64 유틸리티를 사용할 때는 긴 줄을 나누는 -b 옵션을 피해야 해요. 반대로 Linux 사용자는 base64 명령에 -w 0 옵션을 추가하거나, -w 옵션을 사용할 수 없으면 base64 | tr -d '\n' 파이프라인을 사용해야 해요.
  • 매니페스트를 만들어요. Secret 객체의 이름은 유효한 DNS 서브도메인 이름이어야 한다는 점에 주의해요.
  • kubectl apply로 Secret을 만들어요.

Secret이 생성되었는지 확인하고 데이터를 디코딩하려면 kubectl로 시크릿 관리하기를 참고해요.

시크릿 생성 시 인코딩되지 않은 데이터 지정

특정 시나리오에서는 stringData 필드를 사용하고 싶을 수 있어요. 이 필드는 base64가 아닌 문자열을 Secret에 직접 넣게 해주고, Secret이 생성되거나 업데이트될 때 문자열이 대신 인코딩돼요.

실용적인 예시로, 구성 파일을 저장하는 Secret을 사용하는 애플리케이션을 배포하면서, 배포 과정에서 그 구성 파일의 일부를 채우고 싶은 경우를 들 수 있어요.

예를 들어 애플리케이션이 다음 구성 파일을 사용한다면:

apiUrl: "https://my.api.com/api/v1"
username: "<user>"
password: "<password>"

다음 정의로 이것을 Secret에 저장할 수 있어요.

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  config.yaml: |
    apiUrl: "https://my.api.com/api/v1"
    username: <user>
    password: <password>

Secret 데이터를 검색하면 명령은 stringData에서 제공한 평문 값이 아닌 인코딩된 값을 반환해요.

예를 들어 다음 명령을 실행하면:

kubectl get secret mysecret -o yaml

출력은 다음과 비슷해요.

apiVersion: v1
data:
  config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
kind: Secret
metadata:
  creationTimestamp: 2018-11-15T20:40:59Z
  name: mysecret
  namespace: default
  resourceVersion: "7225"
  uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque

data와 stringData 모두 지정

datastringData 둘 다에 필드를 지정하면 stringData의 값이 사용돼요.

예를 들어 다음 Secret을 정의한다면:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
stringData:
  username: administrator

Secret 객체는 다음과 같이 생성돼요.

apiVersion: v1
data:
  username: YWRtaW5pc3RyYXRvcg==
kind: Secret
metadata:
  creationTimestamp: 2018-11-15T20:46:46Z
  name: mysecret
  namespace: default
  resourceVersion: "7579"
  uid: 91460ecb-e917-11e8-98f2-025000000001
type: Opaque

YWRtaW5pc3RyYXRvcg==administrator로 디코딩돼요.

시크릿 편집

매니페스트로 만든 Secret의 데이터를 편집하려면, 매니페스트의 data 또는 stringData 필드를 수정하고 파일을 클러스터에 적용해요. 시크릿이 불변(immutable)이 아니라면 기존 Secret 객체를 편집할 수 있어요.

예를 들어 앞선 예시의 비밀번호를 birdsarentreal로 바꾸고 싶다면 다음을 수행해요.

  • 새 비밀번호 문자열을 인코딩해요.
  • data 필드를 새 비밀번호 문자열로 업데이트해요.
  • 매니페스트를 클러스터에 적용해요.

Kubernetes는 기존 Secret 객체를 업데이트해요. 자세히 말하면 kubectl 도구는 같은 이름의 기존 Secret 객체가 있음을 알아차려요. kubectl이 기존 객체를 가져오고, 변경을 계획하고, 변경된 Secret 객체를 클러스터 컨트롤 플레인에 제출해요.

대신 kubectl apply --server-side를 지정하면 kubectl은 Server Side Apply를 사용해요.

정리

만든 Secret을 삭제하려면:

kubectl delete secret mysecret

다음 단계

더 알아보기 (Learn more)