1 - kubectl을 사용한 시크릿(Secret) 관리
이 페이지는 kubectl
커맨드라인 툴을 이용하여 쿠버네티스
시크릿을
생성, 편집, 관리, 삭제하는 방법을 보여준다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
시크릿 생성
시크릿
오브젝트는 파드가 서비스에 접근하기 위해 사용하는 자격 증명과 같은
민감한 데이터를 저장한다. 예를 들어 데이터베이스에 접근하는데 필요한 사용자 이름과 비밀번호를
저장하기 위해서 시크릿이 필요할 수 있다.
명령어를 통해 원시 데이터를 바로 보내거나, 파일에 자격 증명을 저장하고 명령어로 전달하는 방식으로
시크릿을 생성할 수 있다. 다음 명령어는 사용자 이름을 admin
으로
비밀번호는 S!B\*d$zDsb=
으로 저장하는 시크릿을 생성한다.
원시 데이터 사용
다음 명령어를 실행한다.
kubectl create secret generic db-user-pass \
--from-literal=username=admin \
--from-literal=password='S!B\*d$zDsb='
문자열에서 $
, \
, *
, =
및 !
과 같은 특수 문자를 이스케이프(escape)하기
위해서는 작은따옴표 ''
를 사용해야 한다. 그렇지 않으면 셸은 이런 문자들을
해석한다.
소스 파일 사용
-
base64로 인코딩된 자격 증명의 값들을 파일에 저장한다.
echo -n 'admin' | base64 > ./username.txt echo -n 'S!B\*d$zDsb=' | base64 > ./password.txt
-n
플래그는 생성된 파일이 텍스트 끝에 추가적인 개행 문자를 갖지 않도록 보장한다. 이는kubectl
이 파일을 읽고 내용을 base64 문자열로 인코딩할 때 개행 문자도 함께 인코딩될 수 있기 때문에 중요하다. 파일에 포함된 문자열에서 특수 문자를 이스케이프 할 필요는 없다. -
kubectl
명령어에 파일 경로를 전달한다.kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txt
기본 키 이름은 파일 이름이다. 선택적으로
--from-file=[key=]source
를 사용하여 키 이름을 설정할 수 있다. 예제:kubectl create secret generic db-user-pass \ --from-file=username=./username.txt \ --from-file=password=./password.txt
두 방법 모두 출력은 다음과 유사하다.
secret/db-user-pass created
시크릿 확인
시크릿이 생성되었는지 확인한다.
kubectl get secrets
출력은 다음과 유사하다.
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
시크릿의 상세 사항을 보자.
kubectl describe secret db-user-pass
출력은 다음과 유사하다.
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
kubectl get
및 kubectl describe
명령은
기본적으로 시크릿
의 내용을 표시하지 않는다. 이는 시크릿
이 실수로 노출되거나
터미널 로그에 저장되는 것을 방지하기 위한 것이다.
시크릿 디코딩
-
생성한 시크릿을 보려면 다음 명령을 실행한다.
kubectl get secret db-user-pass -o jsonpath='{.data}'
출력은 다음과 유사하다.
{ "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" }
-
password
데이터를 디코딩한다.echo 'UyFCXCpkJHpEc2I9' | base64 --decode
출력은 다음과 유사하다.
S!B\*d$zDsb=
주의: 이 예시는 문서화를 위한 것이다. 실제로, 이 방법은 인코딩된 데이터가 포함된 명령어를 셸 히스토리에 남기게 되는 문제를 야기할 수 있다. 당신의 컴퓨터에 접근할 수 있는 사람은 누구나 그 명령어를 찾아 그 비밀 정보를 디코드할 수 있다. 더 나은 접근법은 시크릿을 보는 명령어와 디코드하는 명령어를 조합하여 사용하는 것이다.kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
시크릿 편집
존재하는 시크릿
오브젝트가 수정 불가능한(immutable)이
아니라면 편집할 수 있다. 시크릿을 편집하기 위해서
다음 명령어를 실행한다.
kubectl edit secrets <secret-name>
이 명령어는 기본 편집기를 열고 다음 예시와 같이 data
필드의 base64로 인코딩된
시크릿의 값들을 업데이트할 수 있도록 허용한다.
# 아래 오브젝트를 편집하길 바란다. '#'로 시작하는 줄은 무시될 것이고,
# 빈 파일은 편집을 중단시킬 것이다. 이 파일을 저장하는 동안 오류가 발생한다면
# 이 파일은 관련된 오류와 함께 다시 열린다.
#
apiVersion: v1
data:
password: UyFCXCpkJHpEc2I9
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-06-28T17:44:13Z"
name: db-user-pass
namespace: default
resourceVersion: "12708504"
uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque
삭제
시크릿을 삭제하기 위해서 다음 명령어를 실행한다.
kubectl delete secret db-user-pass
다음 내용
- 시크릿 개념에 대해 자세히 알아보기
- 환경 설정 파일을 사용하여 시크릿을 관리하는 방법 알아보기
- kustomize를 사용하여 시크릿을 관리하는 방법 알아보기
2 - 환경 설정 파일을 사용하여 시크릿을 관리
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
시크릿(Secret) 생성
먼저 매니페스트에 JSON 이나 YAML 형식으로 시크릿(Secret)
오브젝트를 정의하고,
그 다음 해당 오브젝트를 만든다. 이
시크릿
리소스에는 data
와 stringData
의 두 가지 맵이 포함되어 있다.
data
필드는 base64로 인코딩된 임의의 데이터를 기입하는 데 사용된다.
stringData
필드는 편의를 위해 제공되며, 이를 사용해 같은 데이터를 인코딩되지 않은 문자열로
기입할 수 있다.
data
및 stringData
은 영숫자,
-
, _
그리고 .
로 구성되어야 한다.
다음 예는 data
필드를 사용하여 시크릿에 두 개의 문자열을 저장한다.
-
문자열을 base64로 변환한다.
echo -n 'admin' | base64 echo -n '1f2d1e2e67df' | base64
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를 사용하여 시크릿을 관리하는 방법 알아보기
3 - kustomize를 사용하여 시크릿(Secret) 관리
kubectl
은 시크릿과 컨피그맵(ConfigMap)을 관리하기위해 Kustomize를 이용한 쿠버네티스 오브젝트의 선언형 관리를
지원한다. Kustomize를 이용하여 리소스 생성기를 생성한다. 이는 kubectl
을
사용하여 API 서버에 적용할 수 있는 시크릿을 생성한다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
시크릿 생성
kustomization.yaml
파일에 다른 기존 파일, .env
파일 및
리터럴(literal) 값들을 참조하는 secretGenerator
를 정의하여 시크릿을 생성할 수 있다.
예를 들어 다음 명령어는 사용자 이름 admin
과 비밀번호 1f2d1e2e67df
를 위해 Kustomization 파일을 생성한다.
Kustomization 파일 생성
secretGenerator:
- name: database-creds
literals:
- username=admin
- password=1f2d1e2e67df
-
base64로 인코딩된 자격 증명의 값들을 파일에 저장한다.
echo -n 'admin' > ./username.txt echo -n '1f2d1e2e67df' > ./password.txt
-n
플래그는 파일의 끝에 개행 문자가 존재하지 않는 것을 보장한다. -
kustomization.yaml
파일 생성:secretGenerator: - name: database-creds files: - username.txt - password.txt
kustomization.yaml
파일에 .env
파일을 명시하여 시크릿 생성자를
정의할 수도 있다. 예를 들어 다음 kustomization.yaml
파일은
.env.secret
파일에서 데이터를 가져온다.
secretGenerator:
- name: db-user-pass
envs:
- .env.secret
모든 경우에 대해, 값을 base64로 인코딩하지 않아도 된다. YAML 파일의 이름은
무조건 kustomization.yaml
또는 kustomization.yml
이어야 한다.
kustomization 파일 적용
시크릿을 생성하기 위해서 kustomization 파일을 포함하는 디렉토리에 적용한다.
kubectl apply -k <directory-path>
출력은 다음과 유사하다.
secret/database-creds-5hdh7hhgfk created
시크릿이 생성되면 시크릿 데이터를 해싱하고 이름에 해시 값을 추가하여 시크릿 이름이 생성된다. 이렇게 함으로써 데이터가 수정될 때마다 시크릿이 새롭게 생성된다.
시크릿이 생성되었는지 확인하고 시크릿 데이터를 디코딩하려면, 다음을 참조한다. kubectl을 사용한 시크릿 관리.
시크릿 편집
-
kustomization.yaml
파일에서password
와 같은 데이터를 수정한다. -
kustomization 파일을 포함하는 디렉토리에 적용한다:
kubectl apply -k <directory-path>
출력은 다음과 유사하다.
secret/db-user-pass-6f24b56cc8 created
편집된 시크릿은 존재하는 Secret
오브젝트를 업데이트하는 것이 아니라
새로운 Secret
오브젝트로 생성된다. 따라서 파드에서 시크릿에 대한 참조를
업데이트해야 한다.
삭제
시크릿을 삭제하려면 kubectl
을 사용한다.
kubectl delete secret db-user-pass
다음 내용
- 시크릿 개념에 대해 자세히 알아보기
- kubectl을 사용한 시크릿 관리 방법 알아보기
- 환경 설정 파일을 사용한 시크릿 관리 방법 알아보기