쿠버네티스 기초 시리즈
Object ConfigMap, Secret
개발시 테스트 하는 dev server와 실제 서비스를 운영하는 production server는 각각 환경 설정이 다를 수 있다. 이 때 각각의 이미지를 따로 운영하게 되면 환경 설정만 다른데 같은 이미지를 2배로 운영해야하는 부담이 따른다. 그래서 이 환경 설정을 외부에 전달받는 인자로 분리를 하고, 이미지에서는 이 값을 전달받아 사용하도록 하면 이미지는 한 개로만 운영한다.
외부로부터 전달받도록 사용하는 쿠버네티스 오브젝트가 바로 ConfigMap과 Sercret이다. vaule로 문자열, 파일을 정의할 수 있다. 환경 변수 방식은 한 번 주입되면 변경이 되지 않음을 주의해야한다. 반영이 되려면 Pod가 재생성 되어야 한다. 단, file을 voulme mount하는 경우 volume에 있는 file이 변경되면 변경이 가능하다.
ConfigMap
key와 value로 구성된 오브젝트로 무한이 넣을 수 있음
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-dev
data:
SSH: ‘false’ # boolean값으로 넣고자 할 때는 single quatation을 붙여줘야 함. 기본 string이기 때문
User: dev
Secret
보안이 필요한 vaule를 저장하는 오브젝트로 메모리에 저장되고 최대 1MB까지만 사용할 수 있음 (pw는 base64 인코딩)
apiVersion: v1
kind: Secret
metadata:
name: sec-dev
data:
Key: MTIzNA== #base64 encoding 필수. 하지 않은채로 값을 넣으면 에러가 발생함.
Pod 생성시 ConfigMap과 Secret사용 예제
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container
image: tmkube/init
envFrom:
- configMapRef:
name: cm-dev
- secretRef:
name: sec-dev
in pod-1 $> env
Key=1234
e.g.) 1.Create env file
echo "Content" >> file-c.txt
kubectl create configmap cm-file --from-file=./file-c.txt
echo "Content" >> file-s.txt
kubectl create secret generic sec-file --from-file=./file-s.txt
apiVersion: v1
kind: Pod
metadata:
name: pod-file
spec:
containers:
- name: container
image: tmkube/init
env:
- name: file-c
valueFrom:
configMapKeyRef:
name: cm-file
key: file-c.txt
- name: file-s
valueFrom:
secretKeyRef:
name: sec-file
key: file-s.txt
in pod-1 $> env
file:s=Content
e.g.) 2 Volume Mount (File)
apiVersion: v1
kind: Pod
metadata:
name: pod-mount
spec:
containers:
- name: container
image: tmkube/init
volumeMounts:
- name: file-volume
mountPath: /mount
volumes:
- name: file-volume
configMap:
name: cm-file
```shell
in pod-1 $> env
file:c=Content
file:s=Content
Object - Namespace, ResourceQuota, LimitRange
Namespace
- 자원을 분할 하여 사용할 수 구분
- 동일한 이름의 Pod를 생성할 수 없음
- 다른 네임스페이스의 자원과 분리된 자원을 관리 할 수 있음
- 다른 네임스페이스의 Pod와 Service는 연결할 수 없음
# Namespace
apiVersion: v1
kind: Namespace
metadata:
name: nm-1
# Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: nm-1
labels:
app: pod
spec:
containers:
- name: container
image: tmkube/app
ports:
- containerPort: 8080
# Service
apiVersion: v1
kind: Service
metadata:
name: svc-1
namespace: nm-1
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
ResourceQuota
- 네임 스페이스의 자원 limit을 설정할 수 있음
- ResouceQuota가 명세된 네임스페이스 안에서 Pod는 반드시 reqeusts와 limits를 명세해야만 해당 네임스페이스로 들어올 수 있음
- 제한 할 수 있는 자원은 cpu, memory, storage가 있고 Pod, service, configMap 등 오브젝트 개수도 제한 할 수 있음
- 쿠버네티스 버전에 따라 제한 할 수있는 오브젝트가 다름
# Namespace
apiVersion: v1
kind: Namespace
metadata:
name: nm-3
# ResouceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name: rq-1
namespace: nm-3
spec:
hard:
requests.memory: 1Gi
limits.memory: 1Gi
# ResourceQuota 확인
$> kubectl describe resourcequotas --namespace=nm-3
# Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
containers:
- name: container
image: tmkube/app
resources:
requests:
memory: 0.5Gi
limits:
memory: 0.5Gi
LimitRange
- Namespace에 들어올 수 있는 Pod의 용량을 제한 할 수 있음
- 종류
- min : 최소
- max : 최대
- maxLimitRequestRatio : request값과 limits의 비율이 최대 설정된 값을 넘지 않아야 함
# Namespace
apiVersion: v1
kind: Namespace
metadata:
name: nm-5
# LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: lr-1
spec:
limits:
- type: Container
min:
memory: 0.1Gi
max:
memory: 0.4Gi
maxLimitRequestRatio:
memory: 3
defaultRequest:
memory: 0.1Gi
default:
memory: 0.2Gi
$> kubectl describe limitranges --namespace=nm-5
# Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container
image: tmkube/app
resources:
requests:
memory: 0.1Gi
limits:
memory: 0.5Gi
쿠팡 파트너스 활동을 통해 일정액의 커미션을 제공받을 수 있습니다.