kubectl로 Secret 관리하기

kubectl로 Secret 관리하기

이 페이지에서는 kubectl 명령줄 도구로 쿠버네티스 Secret을 만들고, 편집하고, 관리하고, 삭제하는 방법을 보여줘요.

출처: 문서

본문

시작하기 전에

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 설정돼 있어야 해요.

Secret 만들기

Secret 오브젝트는 파드가 서비스에 접근할 때 사용하는 자격 증명 같은 민감한 데이터를 저장해요. 예를 들어 데이터베이스에 접근하는 데 필요한 사용자 이름과 비밀번호를 저장할 Secret이 필요할 수 있습니다.

명령에 원시 데이터를 전달하거나, 명령에 전달할 파일에 자격 증명을 저장해 Secret을 만들 수 있어요. 다음 명령들은 사용자 이름 admin과 비밀번호 S!B\*d$zDsb=를 저장하는 Secret을 만듭니다.

원시 데이터 사용

다음 명령을 실행해요:

kubectl create secret generic db-user-pass \
    --from-literal=username=admin \
    --from-literal=password='S!B\*d$zDsb='

문자열에서 $, \, *, =, ! 같은 특수 문자를 이스케이프하려면 작은따옴표 ''를 사용해야 해요. 그러지 않으면 셸이 이 문자들을 해석합니다.

Secret의 stringData 필드는 서버 사이드 apply와 잘 맞지 않아요.

소스 파일 사용

  1. 자격 증명을 파일에 저장한다:

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    

    -n 플래그는 생성된 파일의 텍스트 끝에 추가 개행 문자가 없게 보장합니다. kubectl이 파일을 읽어 내용을 base64 문자열로 인코딩할 때 추가 개행 문자도 인코딩되기 때문에 중요해요. 파일에 포함하는 문자열에서 특수 문자를 이스케이프할 필요는 없어요.

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

Secret 확인하기

Secret이 만들어졌는지 확인해요:

kubectl get secrets

출력은 다음과 비슷합니다:

NAME              TYPE       DATA      AGE
db-user-pass      Opaque     2         51s

Secret의 세부 사항을 확인해요:

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 getkubectl describe 명령은 기본적으로 Secret의 내용을 보여주지 않아요. 이는 Secret이 실수로 노출되거나 터미널 로그에 저장되는 것을 보호하기 위해서입니다.

Secret 디코딩하기

  1. 만든 Secret의 내용을 확인한다:

    kubectl get secret db-user-pass -o jsonpath='{.data}'
    

    출력은 다음과 비슷합니다:

    { "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" }
    
  2. password 데이터를 디코딩한다:

    echo 'UyFCXCpkJHpEc2I9' | base64 --decode
    

    출력은 다음과 비슷합니다:

    S!B\*d$zDsb=
    

    이는 문서용 예시입니다. 실제로는 이 방법이 인코딩된 데이터가 있는 명령을 셸 히스토리에 저장하게 할 수 있어요. 컴퓨터에 접근할 수 있는 사람이라면 그 명령을 찾아 secret을 디코딩할 수 있습니다. 더 나은 방법은 보기와 디코딩 명령을 결합하는 거예요.

    kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
    

Secret 편집하기

기존 Secret 오브젝트는 불변(immutable)이 아니라면 편집할 수 있어요. Secret을 편집하려면 다음 명령을 실행해요:

kubectl edit secrets <secret-name>

이 명령은 기본 편집기를 열고 다음 예시처럼 data 필드에서 base64로 인코딩된 Secret 값을 업데이트할 수 있게 해줍니다:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file, it will be
# reopened with the relevant failures.
#
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

정리하기

Secret을 삭제하려면 다음 명령을 실행해요:

kubectl delete secret db-user-pass

더 알아보기 (Learn more)