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) 오브젝트를 정의하고, 그 다음 해당 오브젝트를 만든다. 이 시크릿 리소스에는 datastringData 의 두 가지 맵이 포함되어 있다. data 필드는 base64로 인코딩된 임의의 데이터를 기입하는 데 사용된다. stringData 필드는 편의를 위해 제공되며, 이를 사용해 같은 데이터를 인코딩되지 않은 문자열로 기입할 수 있다. datastringData은 영숫자, -, _ 그리고 .로 구성되어야 한다.

다음 예는 data 필드를 사용하여 시크릿에 두 개의 문자열을 저장한다.

  1. 문자열을 base64로 변환한다.

    echo -n 'admin' | base64
    echo -n '1f2d1e2e67df' | base64
    

출력은 다음과 유사하다.

YWRtaW4=
MWYyZDFlMmU2N2Rm
  1. 매니페스트를 생성한다.

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

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

  2. 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

datastringData 모두 명시

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

시크릿(Secret) 작성

매니페스트를 사용하여 생성한 시크릿의 데이터를 편집하려면, 매니페스트에서 datastringData 필드를 수정하고 해당 파일을 클러스터에 적용하면 된다. 그렇지 않은 경우 기존의 시크릿 오브젝트를 편집할 수 있다. 수정 불가능한(immutable).

예를 들어, 이전 예제에서 패스워드를 birdsarentreal로 변경하려면, 다음과 같이 수행한다.

  1. 새로운 암호 문자열을 인코딩한다.

    echo -n 'birdsarentreal' | base64
    

    출력은 다음과 같다.

    YmlyZHNhcmVudHJlYWw=
    
  2. 새 암호 문자열로 data 필드를 업데이트 한다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: YmlyZHNhcmVudHJlYWw=
    
  3. 클러스터에 매니페스트를 적용한다.

    kubectl apply -f ./secret.yaml
    

    출력은 다음과 같다.

    secret/mysecret configured
    

쿠버네티스는 기존 시크릿 오브젝트를 업데이트한다. 자세히 보면, kubectl 도구는 동일한 이름을 가진 기존 Secret 오브젝트가 있음을 알아낸다. kubectl은 기존의 오브젝트를 가져오고, 변경을 계획하며, 변경된 Secret 오브젝트를 클러스터 컨트롤 플레인에 제출한다.

kubectl apply --server-side를 지정한 경우, kubectl서버 사이드 어플라이를 대신 사용한다.

삭제

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

kubectl delete secret mysecret

다음 내용