# kustomize를 사용하여 시크릿(Secret) 관리

> kustomization.yaml 파일을 사용하여 시크릿 오브젝트 생성.

---

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

`kubectl`은 시크릿과 컨피그맵(ConfigMap)을 관리하기위해 [Kustomize를 이용한 쿠버네티스 오브젝트의 선언형 관리](/ko/docs/tasks/manage-kubernetes-objects/kustomization/)를
지원한다. Kustomize를 이용하여 *리소스 생성기*를 생성한다. 이는 `kubectl`을
사용하여 API 서버에 적용할 수 있는 시크릿을 생성한다.

## 시작하기 전에

<p>쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와
통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고
있지 않다면,
<a href="/ko/docs/tasks/tools/#minikube">minikube</a>를 사용해서 생성하거나
다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>


<!-- steps -->

## 시크릿 생성

`kustomization.yaml` 파일에 다른 기존 파일, `.env` 파일 및
리터럴(literal) 값들을 참조하는 `secretGenerator`를 정의하여 시크릿을 생성할 수 있다.
예를 들어 다음 명령어는 사용자 이름 `admin`과 비밀번호 `1f2d1e2e67df`
를 위해 Kustomization 파일을 생성한다.

### Kustomization 파일 생성

<ul class="nav nav-tabs" id="tabs-secret-data" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-secret-data-0" role="tab" aria-controls="tabs-secret-data-0" aria-selected="true">Literals</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-secret-data-1" role="tab" aria-controls="tabs-secret-data-1">Files</a></li>
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-secret-data-2" role="tab" aria-controls="tabs-secret-data-2">.env files</a></li></ul>

<div class="tab-content" id="tabs-secret-data-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-secret-data-0" role="tabpanel" aria-labelledby="tabs-secret-data-0-tab" tabindex="secret-data"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">secretGenerator</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">database-creds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">literals</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">username=admin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">password=1f2d1e2e67df</span><span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-secret-data-1" role="tabpanel" aria-labelledby="tabs-secret-data-1-tab" tabindex="secret-data"><ol>
<li>
<p>base64로 인코딩된 자격 증명의 값들을 파일에 저장한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s1">&#39;admin&#39;</span> &gt; ./username.txt
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s1">&#39;1f2d1e2e67df&#39;</span> &gt; ./password.txt
</span></span></code></pre></div><p><code>-n</code> 플래그는 파일의 끝에 개행 문자가 존재하지 않는 것을
보장한다.</p>
</li>
<li>
<p><code>kustomization.yaml</code> 파일 생성:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">secretGenerator</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">database-creds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">username.txt</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">password.txt</span><span class="w">
</span></span></span></code></pre></div></li>
</ol>
</div><div class="tab-body tab-pane fade"
        id="tabs-secret-data-2" role="tabpanel" aria-labelledby="tabs-secret-data-2-tab" tabindex="secret-data"><p><code>kustomization.yaml</code> 파일에 <code>.env</code> 파일을 명시하여 시크릿 생성자를
정의할 수도 있다. 예를 들어 다음 <code>kustomization.yaml</code> 파일은
<code>.env.secret</code> 파일에서 데이터를 가져온다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">secretGenerator</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">db-user-pass</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">envs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">.env.secret</span><span class="w">
</span></span></span></code></pre></div></div></div>


모든 경우에 대해, 값을 base64로 인코딩하지 않아도 된다. YAML 파일의 이름은
**무조건** `kustomization.yaml` 또는 `kustomization.yml` 이어야 한다.

### kustomization 파일 적용

시크릿을 생성하기 위해서 kustomization 파일을 포함하는 디렉토리에 적용한다.

```shell
kubectl apply -k <directory-path>
```

출력은 다음과 유사하다.

```
secret/database-creds-5hdh7hhgfk created
```

시크릿이 생성되면 시크릿 데이터를 해싱하고
이름에 해시 값을 추가하여 시크릿 이름이 생성된다. 이렇게 함으로써
데이터가 수정될 때마다 시크릿이 새롭게 생성된다.

시크릿이 생성되었는지 확인하고 시크릿 데이터를 디코딩하려면, 다음을 참조한다.
[kubectl을 사용한 시크릿 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-kubectl/#verify-the-secret).

## 시크릿 편집 {#edit-secret}

1.  `kustomization.yaml` 파일에서 `password`와 같은 데이터를 수정한다.
1.  kustomization 파일을 포함하는 디렉토리에 적용한다:

    ```shell
    kubectl apply -k <directory-path>
    ```

    출력은 다음과 유사하다.

    ```
    secret/db-user-pass-6f24b56cc8 created
    ```

편집된 시크릿은 존재하는 `Secret` 오브젝트를 업데이트하는 것이 아니라
새로운 `Secret` 오브젝트로 생성된다. 따라서 파드에서 시크릿에 대한 참조를
업데이트해야 한다.

## 삭제

시크릿을 삭제하려면 `kubectl`을 사용한다.

```shell
kubectl delete secret db-user-pass
```

## 다음 내용

- [시크릿 개념](/ko/docs/concepts/configuration/secret/)에 대해 자세히 알아보기
- [kubectl을 사용한 시크릿 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-kubectl/) 방법 알아보기
- [환경 설정 파일을 사용한 시크릿 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-config-file/) 방법 알아보기
