쿠버네티스 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로 구성된 오브젝트로 무한이 넣을 수 있음

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