이 게시물은 인프런 -
쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2
강의에 대한 복습 및 정리용 게시물입니다. 그렇기 때문에 자세한 내용은 생략됐습니다.
그리고 여기에서 나오는 모든 이미지들은 해당 강의가 출처임을 미리 말씀드립니다.
App 을 하나 동작시키기 위해서는 필요한 설정값들이 있습니다.
이런 설정값들을 쿠버네티스에서는 크게 2가지 형태로 제공할 수 있습니다.
ConfigMap
Secret
그렇다면 아래 그림을 통해서 ConfigMap 과 Secret 의 사용 방식을 알아보겠습니다.
이번엔 좀 더 실제로 사용할 법한 예시를 살펴볼까요?
좌측 상단 ConfigMap 의 내용을 보면 data
하단에 여러 key-value 쌍이 있습니다.
이것들이 모두 container 의 환경변수로 노출될 것들입니다.
이러면 container 실행 시에도 가져다 쓸 수 있으니 유용하겠죠?
참고로 알아두면 좋은 점이 있습니다.
ConfigMap 의 환경변수들은 Pod 가 맨 처음 한번 생성될 때에만 적용됩니다.
Pod 가 정상 기동되고 나서 ConfigMap 을 백날 수정해도 Pod 에는 영향을 주지 못합니다.
이번에는 우측 상단에 있는 Secret 을 보죠.
volume 을 통해서 하나의 파일 형태로 저장됩니다.
여기서 알아 둘 것은 파일 내용이 stringData
에 있는 문자열들이
key-value 로 저장되어 있는데, value 값들은 Base64
로 한번 인코딩 된 후에
data
라는 속성으로 들어가게 됩니다.
volume
에 실제 파일 내용도 마찬가지로 Base64 인코딩된 문자열이 보이게 됩니다.
base64 는 디코딩이 아주 쉬습니다.
딱히 보안적으로 이점은 없다는 점 명심하시기 바랍니다.
아래는 secret 정보를 쉽게 디코딩하는 장면을 보여줍니다.
이런 base64 문자열이 파일에 volume 에 저장되지만,
실제 container 안에서는 해당 파일의 문자열이 다시 디코딩되어서
내용이 정상적인 문자열로 보이게 됩니다.
위애서도 잠깐 말했지만 Secret 은 딱히 보안적이지 않습니다.
너무나도 디코딩이 쉽기 때문이죠.
뭔가 Secret 은 분명 비밀번호 같이 보안적인 요소를 숨기기 위한 것이
용도라고 소개하지만, 전혀 공감이 되지 않습니다.
이럴 때는 그냥 억지로 이해하려 하지말고,
차라리 실제 사용 예로 Secret 의 사용 방식을 알아보는 게 더 낫습니다.
Secret 에는 configMap 과 달리 type
이라는 속성이 있습니다.
type=opaque
를 쓰면 딱히 ConfigMap 과 다른 점이 없습니다.
하지만 만약에 type=docker-registery
처럼 쿠버네티스에서 정한
약속된 다른 type 을 사용하면 완전히 다른 용도로 사용됩니다.
type=docker-registery
와
data 에 docker-username
, docker-password
와 같은 이미 약속된
key 값을 사용해서 Secret 을 사용하고 이를 Pod 설정에
ImagePullSecret
으로 연결하면, 이미지를 pull 할 때 Docker 리포지토리가
기존에 기본으로 설정되어 있는 docker hub 가 가 아닌 개인 사설 저장소로
바꿀 수 있습니다.
이렇듯 Secret 은 쿠버네티스에서 이미 지정된 설정들에 대한
커스터마이징을 쉽게 할 수 있는 템플릿을 제공하는 것입니다.
이럴거면 그냥 Secret 이라는 이름을 쓰지 말았으면...
Secret 은 중요한 설정에 대한 보안 용도로 쓰지 않는게 좋겠죠?
그렇다면 대체안이 필요할 겁니다.
Secret 을 CI/CD 배포 파이프라인에서 만들지 말고,
Cluster 내부에서 수동으로 생성해서 넣기
미리 암호화를 시켜놓고, 실행한 App 에서 복화하시키기
서드파티 사용 (ex: Vault)
apiVersion: v1
kind: ConfigMap
metadata:
namespace: anotherclass-123
name: api-tester-1231-postgresql
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
data:
postgresql-info.yaml: |
driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "dev"
password: "dev123"
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: anotherclass-123
name: api-tester-1231
spec:
template:
spec:
nodeSelector:
kubernetes.io/hostname: k8s-master
containers:
- name: api-tester-1231
image: 1pro/api-tester:v1.0.0
volumeMounts:
- name: configmap-datasource
mountPath: /usr/src/myapp/datasource/dev
volumes:
- name: configmap-datasource
configMap:
name: api-tester-1231-postgresql