[Kubernetes] Common - 3. Configmap & Secret

2025. 5. 1. 17:20·Kubernetes/Common

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
'Kubernetes/Common' 카테고리의 다른 글
  • [Kubernetes] Common - 2. Pod & ReplicaSet & Deployment
  • [Kubernetes] Common - 1. 쿠버네티스란?
Yun-seul
Yun-seul
재능이 없으면 열심히라도 하자
  • Yun-seul
    윤슬
    Yun-seul
  • 전체
    오늘
    어제
    • 분류 전체보기 (22)
      • Java (1)
        • Java 기본 (1)
      • Spring Boot (9)
        • Sprng Boot Sample Code (9)
      • Docker (1)
      • Kubernetes (7)
        • Common (3)
        • GKE(Google Kubernetes Engin.. (4)
        • EKS(Elastic Kubernetes Serv.. (0)
      • Redis (0)
      • AWS (0)
      • Git (0)
      • Reflection (1)
      • Troubleshooting (3)
      • Performance Tuning (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    rfc6750
    커스텀익셉션
    임시디렉토리
    SpringBoot
    djava.io.tmpdir
    @value #null #어노테이션 #springboot #springioc #컨테이너
    GKE
    어세스토큰
    unable to create tempdir. java.io.tmpdir is set to
    필터2번
    onceperrequestfilter
    재요청
    docker
    jwt토큰 #로그인 #회원가입 #쿠키 #보안설정
    에러코드관리
    methodargumentnotvalidexception
    전역예외처리
    globalexception
    kubernetes
    쿠버네티스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Yun-seul
[Kubernetes] Common - 3. Configmap & Secret
상단으로

티스토리툴바