시크릿
시크릿 (Secrets)
Secret은 사용자 이름·비밀번호 같은 민감한 정보를 저장하기 위한 객체예요. 이런 정보를 그대로 두면 Pod 스펙이나 컨테이너 이미지에 넣게 될 수도 있는데, Secret을 쓰면 기밀 데이터를 파드 정의에 포함시키지 않아도 되죠.
Secret의 유형 (Types of Secret)
| 내장 유형 (Built-in Type) | 용도 (Usage) |
|---|---|
Opaque |
임의의 사용자 정의 데이터 |
kubernetes.io/service-account-token |
ServiceAccount 토큰 |
kubernetes.io/dockercfg |
직렬화된 ~/.dockercfg 파일 |
kubernetes.io/basic-auth |
기본 인증용 자격 증명 |
ServiceAccount 토큰 Secret
참고:
apiVersion : v1 kind : Secret metadata : name : secret-sa-sample annotations : kubernetes.io/service-account.name : "sa-name" type : kubernetes.io/service-account-token data : extra : YmFyCg==Secret을 만든 후, Kubernetes가
data필드의token키를 채울 때까지 기다려요.
Docker config Secret
kubernetes.io/dockercfg: Docker 명령줄을 구성하는 레거시 형식인 직렬화된~/.dockercfg를 저장해요. Secret의data필드에는 base64로 인코딩된~/.dockercfg파일 내용을 값으로 갖는.dockercfg키가 들어가요.kubernetes.io/dockerconfigjson:~/.docker/config.json파일과 같은 형식 규칙을 따르는 직렬화된 JSON을 저장해요. 이는~/.dockercfg의 새로운 형식이에요. Secret의data필드에는 base64로 인코딩된~/.docker/config.json파일 내용을 값으로 갖는.dockerconfigjson키가 반드시 들어 있어야 해요.
다음은 kubernetes.io/dockercfg 유형의 Secret 예시예요:
apiVersion : v1
kind : Secret
metadata :
name : secret-dockercfg
type : kubernetes.io/dockercfg
data :
.dockercfg : |
eyJhdXRocyI6eyJodHRwczovL2V4YW1wbGUvdjEvIjp7ImF1dGgiOiJvcGVuc2VzYW1lIn19fQo=
참고: 새 Secret에서
.data.dockerconfigjson필드를 가져와 데이터를 디코딩해요:kubectl get secret secret-tiger-docker -o jsonpath = '{.data.*}' | base64 -d출력은 다음 JSON 문서와 동일해요(이것도 유효한 Docker 구성 파일이에요).
기본 인증 Secret (Basic authentication Secret)
kubernetes.io/basic-auth 유형은 기본 인증에 필요한 자격 증명을 저장하기 위해 제공돼요. 이 Secret 유형을 사용할 때 Secret의 data 필드는 다음 두 키 중 하나를 반드시 포함해야 해요:
username: 인증용 사용자 이름password: 인증용 비밀번호 또는 토큰
apiVersion : v1
kind : Secret
metadata :
name : secret-basic-auth
type : kubernetes.io/basic-auth
stringData :
username : admin # required field for kubernetes.io/basic-auth
password : t0p-Secret # required field for kubernetes.io/basic-auth
SSH 인증 Secret
내장 유형 kubernetes.io/ssh-auth는 SSH 인증에 사용되는 데이터를 저장하기 위해 제공돼요. 이 Secret 유형을 사용할 때 data(또는 stringData) 필드에 ssh-privatekey 키-값 쌍을 SSH 자격 증명으로 지정해야 해요.
TLS Secret
kubernetes.io/tls Secret 유형은 일반적으로 TLS에 사용되는 인증서와 그에 연결된 키를 저장하기 위한 것이에요.
stringData를 쓰는 대안으로 data 필드를 사용해 base64로 인코딩된 인증서와 개인 키를 제공할 수도 있어요. 자세한 내용은 Constraints on Secret names and data를 참고하세요. 다음 YAML은 TLS Secret의 예시 구성이에요.
부트스트랩 토큰 Secret (Bootstrap token Secrets)
apiVersion : v1
kind : Secret
metadata :
name : bootstrap-token-5emitj
namespace : kube-system
type : bootstrap.kubernetes.io/token
data :
auth-extra-groups : c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
expiration : MjAyMC0wOS0xM1QwNDozOToxMFo=
token-id : NWVtaXRq
token-secret : a3E0Z2lo
Secret 다루기 (Working with Secrets)
Secret 생성하기
Secret 이름과 데이터의 제약
Secret의 구성 파일을 만들 때 data 및/또는 stringData 필드를 지정할 수 있어요. data와 stringData 필드는 선택 사항이에요. data 필드의 모든 키 값은 base64로 인코딩된 문자열이어야 해요.
파드에서 Secret을 파일로 사용하기
참고:
kubelet은 해당 노드의 파드가 볼륨에 사용하는 Secret들의 현재 키·값 캐시를 유지해요.kubelet이 캐시된 값에서 변경 사항을 감지하는 방식을 구성할 수 있어요.kubelet구성의configMapAndSecretChangeDetectionStrategy필드가 어떤 전략을 쓸지 제어해요.
컨테이너 이미지 풀 Secret (Container image pull Secrets)
사설 레지스트리에서 컨테이너 이미지를 가져오려면 각 노드의 kubelet이 그 레지스트리에 인증할 방법이 필요해요. 이를 위해 이미지 풀 Secret(image pull Secrets) 을 구성할 수 있어요. 이 Secret들은 파드 레벨에서 구성돼요.
imagePullSecrets 사용하기
imagePullSecrets 필드는 같은 네임스페이스 안의 Secret들에 대한 참조 목록이에요. imagePullSecrets를 사용하면 Docker(또는 다른) 이미지 레지스트리 비밀번호를 담은 Secret을 kubelet에게 전달할 수 있어요. kubelet은 이 정보를 이용해 파드를 대신해 사설 이미지를 가져와요.
imagePullSecret을 수동으로 지정하기
어떻게 imagePullSecrets를 지정하는지는 컨테이너 이미지 문서에서 배울 수 있어요.
imagePullSecrets를 자동으로 첨부하도록 구성하기
imagePullSecrets를 직접 만들고 이것을 ServiceAccount에서 참조할 수 있어요. 그 ServiceAccount로 생성된 파드(또는 기본적으로 그 ServiceAccount를 쓰는 파드)는 자동으로 imagePullSecrets 필드가 해당 서비스 계정의 것으로 설정돼요.
불변 Secret (Immutable Secrets)
기능 상태: Kubernetes v1.21 [stable]
Kubernetes는 특정 Secret(그리고 ConfigMap)을 불변(immutable) 으로 표시할 수 있게 해 줘요. 기존 Secret의 데이터 변경을 막으면 다음과 같은 이점이 있어요.