본문 바로가기
  • 지요미의 IT성장일기
Kubernetes

쿠버네티스-ConfigMap

by 지요미=P 2024. 2. 19.
728x90

ConfigMap 관리

컨피그맵은 컨테이너를 필요한 "환경설정"을 컨테이너와 분리해서 제공하는 기능이다.
개발용과 상용서비스에서는(production) 서로 다른 설정이 필요할 때가 많다.
사용하는 데이터베이스가 다를 수도 있고, 실제 개발할 때는 디버그 모드로 로그를 출력하는데, 서비스용에서는 시스템 정보를 나타내는 모드로 로그를 출력해야 하는 등의 차이가 있다.
이렇게 다른 설정으로 컨테이너를 실행해야할 때 사용하는 것이 컨피그맵이다.
컨피그맵을 컨테이너와 분리하면 컨테이너 하나를 개발용, 상용 서비스를 운영하기 전 보안이나 성능 장애 등을 검증하는 스테이지용, 상용서비스 용으로 사용할 수 있다.

 

공개 > configmpa을 환경설정으로 함

비공개 > secret을 환경설정으로 함

 

컨피그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트입니다. 

파드는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그맵을 사용할 수 있습니다.
컨피그맵을 사용하면 컨테이너 이미지에서 환경별 구성을 분리하여, 애플리케이션을 쉽게 이식할 수 있습니다.

 

# vi configmap-dev.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-dev
  namespace: default
data: #환경설정구성내용 아래와같이 설정해주기
  DB_URL: localhost
  DB_USER: myuser
  DB_PASS: mypass
  DEBUG_INFO: debug

# kubectl apply -f configmap-dev.yaml
# kubectl describe configmaps config-dev

 

이렇게 노출이 되기 때문에

기밀의 정보는 configmap에다가 넣으면 안된당.

기밀의 정보는 secret을 활용!

 

 

그렇다면 configmap을 어떻게 활용하지?

 

# vi deployment-config01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: configapp
  labels:
    app: configapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configapp

  template:
    metadata:
      labels:
        app: configapp
    spec:
      containers:
      - name: testapp
        image: 34.22.96.240:5000/nginx:latest #/etc/docker/daemon.jason
        ports:
        - containerPort: 8080
        env: #환경변수의 선언 이 부분이 중요함
        - name: DEBUG_LEVEL #변수명(DEBUG_LEVEL)=debug라는 이름 집어넣기(k describe configmaps config-dev에 있는 변수명)
          valueFrom:
            configMapKeyRef: #컨피그맵 여러개 중에서 config-dev의 정보
              name: config-dev
              key: DEBUG_INFO
---
apiVersion: v1
kind: Service #서비스를 만들어서 접속할 수 있도록 함
metadata:
  labels:
    app: configapp
  name: configapp-svc
  namespace: default
spec:
  type: NodePort
  ports:
  - nodePort: 30800
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: configapp
    
 # kubectl apply -f deployment-config01.yaml

 

 

kubectl exec -it configapp-548f777477-dthcm -- bash
env
echo $DEBUG_LEVEL

- > 컨테이너 접근까지 성공!!

 

 

먼저, 다시 실습내용 다 지우고 다시 실습!

# k delete all --all --force

# vi configmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-wordpress
  namespace: default
data:
  MYSQL_ROOT_HOST: '%'
  MYSQL_DATABASE: wordpress

# kubectl apply -f configmap-wordpress.yaml
# kubectl describe configmaps config-wordpress

컨테이너,파드,deploy를 따로 분리하기 위해 사용하고 있음

 

 

 

민감한 정보들은 configmap이 아니라 secret에 넣어보자!

# vi secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
stringData:
  MYSQL_ROOT_PASSWORD: Test1752!
  MYSQL_USER: wpuser
  MYSQL_PASSWORD: Test1752!

# kubectl apply -f secret.yaml
# kubectl describe secrets my-secret

 

secret.yaml에 이름을 my-secret으로 지정하였기 때문에 describe는 지정된 이름으로 불러온다.

어쨋든!! 중요한건.

secret으로 만들어보았더니 describe해도 내용이 모두 보여지지 않는다.

 

 

활용해보자.

도커를 gcp에서 내려받아서 태깅하고 내려받기!

docker pull mysql:5.7
docker images
docker tag mysql:5.7 34.22.96.240:5000/mysql:5.7
docker push 34.22.96.240:5000/mysql:5.7

 

# vi mysql-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: mysql-pod
spec:
  containers:
  - name: mysql-container
    image: 34.22.96.240:5000/mysql:5.7
    envFrom:
    - configMapRef:
        name: config-wordpress
    - secretRef:
        name: my-secret
    ports:
    - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  type: ClusterIP
  selector:
    app: mysql-pod
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306
    
# kubectl apply -f mysql-pod-svc.yaml

 

 

시크릿 파일을 저장했는데 이 파일을 확인하는 방법

master node에서 해당 mysql5.7 파드를 확인하기

k get svc
mysql -h 10.104.157.20 -u wpuser -p

 

 

워드프레스를 사설 레지스트리(GCP)에 등록하기!

docker pull wordpress
docker tag wordpress:latest 34.22.96.240:5000/wordpress:latest
docker push 34.22.96.240:5000/wordpress:latest

 

# vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress-pod
  labels:
    app: wordpress-pod
spec:
  containers:
  - name: wordpress-container
    image: 34.22.96.240:5000/wordpress:latest
    env:
    - name: WORDPRESS_DB_HOST
      value: mysql-svc
    - name: WORDPRESS_DB_USER
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: MYSQL_USER
    - name: WORDPRESS_DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: MYSQL_PASSWORD
    - name: WORDPRESS_DB_NAME
      valueFrom:
        configMapKeyRef:
          name: config-wordpress
          key: MYSQL_DATABASE
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc
spec:
  type: LoadBalancer
#  externalIPs:
#  - 192.168.0.25
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    
# kubectl apply -f wordpress-pod-svc.yaml

 

wordpress 파드를 배포했더니

aws.tar 페이지에서 wordpress 페이지로 변경!!

728x90