Information in this document may be out of date
This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Managing Secrets using Configuration File
환경 설정 파일을 사용하여 시크릿을 관리
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
시크릿(Secret) 생성
먼저 매니페스트에 JSON 이나 YAML 형식으로 시크릿(Secret)
오브젝트를 정의하고,
그 다음 해당 오브젝트를 만든다. 이
시크릿
리소스에는 data
와 stringData
의 두 가지 맵이 포함되어 있다.
data
필드는 base64로 인코딩된 임의의 데이터를 기입하는 데 사용된다.
stringData
필드는 편의를 위해 제공되며, 이를 사용해 같은 데이터를 인코딩되지 않은 문자열로
기입할 수 있다.
data
및 stringData
은 영숫자,
-
, _
그리고 .
로 구성되어야 한다.
다음 예는 data
필드를 사용하여 시크릿에 두 개의 문자열을 저장한다.
문자열을 base64로 변환한다.
echo -n 'admin' | base64 echo -n '1f2d1e2e67df' | base64
참고:
시크릿 데이터의 직렬화된(serialized) JSON 및 YAML 값은 base64 문자열로 인코딩된다. 이러한 문자열에는 개행(newline)을 사용할 수 없으므로 생략해야 한다. Darwin/macOS에서base64
도구를 사용할 경우, 사용자는 긴 줄을 분할하는 -b
옵션을 사용해서는 안 된다. 반대로, 리눅스 사용자는 -w
옵션을 사용할 수 없는 경우 base64
명령어 또는 base64 | tr -d '\n'
파이프라인에 -w 0
옵션을 추가해야 한다.출력은 다음과 유사하다.
YWRtaW4=
MWYyZDFlMmU2N2Rm
매니페스트를 생성한다.
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
시크릿(Secret) 오브젝트의 이름은 유효한 DNS 서브도메인 이름이어야 한다.
kubectl apply
를 사용하여 시크릿(Secret) 생성하기kubectl apply -f ./secret.yaml
출력은 다음과 유사하다.
secret/mysecret created
시크릿(Secret) 생성과 시크릿(Secret) 데이터 디코딩을 확인하려면, kubectl을 사용한 시크릿 관리을 참조하자.
시크릿(Secret) 생성 시 인코딩되지 않은 데이터 명시
특정 시나리오의 경우 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>
시크릿(Secret) 데이터를 검색할 때, 검색 명령은 인코딩된 값을 반환하며,
stringData
에 기입한 일반 텍스트 값이 아닙니다.
예를 들어, 다음 명령을 실행한다면
kubectl apply -f ./secret.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
모두 명시
data
와 stringData
모두에 필드를 명시하면, 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
으로 디코딩된다.
시크릿(Secret) 작성
매니페스트를 사용하여 생성한 시크릿의 데이터를 편집하려면, 매니페스트에서 data
및 stringData
필드를 수정하고 해당 파일을 클러스터에 적용하면 된다.
그렇지 않은 경우 기존의 시크릿
오브젝트를 편집할 수 있다.
수정 불가능한(immutable).
예를 들어, 이전 예제에서 패스워드를 birdsarentreal
로 변경하려면,
다음과 같이 수행한다.
새로운 암호 문자열을 인코딩한다.
echo -n 'birdsarentreal' | base64
출력은 다음과 같다.
YmlyZHNhcmVudHJlYWw=
새 암호 문자열로
data
필드를 업데이트 한다.apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: YmlyZHNhcmVudHJlYWw=
클러스터에 매니페스트를 적용한다.
kubectl apply -f ./secret.yaml
출력은 다음과 같다.
secret/mysecret configured
쿠버네티스는 기존 시크릿
오브젝트를 업데이트한다. 자세히 보면, kubectl
도구는
동일한 이름을 가진 기존 Secret
오브젝트가 있음을 알아낸다.
kubectl
은 기존의 오브젝트를 가져오고, 변경을 계획하며,
변경된 Secret
오브젝트를 클러스터 컨트롤 플레인에 제출한다.
kubectl apply --server-side
를 지정한 경우, kubectl
은
서버 사이드 어플라이를 대신 사용한다.
삭제
생성한 시크릿을 삭제하려면 다음 명령을 실행한다.
kubectl delete secret mysecret
다음 내용
- 시크릿 개념에 대해 자세히 알아보기
- kubectl을 사용한 시크릿 관리하는 방법 알아보기
- kustomize를 사용하여 시크릿을 관리하는 방법 알아보기