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 생성 방법
- CLI를 통해 바로 생성 - kubectl create configmap {NAME} --from-literal=APP_COLOR=blue --from-literal=APP_MODE=prod
 
- 기존에 정의된 파일로부터 생성 - kubectl create configmap {NAME} --from-file={FILE_PATH}
 
- 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 생성하기
- 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
 
- 기존 파일을 사용하여 생성 - kubectl create secret generic {SECRET_NAME} --from-file={PATH_TO_SECRET_FILE}
- kubectl create secret generic db-secret --from-file=app_secret.properties
 
- 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 를 사용