- Secret 만들기
- Secret 사용하기
- Secret 데이터 용량제한
앞 포스트 ConfigMap과 매우 유사하기 때문에 먼저 보고 오는 것을 추천합니다.
1. Secret 만들기
Kubernetes에서 Secret은 암호화된 정보, 키, 패스워드 등과 같은 민감한 데이터를 안전하게 저장하기 위한 리소스다.
Secret은 ConfigMap과 흡사한 형태를 띄고 있다.
ConfigMap은 컨테이너가 사용하는 구성 데이터를 한 곳에 모아 통합 관리하기 위해 사용되었지만 Secret은 거기에 값을 Base64로 인코딩하여 암호화된 형태로 저장하기 때문에 보안적 요소가 고려한 리소스라고 할 수 있다.
그래서 주로 애플리케이션에서 사용되는 민감한 정보(password, auth token, ssh key 등)를 안전하게 관리하고 전달하기 위해 활용된다.
Secret으로 데이터 전달 방법
- Command-line Argument
- Environment Variable
- Volume Mount
사용법
kubectl create secret <Available Commands> name [flags] [options]
<Available Commands>
1. docker-registry
2. generic
3. tls
ex)
kubectl create secret tls my-secret --cert=path/to/cert/file --key=path/to/key/file
kubectl create secret docker-registry reg-secret \
--docker-username=tiger --docker-password=pass --docker-email=tiger@acme.com
kubectl create secret generic tt-secret \
--from-literal=INTERVAL=2 --from-file=./genid-web-config/
실습
# 사전 준비
mkdir ~/genid-web-config
cd ~/genid-web-config
cat > default.conf << EOF
server {
listen 80;
server_name www.example.com;
gzip on;
gzip_types text/plain application/xml;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
EOF
# 시크릿 생성
kubectl create secret generic tt-secret \
--from-literal=INTERVAL=2 --from-file=./genid-web-config/
각 시크릿은 타입을 가지고 있다.
타입은 여러 종류 있으며 나열하면 다음과 같다.
TYPE | 의미 |
Opaque | 임의의 사용자 정의 데이터 |
kubernetes.io/service-account-token | 서비스 어카운트 토큰 |
kubernetes.io/dockercfg | 직렬화 된(serialized) ~/.dockercfg 파일 |
kubernetes.io/dockerconfigjson | 직렬화 된 ~/.docker/config.json 파일 |
kubernetes.io/basic-auth | 기본 인증을 위한 자격 증명(credential) |
kubernetes.io/ssh-auth | SSH를 위한 자격 증명 |
kubernetes.io/tls | TLS 클라이언트나 서버를 위한 데이터 |
bootstrap. kubernetes.io/token | 부트스트랩 토큰 데이터 |
시크릿은 모든 값이 인코딩(암호화)되어 나오기 때문에 무슨 파일인지 알기가 힘들다.
그래서 위와 같이 시크릿의 타입을 표시함으로 무슨 종류의 시크릿인지 쉽게 이해할 수 있는 것이다.
방금 생성한 시크릿의 내부를 확인해보면 다음과 같다.
분명 평문(Plain Text)을 넣었지만 값은 암호화되어 출력이 된다.
시크릿은 항상 암호화된 상태로 존재하지만 파드에게 값을 넘겨줄 때는 디코딩(복호화)시켜서 보내주게 된다.
2. Secret 사용하기
정의된 Secret을 Pod의 Container에 전달 방법
- Command-line Argument로 전달
- Environment Variable로 전달
- Volume에 secret을 사용하여 컨테이너 디렉토리에 Mount
Key | Value |
INTERVAL | 2 |
default.conf | server { listen 80; server_name http://www.example.com; gzip on; gzip_types text/plain application/xml; location / { root /usr/share/nginx/html; index index.html index.htm; } } |
우리가 생성한 시크릿의 내용은 위와 같지만 실제로는 암호화되어 있음을 기억하자.
Command-line Argument로 전달
kubectl run my-secret --image=nginx:1.25 \
--env="INTERVAL=$(kubectl get secret tt-secret -o jsonpath='{.data.INTERVAL}' | base64 --decode)"
이렇게 생성하면 되긴 하지만 run 명령으로는 단일 컨테이너 파드 밖에 만들지 못하고 시크릿이든 컨피그맵이든 적용하기에 불편함이 많기 때문에 yaml파일을 사용하는게 좋다.
Environment Variable로 전달
# genid-env-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: genid-env-secret
spec:
containers:
- image: smlinux/genid:env
env:
- name: INTERVAL
valueFrom:
secretKeyRef:
name: tt-secret
key: INTERVAL
name: fakeid-generator
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.25
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
전체적인 구조가 ConfigMap과 굉장히 유사함을 알 수 있다.
INTERVAL의 값을 2로 설정한 secret을 컨테이너에 적용시킴으로 fakeid를 2초에 한번씩 생성하게 된다.
실제로 curl명령을 통해 파드의 IP를 입력해서 결과를 확인해보면서 확인해보자.
2초마다 변경된다는 사실을 글로는 보여주기가 애매하긴 하지만 다음과 같이 적용한 secret과 같이 값이 2초마다 변경된다(실제 동작을 반드시 직접 실행해보고 확인할 것).
Volume에 secret을 사용하여 컨테이너 디렉토리에 Mount
# genid-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: genid-stone
spec:
containers:
- image: smlinux/genid:env
name: fakeid
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.25
name: web-server
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: html
emptyDir: {}
- name: config
secret:
secretName: tt-secret
items:
- key: default.conf
path: default.conf
위 yaml코드를 해석하면 다음과 같다.
config라는 이름의 공유 디렉토리를 생성하고 web-server 컨테이너의 /etc/nginx/conf.d/ 디렉토리에 마운트한다.
해당 디렉토리는 읽기 전용이며 디렉토리 내부에 시크릿의 default.conf 키의 값을 default.conf라는 이름의 파일의 내용으로 저장한다.
실제로 실행해서 설정된 내용을 보면 secret으로 인코딩되어 있던 것이 디코딩되어 평문이 적용된 모습을 볼 수 있다.
# 컨테이너에 직접 들어가서 적용되었는지 확인
kubectl exec -it genid-volume-secret -c web-server -- /bin/bash
cd /etc/nginx/conf.d/
cat default.conf
# 심볼릭 링크 확인
ls -l default.conf
# 마운트 확인
df -h
3. Secret 데이터 용량제한
Secret은 etcd에 암호화하지 않은 텍스트로 저장된다(평문).
Secret의 value가 커지면 메모리 용량을 많이 사용하게 되기에 Secret의 최대 크기는 1MB로 제한된다(ConfigMap 동일).
어지간해서는 넘지 않겠지만 잘 관리하는 게 중요하다.
아래 영상을 참고했습니다.
https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE
'Kubernetes' 카테고리의 다른 글
Kubernetes 기초 - 로깅과 모니터링(1) (0) | 2024.01.02 |
---|---|
멀티 마스터 쿠버네티스 클러스터 구성 방법 (0) | 2023.12.31 |
Kubernetes 기초 - ConfigMap (0) | 2023.12.23 |
Kubernetes 기초 - Label(4) (0) | 2023.12.22 |
Kubernetes 기초 - Label(3) (0) | 2023.12.22 |