BAEKDEV
BAEKDEV

자바 둘 타세요-에서 <자바 인력1>을 맡고 있습니다.

쿠버네티스 Object 살펴보기2 ConfigMap, Secret, Namespace, ResourceQuota, LimitRanger - 기초(3)

개발시 테스트 하는 dev server와 실제 서비스를 운영하는 production server는 각각 환경 설정이 다를 수 있다. 외부로부터 전달받도록 사용하는 쿠버네티스 오브젝트가 바로 ConfigMap과 Sercret이다. 그리고 자원에 대한 분리 및 제한을 관할하는 오브젝트 Namespace, ResourceQuota, LimitRanger에 대해 살펴보자.

쿠버네티스 Object 살펴보기2 ConfigMap, Secret, Namespace, ResourceQuota, LimitRanger - 기초(3)

쿠버네티스 기초 시리즈

Object ConfigMap, Secret

개발시 테스트 하는 dev server와 실제 서비스를 운영하는 production server는 각각 환경 설정이 다를 수 있다. 이 때 각각의 이미지를 따로 운영하게 되면 환경 설정만 다른데 같은 이미지를 2배로 운영해야하는 부담이 따른다. 그래서 이 환경 설정을 외부에 전달받는 인자로 분리를 하고, 이미지에서는 이 값을 전달받아 사용하도록 하면 이미지는 한 개로만 운영한다.

외부로부터 전달받도록 사용하는 쿠버네티스 오브젝트가 바로 ConfigMap과 Sercret이다. vaule로 문자열, 파일을 정의할 수 있다. 환경 변수 방식은 한 번 주입되면 변경이 되지 않음을 주의해야한다. 반영이 되려면 Pod가 재생성 되어야 한다. 단, file을 voulme mount하는 경우 volume에 있는 file이 변경되면 변경이 가능하다.

ConfigMap

key와 value로 구성된 오브젝트로 무한이 넣을 수 있음

1
2
3
4
5
6
7
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-dev
data:
  SSH: ‘false’ # boolean값으로 넣고자 할 때는 single quatation을 붙여줘야 함. 기본 string이기 때문
  User: dev

Secret

보안이 필요한 vaule를 저장하는 오브젝트로 메모리에 저장되고 최대 1MB까지만 사용할 수 있음 (pw는 base64 인코딩)

1
2
3
4
5
6
apiVersion: v1
kind: Secret
metadata:
  name: sec-dev
data:
  Key: MTIzNA== #base64 encoding 필수. 하지 않은채로 값을 넣으면 에러가 발생함. 

Pod 생성시 ConfigMap과 Secret사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container
    image: tmkube/init
    envFrom:
    - configMapRef:
        name: cm-dev
    - secretRef:
        name: sec-dev
1
2
in pod-1 $> env
Key=1234  

e.g.) 1.Create env file

1
2
3
4
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
1
2
in pod-1 $> env
file:s=Content

e.g.) 2 Volume Mount (File)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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는 연결할 수 없음
1
2
3
4
5
# Namespace
apiVersion: v1
kind: Namespace
metadata:
  name: nm-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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
1
2
3
4
5
6
7
8
9
10
11
12
# 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 등 오브젝트 개수도 제한 할 수 있음
    • 쿠버네티스 버전에 따라 제한 할 수있는 오브젝트가 다름
1
2
3
4
5
# Namespace
apiVersion: v1
kind: Namespace
metadata:
  name: nm-3  
1
2
3
4
5
6
7
8
9
10
# ResouceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
  name: rq-1
  namespace: nm-3
spec:
  hard:
    requests.memory: 1Gi
    limits.memory: 1Gi
1
2
    # ResourceQuota 확인  
    $> kubectl describe resourcequotas --namespace=nm-3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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의 비율이 최대 설정된 값을 넘지 않아야 함
1
2
3
4
5
# Namespace
apiVersion: v1
kind: Namespace
metadata:
  name: nm-5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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
1
$> kubectl describe limitranges --namespace=nm-5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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