해당 문서의 쿠버네티스 버전: v1.21

Kubernetes v1.21 문서는 더 이상 적극적으로 관리되지 않음. 현재 보고있는 문서는 정적 스냅샷임. 최신 문서를 위해서는, 다음을 참고. 최신 버전.

환경 설정 파일을 사용하여 시크릿을 관리

환경 설정 파일을 사용하여 시크릿 오브젝트를 생성.

시작하기 전에

쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.

환경 설정 파일 생성

먼저 새 파일에 JSON 이나 YAML 형식으로 시크릿(Secret)에 대한 상세 사항을 기록하고, 이 파일을 이용하여 해당 시크릿 오브젝트를 생성할 수 있다. 이 시크릿 리소스에는 datastringData 의 두 가지 맵이 포함되어 있다. data 필드는 base64로 인코딩된 임의의 데이터를 기입하는 데 사용된다. stringData 필드는 편의를 위해 제공되며, 이를 사용해 시크릿 데이터를 인코딩되지 않은 문자열로 기입할 수 있다. datastringData은 영숫자, -, _ 그리고 .로 구성되어야 한다.

예를 들어 시크릿에 data 필드를 사용하여 두 개의 문자열을 저장하려면 다음과 같이 문자열을 base64로 변환한다.

echo -n 'admin' | base64

출력은 다음과 유사하다.

YWRtaW4=
echo -n '1f2d1e2e67df' | base64

출력은 다음과 유사하다.

MWYyZDFlMmU2N2Rm

다음과 같이 시크릿 구성 파일을 작성한다.

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

시크릿 오브젝트의 이름은 유효한 DNS 서브도메인 이름이어야 한다.

참고: 시크릿 데이터의 직렬화된(serialized) JSON 및 YAML 값은 base64 문자열로 인코딩된다. 이러한 문자열에는 개행(newline)을 사용할 수 없으므로 생략해야 한다. Darwin/macOS에서 base64 도구를 사용할 경우, 사용자는 긴 줄을 분할하는 -b 옵션을 사용해서는 안 된다. 반대로, 리눅스 사용자는 -w 옵션을 사용할 수 없는 경우 base64 명령어 또는 base64 | tr -d '\n' 파이프라인에 -w 0 옵션을 추가해야 한다.

특정 시나리오의 경우 stringData 필드를 대신 사용할 수 있다. 이 필드를 사용하면 base64로 인코딩되지 않은 문자열을 시크릿에 직접 넣을 수 있으며, 시크릿이 생성되거나 업데이트될 때 문자열이 인코딩된다.

이에 대한 실제적인 예로, 시크릿을 사용하여 구성 파일을 저장하는 애플리케이션을 배포하면서, 배포 프로세스 중에 해당 구성 파일의 일부를 채우려는 경우를 들 수 있다.

예를 들어 애플리케이션에서 다음 구성 파일을 사용하는 경우:

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

다음 정의를 사용하여 이를 시크릿에 저장할 수 있다.

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

시크릿 오브젝트 생성

kubectl apply를 이용하여 시크릿 오브젝트를 생성한다.

kubectl apply -f ./secret.yaml

출력은 다음과 유사하다.

secret/mysecret created

시크릿 확인

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

kubectl getkubectl describe 명령은 기본적으로 시크릿의 내용을 표시하지 않는다. 이는 시크릿이 실수로 구경꾼에게 노출되거나 터미널 로그에 저장되는 것을 방지하기 위한 것이다. 인코딩된 데이터의 실제 내용을 확인하려면 다음을 참조한다. 시크릿 디코딩.

하나의 필드(예: username)가 datastringData에 모두 명시되면, stringData에 명시된 값이 사용된다. 예를 들어 다음과 같은 시크릿인 경우:

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

결과는 다음과 같은 시크릿이다.

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으로 디코딩된다.

삭제

생성한 시크릿을 삭제하려면 다음 명령을 실행한다.

kubectl delete secret mysecret

다음 내용

최종 수정 July 20, 2021 at 9:36 AM PST : Translate /docs/tasks/configmap-secret/ into Korean (59b4b7f49)