목표

  • 디플로이먼트를 이용해서 파드를 생성할 때, 파드에서 필요한 데이터를 환경 변수로 설정되도록 하여 넘겨주고자 한다.
  • 파드에 넘겨줄 데이터를 클러스터에서 어떻게 관리할지도 고민해본다.

ConfigMap

  • 클러스터 내에 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트다.
  • 파드는 ConfigMap을 환경 변수, 파라미터 볼류의 구성 파일로 사용할 수 있다.
  • 아래와 같이 명령어로 바로 ConfigMap을 만들 수도 있고, yaml 파일을 이요해서 만들 수도 있다.
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2022-02-18T19:14:38Z
  name: special-config
  namespace: default
  resourceVersion: "651"
  uid: dadce046-d673-11e5-8cd0-68f728db1985
data:
  special.how: very
  special.type: charm
  • ConfigMap에 있는 모든 key-value 쌍을 환경 변수로 사용하려면, envFrom을 이용할 수 있다.
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never
  • 여러 ConfigMap으로 부터 일부 값들을 환경 변수로 사용하려면 valueFrom을 사용할 수 있다.
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/echo", "$(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: SPECIAL_LEVEL
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: SPECIAL_TYPE
  restartPolicy: Never

Secret

  • 비밀번호, 토큰 키 같은 기밀 데이터를 포함하는 오브젝트이다.
  • ConfigMap과 다르게 base64로 인코딩된 데이터를 저장해야된다.
  • 또한, ConfigMap 과 Secret 모두 etcd에 저장되지만 Secret은 클러스터 설정에 따라 데이터를 암호화해서 저장한다.
  • Secret은 RBAC(Role-Based Access Control)에 따라 접근할 수 있는 사용자를 제한할 수 있다.
  • 아래와 같이 base64로 인코딩을 하고 저장할 수 있다.
echo -n 'my-app' | base64
echo -n '39528$vdg7Jb' | base64
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  username: bXktYXBw
  password: Mzk1MjgkdmRnN0pi
  • Secret도 ConfigMap과 비슷하게 valueFrom을 통해 특정 값을 파드의 환경 변수로 설정할 수 있다.
apiVersion: v1
kind: Pod
metadata:
  name: envvars-multiple-secrets
spec:
  containers:
  - name: envars-test-container
    image: nginx
    env:
    - name: BACKEND_USERNAME
      valueFrom:
        secretKeyRef:
          name: backend-user
          key: backend-username
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: db-user
          key: db-username

참고 자료