쿠버네티스 입문 (동양북스) 11장을 요약한 내용입니다.
$ echo cGFzc3dvcmQ= | base64 --decode
password
$ echo dXNlcm5hbWU= | base64 --decode
username
$ echo -n "password" | base64
cGFzc3dvcmQ=
$ echo -n "username" | base64
dXNlcm5hbWU=
# user-pass-yaml.yaml
apiVersion: v1
kind: Secret
metadata:
name: user-pass-yaml
type: Opaque
data:
username: dXNlcm5hbWU=
password: cGFzc3dvcmQ=
중요한 점은 data.username, data.password 필드 값을 설정할 때 base64 인코딩값으로 설정해야 한다는 점이다. 참고로 필드 값에 JSON이나 yaml 파일 이름을 넣을 때도 base64 문자 인코딩값을 설정해야한다.
| 타입 | 설명 |
|---|---|
| Opaque | key-value 형식으로 임의의 데이터를 설정할 수 있음 (default) |
| kubernetes.io/service-account-token | 쿠버네티스 인증 토큰을 저장함 |
| kubernetes.io/dockercfg | 도커 저장소 환경 설정 정보를 저장함 |
| kubernetes.io/dockerconfigjson | 도커 저장소 인증 정보를 저장함 |
| kubernetes.io/basic-auth | 기본 인증을 위한 자격 증명을 저장함 |
| kubernetes.io/ssh-auth | SSH 접속을 위한 자격 증명을 저장함 |
| kubernetes.io/tls | TLS 인증서를 저장함 |
| bootstrap.kubernetes.io/token | 부트스트랩 토큰 데이터 정보를 저장함 |
apiVersion: apps/v1
kind: Deployment
# ...
spec:
# ...
template:
metadata:
labels:
app: secretapp
spec:
containers:
- name: testapp
image: ${이미지 경로}:latest
ports:
- containerPort: 8080
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: user-pass-yaml
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: user-pass-yaml
key: password
SECRET_USERNAME=${user-pass-yaml 파일의 key 값이 username에 해당하는 value}
SECRET_PASSWORD=${user-pass-yaml 파일의 key 값이 password에 해당하는 value}
apiVersion: apps/v1
kind: Deployment
# ...
spec:
# ...
template:
metadata:
labels:
app: secretapp
spec:
containers:
- name: testapp
image: ${이미지 경로}:latest
ports:
- containerPort: 8080
volumeMounts:
- name: volume-secret
mountPath: "/etc/volume-secret"
readOnly: true
volumes:
- name: volume-secret
secret:
secretName: user-pass-yaml
/etc/volume-secret 디렉터리를 지정해 시크릿 설정 내용을 파일 형태로 저장한다.
volume-secret이라는 볼륨의 필드 값으로 user-pass-yaml 시크릿을 설정한다.
해당 yaml 파일을 실행하게 되면 /etc/volume-secret 폴더 내부에 password, username 2개의 파일이 생성되고 파일의 내용은 시크릿의 value로 채워진다.
/etc/volume-secret # ls
password username
/etc/volume-secret # cat password
password
환경 변수로 사용하든, 볼륨 형식으로 사용하든 시크릿 내용을 파드 안에서 사용할 때는 base64 문자 디코딩한 값이 사용된다. (때문에 위의 터미널에서 인코딩된 문자열이 노출되는 것이 아니라 password 그대로의 원문이 노출된다.)
보통 컨테이너 이미지를 가져올 때는 대부분 공개된 이미지를 사용한다.
물론 프라이빗 이미지를 사용할 수도 있는데 인증 정보가 필요하다. 로컬 서버라면 프라이빗 컨테이너 이미지 사용 권한을 저장한 후 사용할 수 있지만, 쿠버네티스 클러스터에서는 보안상의 위험이 있기 때문에 그렇게 설정하지 않는다. 인증 정보를 시크릿에 설정해 저장한 후 사용한다.
k8s에서는 kubectl create secret의 하위 명령으로 도커 컨테이너 이미지 저장소용 시크릿을 만드는 docker-registry가 있다.
kubectl create secret docker-registry dockersecret --docker-username=USERNAME --docker-password=PASSWORD --docker-email=EMAIL --docker-server=https://index.docker.io/v1/
도커 컨테이너 이미지 저장소를 직접 설치해서 사용하거나 공식 도커 허브가 아닌 다른 컨테이너 이미지 저장소를 사용한다면 해당 저장소 주소로 --docker-server 옵션값을 변경해야 한다. 그외 USERNAME, PASSWORD, EMAIL 부분은 사용자 정보로 설정해야 한다.
위의 명령어를 통해 만들어지는 secret 파일의 타입은 kubernetes.io/dockerconfigjson이 된다.
해당 시크릿은 다음과 같이 적용한다.
apiVersion: apps/v1
kind: Deployment
# ...
spec:
# ...
template:
metadata:
labels:
app: secretapp
spec:
containers:
- name: testapp
image: ${이미지 경로}:latest
ports:
- containerPort: 8080
imagePullSecrets:
- name: dockersecret
=> 해당 스펙의 이미지를 pull 할 때 사용할 시크릿 정보들은 dockersecret 파일에 존재한다.