Secret 이해에서 설명한 시크릿의 종류 중에 TLS, Docker 레지스트리, Basic, SSH 시크릿을 생성하는 방법을 알본다.
1. TLS
인그레스 등에서 사용하는 TLS 인증서를 시크릿으로 생성할 때 사용하는 시크릿 타입이다. 데이터 스키마로는 tls.crt 와 tls.key 를 가진다. 매니페스트에 직접 시크릿 값을 지정할 수도 있지만, 인증서 비밀키와 인증서 파일로 지정하는 것이 일반적이다.
샘플로 사용하기 위한 자체 서명 인증서를 아래 커맨드로 생성한다.
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ~/tls.key -out ~/.tls.crt -subj "/CN=sample1.example.com"
아래 커맨드로 key 파일과 인증서 파일 경로를 지정하여 tls 타입 인증서를 생성한다.
$ kubectl create secret tls --save-config tls-sample \
> --key ~/tls.key --cert ~/.tls.crt
2. Docker 레지스트
도커 허브 같은 도커 레지스트리의 private 저장소를 사용중이라면, 이미지를 업로드/다운로드 하기 위해 인증이 필요하다. k8s 에서는 이러한 인증 정보를 저장하기 위해 docker-registry 타입의 시크릿을 사용한다. .dockerconfigjson 데이터 스키마를 가지는 시크릿이다.
매니페스트로도 생성할 수 있지만, 형식이 특수하기 때문에 일반적으로 kubectl 로 직접 생성한다.
$ kubectl create secret docker-registry --save-config sample-registry-auth \
--docker-server=REGISTRY_SERVER \
--docker-username=REGISTRY_USER \
--docker-password=REGISTRY_USER_PASSWORD \
--docker-email=REGISTRY_USER_EMAIL
값으로는 자신이 사용하는 저장소와 계정정보를 넣으면 된다. 아래 커맨드로 시크릿을 조회해보면 dockerconfig json 문자열 자체가 base64 인코딩되어있다. 따라서 매니페스트에 작성하는 것 보다는 kubectl 로 작성하거나, 매니페스트로 저장하고 생성하고 싶다면 --dry-run -o yaml 하여 리다이렉트한 파일을 만들어 apply 하는 것이 좋다.
$ kubectl get secrets sample-registry-auth -o json | jq '.data'
{
".dockerconfigjson": "eyJhdXRocyI6eyJSRUdJU1RSWV9TRVJWRVIiOnsidXNlcm5hbWUiOiJSRUdJU1RSWV9VU0VSIiwicGFzc3dvcmQiOiJSRUdJU1RSWV9VU0VSX1BBU1NXT1JEIiwiZW1haWwiOiJSRUdJU1RSWV9VU0VSX0VNQUlMIiwiYXV0aCI6IlVrVkhTVk5VVWxsZlZWTkZVanBTUlVkSlUxUlNXVjlWVTBWU1gxQkJVMU5YVDFKRSJ9fX0="
}
$ kubectl get secrets sample-registry-auth -o json | jq -r '.data[".dockerconfigjson"]' | base64 --decode
{"auths":{"REGISTRY_SERVER":{"username":"REGISTRY_USER","password":"REGISTRY_USER_PASSWORD","email":"REGISTRY_USER_EMAIL","auth":"UkVHSVNUUllfVVNFUjpSRUdJU1RSWV9VU0VSX1BBU1NXT1JE"}}}
docker-registry 시크릿을 실제 이미지를 다운받는 파드에서 사용하려면, 파드 매니페스트의 spec.imagePullSecrets[] 에 시크릿을 지정해주면 된다. 파드에는 여러 컨테이너가 존재할 수 있으므로(멀티 컨테이너 파드) imagePullSecrets 도 배열로 지정한다.(컨테이너 각각에 시크릿을 설정하는 방법은 없다.)
apiVersion: v1
kind: Pod
metadata:
name: sample-pull-secret
spec:
containers:
- name: secret-image-container
image: REGISTRY_NAME/secret-image:latest
imagePullSecrets:
- name: sample-registry-auth
멀티 컨테이너에서 각각의 이미지 저장소가 다르다면, 아래와 같은 매커니즘으로 시크릿을 탐색한다.
- kubelet이 이미지 pull
- imagePullSecrets에 등록된 Secret들을 순서대로 모두 시도
- 해당 레지스트리에 매칭되는 인증 정보가 있으면 성공
또 다른 방법은, Secret 1개에 여러 레지스트리 인증정보를 집어넣는 것이다. 아래처럼 지정된 형식의 json 구조에 인증정보를 저장해 두고, Secret 생성시 .dockerconfigjson 이라는 key 로 지정하여 생성하면 된다.
// dockerconfigjson 파일 내용
{
"auths": {
"registry-a.example.com": {
"auth": "dXNlcjpwYXNz"
},
"registry-b.example.com": {
"auth": "dXNlcjI6cGFzczI="
}
}
}
아래 커맨드로 Secret 을 생성한다.
$ kubectl create secret --save-config sample-multi-registry-secret \
--type=kubernetes.io/dockerconfigjson \
--from-file=.dockerconfigjson=./dockerconfigjson
3. Basic
id, password 기반의 인증인 경우에 적합한 시크립 타입이다. username, password 데이터 스키마를 지정해야 한다.
kubectl 로 생성시 --type kubernetes.io/basic-auth 와 --from-literal 로 인증정보를 지정하여 생성하거나, 아래와 같은 매니페스트로 생성한다.
apiVersion: v1
kind: Secret
metadata:
name: sample-basic-auth
type: kubernetes.io/basic-auth
data:
username: cm9vdA== # root
password: cm9vdHBhc3N3b3Jk # rootpassword
4. SSH
비밀키로 인증하는 시스템인 경우 SSH 인증용 스키마를 가진 ssh-auth 타입 시크릿을 사용한다. ssh-privatekey 라는 데이터 스키마를 사용하는 타입이다. 비밀키 파일이 크기 때문에 일반적으로 kubectl 로 --from-file 옵션으로 비밀키 파일을 지정하여 생성한다. 마찬가지로 매니페스트 파일로 생성하여 apply 하려면 --dry-run -o yaml 리다이렉션 하여 사용한다.
아래 커맨드를 이용하여 샘플 키를 생성하고 이를 기반으로 SSH 시크릿을 생성한다.
$ ssh-keygen -t rsa -b 2048 -f sample-key -C "sample"
$ kubectl create secret generic --save-config sample-ssh-auth \
> --type kubernetes.io/ssh-auth \
> --from-file=ssh-privatekey=./sample-key
secret/sample-ssh-auth created
'Kubernetes' 카테고리의 다른 글
| [Kubernetes] 운영중에 Secret 을 업데이트하기 (0) | 2026.01.11 |
|---|---|
| [Kubernets] Secret 사용법 2가지(환경 변수로 설정, 볼륨으로 마운트) (0) | 2026.01.10 |
| [Kubernetes] 범용 Secret 을 생성하는 4가지 방법(Opaque) (0) | 2026.01.07 |
| [Kubernetes] Secret 이해 (0) | 2026.01.07 |
| [Kubernetes] 파드에 환경 변수 주입하는 5가지 방법 (0) | 2026.01.07 |
