티스토리 뷰

configmap과 secret은 쿠버네티스의 데이터를 저장하거나 기밀 정보를 저장하는대 사용 된다

민감한 항목의 경우 secret을 기밀데이터가 아닌 경우 configmap을 사용 하면 됨

일반적으로 configmap의 경우 key: value 데이터를 secret의 경우 인증정보를 저장해놓고 pod를 생성할때 변수로 사용하거나 직접 volume으로 마운트 할 수 있음

변수는 개별 변수를 직접 선언하여 사용할수도 있고 configmap이나 secret을 통으로 변수로 불러들여 사용 할수도 있다

또한 configmap을 이용하여 key: value형식이 아닌 conf등 파일등을 저장하여 pod에 mount하여 사용할수도 있다

일반적으로 pod내 데이터는 휘발성이고 이를 유지하려면 pv를 사용하여야 한다, 그러나 간단한 변수나 설정파일을 위해 pv를 사용하는것은 관리 측면이나 유지비 측면에서 좋은 방법이 아니다

configmap 과 secret은 etcd에 직접 저장되므로 k8s처럼 스케일 업/다운이 잦은 시스템에 전체 파드그룹이 일관적인 설정을 유지하도록 도와 준다

아래는 아파치의 conf파일을 confmap으로 등록하여 사용하는 예제이다

  • httpd.conf
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: httpd.conf
  labels:
    name: httpd-conf
  namespace: default
data:
  httpd.conf: |-
    ServerRoot "/usr/local/apache2"
    Listen 8888
    LoadModule mpm_event_module modules/mod_mpm_event.so
    LoadModule authn_file_module modules/mod_authn_file.so
    LoadModule authn_core_module modules/mod_authn_core.so
    LoadModule authz_host_module modules/mod_authz_host.so
    LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
    LoadModule authz_user_module modules/mod_authz_user.so
    LoadModule authz_core_module modules/mod_authz_core.so
    LoadModule access_compat_module modules/mod_access_compat.so
    LoadModule auth_basic_module modules/mod_auth_basic.so
    LoadModule reqtimeout_module modules/mod_reqtimeout.so
    LoadModule filter_module modules/mod_filter.so
    LoadModule mime_module modules/mod_mime.so
    LoadModule log_config_module modules/mod_log_config.so
    LoadModule env_module modules/mod_env.so
    LoadModule headers_module modules/mod_headers.so
    LoadModule setenvif_module modules/mod_setenvif.so
    LoadModule version_module modules/mod_version.so
    LoadModule unixd_module modules/mod_unixd.so
    LoadModule status_module modules/mod_status.so
    LoadModule autoindex_module modules/mod_autoindex.so
    <IfModule !mpm_prefork_module>
            #LoadModule cgid_module modules/mod_cgid.so
    </IfModule>
    <IfModule mpm_prefork_module>
            #LoadModule cgi_module modules/mod_cgi.so
    </IfModule>
    LoadModule dir_module modules/mod_dir.so
    LoadModule alias_module modules/mod_alias.so
    <IfModule unixd_module>
    User daemon
    Group daemon
    </IfModule>
    ServerAdmin you@example.com
    <Directory />
        AllowOverride none
        Require all denied
    </Directory>
    DocumentRoot "/usr/local/apache2/htdocs"
    <Directory "/usr/local/apache2/htdocs">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
    <IfModule dir_module>
        DirectoryIndex index.html
    </IfModule>
    <Files ".ht*">
        Require all denied
    </Files>
    ErrorLog /proc/self/fd/2
    LogLevel warn
    <IfModule log_config_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
        <IfModule logio_module>
          LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
        </IfModule>
        CustomLog /proc/self/fd/1 common

    </IfModule>
    <IfModule alias_module>

        ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
    </IfModule>
    <IfModule cgid_module>

    </IfModule>
    <Directory "/usr/local/apache2/cgi-bin">
        AllowOverride None
        Options None
        Require all granted
    </Directory>
    <IfModule headers_module>

        RequestHeader unset Proxy early
    </IfModule>
    <IfModule mime_module>

        AddType application/x-compress .Z
        AddType application/x-gzip .gz .tgz

    </IfModule>
    <IfModule proxy_html_module>
    Include conf/extra/proxy-html.conf
    </IfModule>
    <IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    </IfModule>

위와 같이 여러줄을 나타내는 |기호를 이용하여 configmap안에 파일 내용을 넣을수도 있다

생성된 cm은 아래와 같은 방법으로 pod내 직접 마운트 하여 사용 할 수 있다

  • confmap pod
---
apiVersion: v1
kind: Pod
metadata:
  name: configmap
  labels:
spec:
  containers:
    - name: configmap
      image: httpd/httpd
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
      volumeMounts:
        - name: httpd-conf-volume
          mountPath: /usr/local/apache2/conf/httpd.conf
          subPath: httpd.conf
  volumes:
    - name: httpd-conf-volume
      configMap:
        defaultMode: 0777
        name: httpd.conf

위 예제는 configmap이라는 파드를 실행하는데 위에서 만든 configmap을 파일로 만들어 아파치 기본 conf위치에 마운트 하겠다는 의미이다

위는 어려운 예제이며 name: key name1: key1 형식으로 변수를 저장하여 사용하는 경우가 일반적이다

시크릿의 경우 configmap과 동일하게 사용할수 있다

다만 시크릿은 데이터(value)가 평문이 아닌 base64로 인코딩 되어 저장된다(암호화가 아니므로 유의)

시크릿에는 configmap과 같은 key value타입, 인증서를 담는 tls타입, docker의 로긴 정보를 담는 dockerconf 등의 타입을 사용 할 수 있다

아래는 user/password 정보를 configmap이 아닌 secret에 담는 예제이다

  • secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-basic-auth
type: kubernetes.io/basic-auth
stringData:
  username: admin
  password: password

위와같이 secret을 생성한 후 edit나 describe로 해당 데이터를 확인하면 아래와 같이 나온다

password: cGFzc3dvcmQ=
username: YWRtaW4=

위에서 얘기한대로 이는 암호화는 아니라 아래와 같이 base64 decode만으로 평문으로 만들수 있으며 실제 pod에 사용할때 역시 아래와 같은 방법으로 평문으로 선언된다

echo cGFzc3dvcmQ= |base64 -d
password

 

'클라우드 > 쿠버네티스' 카테고리의 다른 글

PVC Extend  (0) 2022.05.24
Pod 스케쥴링 전략  (0) 2022.05.24
Internal LoadBalancer 생성하기  (0) 2022.05.24
엘라스틱 서치 security 설정  (0) 2022.05.24
자원 관리  (0) 2022.05.24
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함