1. Cofigmap 과 Secret 이란?
Cofigmap 과 Secret 모두 쿠버네티스(Kubernetes)에서 애플리케이션 설정값을 외부에서 주입하기 위해 사용하는 리소스 객체
민감하지 않은 정보의 경우 configmap 을 사용하고 민감 정보의 경우 base64로 인코딩 한 후 secret을 이용한다.
*base64로 인코딩 하는 이유는 바이너리 데이터나 특수문자를 직접 다루기 어렵기 때문이지 보안 때문이 아니다.
쿠버네티스에서 secret 설정 yml 파일은 etcd 라는 key-value 저장소에 저장하는데, 이때 기본 설정에서는 암호화되지 않은 채 저장하기 때문에 운영 환경에서는 반드시 EncryptionConfiguration을 설정해 암호화 해야 하고, RBAC(Role-Based Access Control) 설정을 통해 Secret에 접근할 수 있는 사용자를 제한해야 한다.
2. Configmap 사용해 보기
1. Dockerfile 작성
FROM --platform=linux/amd64 nginx:1.27.0
ENV TITLE NONE
CMD ["/bin/sh", "-c", "echo \"Hello, $TITLE\" > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
FROM --platform=linux/amd64 nginx:1.27.0
- FROM : 어떤 이미지를 사용할 것인지
- --platform=linux/amd64 : 이미지를 리눅스 amd64 아키텍처로 설정
- nginx:1.27.0 : nginx 1.27.0 버전 사용
ENV TITLE NONE
- Docker 환경변수 TITLE을 설정합니다.
- 기본값은 "NONE"입니다.
- 나중에 컨테이너 실행 시 -e TITLE=값 형식으로 덮어쓸 수 있습니다.
CMD ["/bin/sh", "-c", "echo \"Hello, $TITLE\" > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
- CMD : 컨테이너가 시작될 때 실행할 명령어 지정
- /bin/sh -c : 를 사용해 다음 명령어 실행
- "echo \"Hello, $TITLE\" > /usr/share/nginx/html/index.html : 해당 경로에 "Hello, $TITLE" 이라는 index.html 생성
- $TITLE : 환경변수를 통해 동적으로 입력된 값의 index.html이 생성된다.
- nginx -g 'daemon off;' : Nginx를 실행하는데 백그라운드로 가지 않고 포그라운드로 실행되게 해서 컨테이너가 계속 살아 있도록 유지함
*docker에서는 하나의 컨테이너안에 메인 프로세스가 하나 이상 있어야 유지되는데 nginx를 그냥 실행시 백그라운드에서 실행된 후 더이상 메인프로세스가 없다고 판단한 컨테이너가 종료되며 nginx도 종료된다. 이를 방지하기위해 daemon(백그라운드)를 off해 포그라운드에서 실행하며 컨테이너를 유지한다.
2. GCP의 Artifact Registry 경로를 태그로 붙여 build
작성할때는 아래와 같이 경로를 복사해 작성하면 되고
docker build -t {registy에서 복사한 경로}/{이미지이름}:{버전} .
각 부분의 의미는 아래와 같다.
docker build -t asia-northeast3-docker.pkg.dev/{프로젝트ID}/{레지스트리이름}/{이미지이름}:{버전} .
3. build 된 파일을 docker에 push
build시와 같이 복사한 경로에 이미지 이름과 버전을 추가해 push 하면
docker push {registy에서 복사한 경로}/{이미지이름}:{버전}
docker push asia-northeast3-docker.pkg.dev/{프로젝트ID}/{레지스트리이름}/{이미지이름}:{버전}
아래와 같이 Artifact Registry에 추가된 이미지를 확인할 수 있다.
4. Artifact Registry에서 이미지 로컬로 pull 해오기(test를 위한 과정으로 기존 로컬 도커에 빌드된 이미지 삭제 필요)
아래 명령어를 통해 이미지를 가져오면 도커 데스크탑 이미지 탭에 해당 이미지가 생긴걸 확인할 수 있다.
docker pull asia-northeast3-docker.pkg.dev/{복사한경로}/{이미지이름}:{버전}
5.ConfigMap 작성
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-configmap
data:
PUBLIC_NAME: KUBERNETES
6. Pod 작성
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
namespace: default
spec:
containers:
- name: nginx
image: asia-northeast3-docker.pkg.dev/argon-depth-429113-t7/kube-study-registry/configmap-study:1.0.0 #예시
env:
- name: TITLE
valueFrom:
configMapKeyRef:
name: sample-configmap
key: PUBLIC_NAME
ports:
- containerPort: 80
7. GKE 클러스터에 작성한 ConfigMap & Pod 배포
ConfigMap은 Pod가 배포될때 적용되기 때문에 ConfigMap을 먼저 배포해야 한다.
configmap.yml 배포
kubectl apply -f configmap.yml
sample-pod.yml 배포
kubectl apply -f sample-pod.yml
8. 배포 확인
현재 배포시에 외부와 연결되는 포트를 설정해 주지 않아 해당 이미지를 확인하려면 직접 컨테이너에 접속해야 한다.
배포후 아래와 같이 Pod 조회
kubectl get pods
해당 파드의 도커 컨테이너 접속
kubectl exec -it sample-pod -- /bin/sh
cd 명령어를 통해 html 이 있는 폴더로 이동
cd /usr/share/nginx/html
cat 명령어를 통한 index.html 읽기
cat index.html
Hello, KUBERNETES 와 같이 index.html의 $TITLE이 ConfigMap에서 지정한 KUBERNETES로 출력되는걸 볼 수 있다.
다음은 명령어를 통해 해당 pod의 외부 연결 포트를 지정해 주는 방법이다.
다음 명령어를 통해 pods를 조회하고
kubectl get pods
port-forward 명령어로 pod를 지정해 {외부와의 연결을 위한 포트 추가}:{pod에 설정된 컨테이너 내부 포트} 와 같은 방식으로 연결시켜 줄 수 있다.
kubectl port-forward {pod이름} {외부연결포트}:{pod에서 지정한 내부포트}
설정한 포트를 통해 접속해보면 cat 명령어를 통해 컨테이너 내부에서 직접 확인한 것과 같이 결과가 나오는 것을 볼 수 있다.
3. Secret 사용해보기
apiVersion: v1
kind: Secret
metadata:
name: sample-secret
data:
SECRET_NAME: SSBBTSBBTkRSRVc=
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
namespace: default
spec:
containers:
- name: nginx
image: asia-northeast3-docker.pkg.dev/argon-depth-429113-t7/kube-study-registry/configmap-study:1.0.0
env:
- name: TITLE
valueFrom:
secretKeyRef:
name: sample-secret
key: SECRET_NAME
ports:
- containerPort: 80
'Kubernetes > Common' 카테고리의 다른 글
[Kubernetes] Common - 2. Pod & ReplicaSet & Deployment (0) | 2025.04.29 |
---|---|
[Kubernetes] Common - 1. 쿠버네티스란? (0) | 2025.04.27 |