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 를 사용