woonizzooni

Kubernetes - ConfigMap 이용한 환경 설정 (redis.conf, nginx.conf, os environment variables 등) 본문

Kubernetes

Kubernetes - ConfigMap 이용한 환경 설정 (redis.conf, nginx.conf, os environment variables 등)

woonizzooni 2020. 11. 5. 13:45

 

 

1. (선택) Namespace 생성/지정

apiVersion: v1
kind: Namespace
metadata:
  name: my-ns

$ kubectl apply -f ./my_ns.yaml

$ kubectl get ns

 

 

2. ConfigMap 생성/작성(설정)

 

 1) 설정 파일의 경우

(ex1) redis.conf

apiVersion: v1 

kind: ConfigMap 
metadata: 
  namespace: my-ns
  name: my-redis-config 
data: 
  redis-conf:  | 
    maxmemory .....
    ... 설정 내용 작성
(ex2) nginx.conf

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: my-ns
  name: my-nginx-conf
data:
  nginx-conf: |
    user  nginx;
    worker_processes  2;

    err_log    /var/log/nginx/err.log warn;
    pid         /var/run/nginx.pid;

    events {
        worker_connections  1024;
    }

    http {
        include         /etc/nginx/mime.types;
        default_type  application/octet-stream;
        ....
        include        /etc/nginx/conf.d/*.conf;
   }

 2) 환경 변수로 받고 싶은 경우

apiVersion: v1 
kind: ConfigMap 
metadata: 
  namespace: my-ns
  name: my-env
data:
  redis_addr: "redis:6379"
  zookeeper_addr: "zoo:2181"
  server_conf: '{"web":{"listen_port":8888,..'

$ kubectl apply -f ./myConfigMap.yaml

$ kubectl get configmap -n my-ns

$ kubectl describe configmap -n my-ns my-env

 

 

 

3. Pod에서 ConfigMap 사용하기

  1) 환경 변수로 접근/가져오기 : getenv() / os.Getenv / System.getenv() 등으로 접근

apiVersion: v1
kind: Pod
metadata:
  namespace: my-ns
  name: my-app
spec:
  containers:
  - name: my-app
    image: {{myContainerImage:latest}}
    ...
   env:
    - name: REDIS_ADDR
      valueFrom:
          configMapKeyRef:
              name: my-env
              key: redis_addr
    - name: ZOOKEEPER_ADDR
      valueFrom:
          configMapKeyRef:
              name: my-env
              key: zookeeper_addr
    - name: SERVER_CONF
      valueFrom:
          configMapKeyRef:
              name: my-env
              key: server_conf
  ....

 

  2) 파일로 접근/로딩하기

    - 특정 디렉토리로 mount하는 과정에서 다른 파일과의 공존이 필요하다면 'subPath'을 이용할 수 있다.

      다만, 다음과 같은 제약이 따른다.

      "ConfigMap을 subPath 볼륨 마운트로 사용하는 컨테이너는 ConfigMap 업데이트를 수신하지 않는다.

apiVersion: v1 
kind: Pod 
metadata: 
  namespace: my-redis 
  name: my-redis
spec: 
  containers: 
  - name: my-redis 
    image: redis:latest
    command: 
      ..
   env:
    - name: ..
      ...
    volumeMounts: 
    - mountPath: /redis-master 
      name: config
    ...
  volumes: 
    - name: config 
      configMap: 
        name: my-redis-config
        items: 
        - key: redis-conf
          path: redis.conf
 ...
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: my-ns
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-nginx 
  template:
    metadata:
      labels:
        app: my-nginx 
    spec:
      containers:
      - name: my-nginx 
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        #방법1 : config/etc/nginx/nginx.conf 로 마운트
        - mountPath: /etc/nginx/nginx.conf #
          readOnly: true
          name: config
          subPath: nginx.conf

        #방법2: config /etc/nginx 에 마운트
        - mountPath/etc/nginx
          readOnly: true
          name: config

      volumes:
      - name: config
        configMap:
          name: my-nginx-conf
          items:
            - key: nginx-conf
              path: nginx.conf

 

 

[참고]

kubernetes.io/ko/docs/concepts/configuration/configmap/

kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

kubernetes.io/ko/docs/concepts/storage/volumes/

 

Comments