도커의 이미지는 빌드 후 불변의 상태를 갖기 때문에, 설정 옵션을 유연하게 변경할 수 없다
- 애플리케이션을 개발하거나 배포할 때, 각 환경에 따라 컨테이너 안쪽의 환경 변수와 같은 변화하는 값들을 관리해야 하는데, 이를 위해서 이미지를 생성하는 것은 불편하고, 낭비이다
ConfigMap과 Secret을 이용하면, 환경 변수나 설정 값들을 변수로 관리해서 Pod가 생성될 때 값을 넣어준다. 이를 통해 외부에서 값들을 바꿔줄 수 있다
- 따라서, etcd에 접근할 수 있다면 Secret의 값을 읽는건 쉽다
- 여기서 가장 중요한 것은 RBAC를 이용하여 Secret에 대한 권한을 제어하는 것이다
Opaque ( generic ) : 일반적인 용도의 Secret으로, 보안이 중요한 정보를 컨테이너에 전달하는 목적으로도 사용
dockerconfigjson : Docker 이미지 저장소 인증 정보. Private 이미지를 가져올 때는 추가적인 인증 절차를 수행해야 하는데, 해당 인증에 필요한 정보를 Secret에 넣어두고, Pod를 생성할 때 이미지 Pull을 위해 사용할 수 있다
TLS : TLS 인증서 정보를 넣어두어 Pod나 Service가 이를 통해 통신 암호화 수행 가능
service-account-token : ServiceAccount에 대한 인증 정보를 담은 토큰. ServiceAccount가 생성되면, 자동 생성된다
kubectl create secret < secret 종류 > < secret 이름 >
- 위와 같은 명령형 접근법으로 Secret 생성 가능하다
--from-literal=<key>=<value>
- 위 옵션은 명령형 접근법으로 Secret을 생성할 때, Key와 Value를 지정하는 옵션이다. 해당 옵션을 여러번 사용하여 Key-Value 쌍을 추가할 수 있다
--from-file
- 위 옵션은 필요한 데이터가 포함된 파일의 경로를 지정한다. from file을 통해 만들면, 파일 이름이 Key 값이 된다
[ec2-user@ip-100-0-1-19 hongwork]$ kubectl create secret generic hongpass --from-literal=hong=jaehong --from-literal=jae=jaehong -n hongspace --dry-run -o yaml
W0418 00:10:43.012689 568683 helpers.go:663] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
data:
hong: amFlaG9uZw==
jae: amFlaG9uZw==
kind: Secret
metadata:
creationTimestamp: null
name: hongpass
namespace: hongspace
- 위와 같이 사용할 수 있다. 값들이 base 64로 인코딩 되어 저장된다
- dry-run 옵션은 가짜로 실행하는 옵션이다. 결과를 클러스터에 반영하는게 아니라, 어떤 결과가 생성되는지 확인하기 위한 옵션이다
- -o yaml은 출력 결과를 yaml 형식으로 출력하라는 것이다
kubectl create secret < secret 종류 > < secret 이름 > ~~~ --dry-run -o yaml
- 위와 같이 dry run -o yaml을 이용하여, yaml 파일을 간편하게 생성할 수 있다
apiVersion: v1
kind: Secret
metadata:
name: secret-1
stringData:
password: test123
- Secret을 선언할 때, 인코딩 되지 않은 데이터는 stringData 아래에 설정해야 한다. 만약 ConfigMap과 같이 data 아래에 설정하면, 인코딩 오류가 발생한다
apiVersion: v1
kind: Secret
metadata:
name: secret-1
data:
password: afsSDsdSD
- 위와 같이 Value를 미리 Base64로 인코딩해주면, data 아래에 설정해도 된다
- 이는 추후에 알아보자!
- configMapRef : 지정한 ConfigMap의 전체 데이터를 한꺼번에 컨테이너에 적용
- secretRef : 지정한 Secrets의 전체 데이터를 한꺼번에 컨테이너에 적용
spec:
containers:
- name: nginx2
image: nginx
envFrom:
- configMapRef:
name: configmaphong
- secretRef:
name: secrethong
- 위와 같이, 적용할 컨테이너 밑에 선언해주면 된다
spec:
containers:
- name: nginx2
image: nginx
env:
- name: hong_password
valueFrom:
secretKeyRef:
name: secretname
key: keyname
- 위와 같이, 적용할 컨테이너 밑에 선언해주면 된다
- 컨테이너 내부에 hong_password 환경 변수의 값을 Secret인 secretname의 keyname이라는 Key의 Value 값으로 설정하는 것이다
- 파일 이름은 Key 값이며, 파일 내용은 Value가 된다
spec:
containers:
- name: nginxhong
image: nginx
volumeMounts:
- mountPath: /user/config
name: hongconfig
- mountPath: /user/secret
name: hongsecret
volumes:
- name: hongconfig
configMap:
name: name_of_config
- name: hongsecret
secret:
secretName: name_of_secret
- 위와 같이 Volume 처럼 사용 가능하다
- volumes에서 각 ConfigMap과 Secrets를 이용하여 volume을 선언하고, volumeMounts에서 컨테이너의 특정 경로에 volume을 마운트하면 된다