Command & Arguments

Docker Image를 기반으로 Pod 를 생성하면서 command 와 argument를 주입하려는 경우

  • 예시 Docker Image

    # 예시 Dockerfile
    
    FROM ubuntu
    
    ENTRYPOINT ["sleep"]
    
    CMD ["5"]
    
  • Pod definition 파일에서 CMD 오버라이드 하기

    apiVersion: v1
    kind: Pod
    metadata:
        name: ubuntu-sleep-pod
          
    spec:
        containers:
            - name: ubuntu-sleep-pod
                image: ubuntu-sleep-pod
                args: ["10"]   ## <--- CMD override
    
  • Pod definition 파일에서 ENTRYPOINT 오버라이드 하기

    apiVersion: v1
    kind: Pod
    metadata:
        name: ubuntu-sleeper-pod
          
    spec:
        containers:
            - name: ubuntu-sleeper-pod
                image: ubuntu-sleeper-pod
                command: ["echo"] # <--- ENTRYPOINT override
                args: ["10"]   # <--- CMD override
    

Environment Variables 환경변수

K8s Pod을 생성하는 과정에서 환경 변수 타입은 크게 3가지가 있음

Plain Key-Value

  • env 아래 Key-Value 형태로 명시함.
apiVersion: v1 
kind: Pod 
metadata:
  name: webapp-color
  labels:
      name: webapp-color

spec:
  containers:
  - name: webapp-color
    image: webapp-color
    ports:
	    - containerPort: 8080
	  
	  # environment variable
	  env:
		  - name: APP_COLOR
             value: blue
    
    command: ["python", "app.py"]
    args: ["--color", "blue"]

ConfigMap

  • ConfigMap은 K8s에서 config를 따로 저장 및 관리할 수 있는 오브젝트.
  • Key-Value 페어로 정의하고
  • pod가 생성될 때 주입할 수 있음

ConfigMap 생성 방법

  1. CLI를 통해 바로 생성

    • kubectl create configmap {NAME} --from-literal=APP_COLOR=blue --from-literal=APP_MODE=prod
  2. 기존에 정의된 파일로부터 생성

    • kubectl create configmap {NAME} --from-file={FILE_PATH}
  3. ConfigMap 오브젝트 생성

    # ex) config-map.yaml
    
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: app-config
    data:
        APP_COLOR: blue
        APP_MODE: prod
    

    yaml 파일 작성 이후 오브젝트 생성

    • kubectl create -f config-map.yaml

ConfigMap 주입하기

  • ConfigMap 전체 주입

    # pod definition 상위 부분 생략
    ... 
    spec:
        containers:
        ...
    
            env:
                - name: APP_COLOR
                envFrom:
                    - configMapRef:
                            name: app-config    # config map 이름을 통해 전체 주입
    
  • ConfigMap 내 특정 값만 주입

    # pod definition 상위 부분 생략
    ... 
    spec:
        containers:
        ...
    
            env:
                - name: APP_COLOR
                valueFrom:
                    - configMapKeyRef:
                            name: app-config    
                            key: APP_COLOR   # config map 중에서 APP_COLOR 라는 하나의 변수만 주입
    
  • ConfigMap을 애플리케이션과 동일한 Storage에 위치할 수 있도록 Volume에 주입

    # pod definition 상위 부분 생략
    ... 
    spec:
        containers:
        ...
    
        volumes:
            - name: app-config-volume
            configMap:
                name: app-config    # config를 하나의 파일로서 pod의 volume에 포함시키고자 할 때
    

Secrets

  • 민감한 정보를 담을 때 사용하는 오브젝트
  • ConfigMap과 마찬가지로 Key-Value 페어로 정의함
  • pod가 생성될 때 주입할 수 있음

Secrets 생성하기

  1. CLI를 통해 바로 생성

    • kubectl create secret generic {SECRETE_NAME} —-from-literal={KEY}={VALUE}
    • kubectl create secret generic db-secret —-from-literal=DB_USER=ROOT --from-literal=DB_PASSWORD=passwrd
  2. 기존 파일을 사용하여 생성

    • kubectl create secret generic {SECRET_NAME} --from-file={PATH_TO_SECRET_FILE}
    • kubectl create secret generic db-secret --from-file=app_secret.properties
  3. Secret 오브젝트 생성

    # ex) db-secret.yaml
       
    apiVersion: v1
    kind: Secret
    metadata:
        name: db-secret
           
    data:
        DB_HOST: postgres
        DB_USER: root
        DB_PASSWORD: passwrd
    

    yaml 파일 작성 이후 오브젝트 생성

    • kubectl create -f db-secret.yaml

Secret 관련 주의 사항

  • secret 을 저장하기 위해서는 encoded format이 효과적임
    • echo -n ‘passwrd’ | base64 와 같이 인코딩해서 표기하기
      • 디코딩은 echo -n ‘cG9zdGdyZXM=’ | base64 —decode
      • 추후 kubectl describe secret 을 통해 오브젝트의 정보를 조회하더라도 민감한 정보가 그대로 표기되지 않고, 형태만 bytes 로 표기됨
# ex) db-secret.yaml (인코딩 한 후 파일 작성한 예시)

apiVersion: v1
kind: Secret
metadata:
	name: db-secret
	
data:
	DB_HOST: cG9zdGdyZXM=
	DB_USER: cm9vdA==
	DB_PASSWORD: cGFzc3dyZA==

Secret 주입하기

  • Secret 전체 주입

    # pod definition 상위 부분 생략
    ... 
    spec:
        containers:
        ...
    
            envFrom:
                - secretRef:
                            name: db-secret
    
  • Secret 내 특정 값만 주입

    # pod definition 상위 부분 생략
    ... 
    spec:
        containers:
        ...
    
            env:
                - name: DB_PASSWORD
                valueFrom:
                    secretKeyRef:
                        name: db-secret    
                        key: DB_PASSWORD # secret 중에서 하나의 값만 주입
    
  • Secret 을 애플리케이션과 동일한 Storage에 위치할 수 있도록 Volume에 주입

    # pod definition 상위 부분 생략
    ... 
    spec:
        containers:
        ...
    
        volumes:
        - name: db-secret-volume
            secret:
                secretName: db-secret    # config를 하나의 파일로서 pod의 volume에 포함시키고자 할 때
    

Note

  • Kubernetes 내에서도 표현하는 Secret은 다음과 같음
    • ConfigMap과 비슷하다
    • 하지만 confidential data, sensitive information을 담는데 유용함
      • 별도로 생성 및 관리가 가능함.
      • 코드에 드러나지 않도록 사용하는데 적절함
    • 그야말로 “safer option”
  • 기본적으로 Secret 오브젝트는 encryption이 되는 것이 아니기 때문에, 디코딩을 통해 얼마든지 값을 알아낼 수 있으므로, secret object 또는 yaml 파일을 공개적으로 push 등의 작업은 권장되지 않음.
  • 보안을 위해서는 다음과 같은 방법들이 제안 됨. (이 부분은 따로 공부하고 정리 예정)
    • Enable Encryption at REST
    • Roll Based Access Control 적용
    • Access 제안 적용 (위와 비슷)
    • Cloud Provider 또는 Thrid-party에서 제공하는 encryption secret store 를 사용

Reference