본문 바로가기
도커&쿠버네티스

[도커/쿠버네티스] 7장 쿠버네티스 리소스의 관리와 설정(네임스페이스, 컨피그맵, 시크릿)

by bzerome240 2022. 2. 23.

네임스페이스(Namespace)

: 리소스를 논리적으로 구분하는 오브젝트

: 포드, 레플리카셋, 디플로이먼트, 서비스 등과 같은 쿠버네티스 리소스들이 묶여있는 그룹

  • 용도 ex) 모니터링, 로드 밸런싱 인그레스 등
  • 논리적으로만 구분되고, 물리적으로는 구분된 것은 아니다

 

 

네임스페이스 목록 확인

kubectl get ns

 

직접 생성하지 않아도 기본적으로 존재하는 네임스페이스

1. default

2. kube-public

3. kube-system

 

 

네임스페이스의 리소스 확인

# kube-system 네임스페이스의 pod 목록 확인
kubectl get pods -n kube-system

# kube-system 네임스페이스의 service 목록 확인
kubectl get service -n kube-system

 

 

네임스페이스 VS 라벨

네임스페이스는 라벨보다 더 넓은 용도로 사용 가능

  • ex 1) ResourceQuota 를 이용해 특정 네임스페이스에서 생성되는 포드의 자원 사용량 제한
  • ex 2) 애드미션 컨트롤러라는 기능을 이용해 특정 네임스페이스에 생성되는 포드에 항상 사이드카 컨테이너를 붙이도록 설정
  • ex 3) 사용 목적에 따라 포드, 서비스 등의 리소스를 구분하기 편리하다

 

 

poudoction이라는 네임스페이스 생성하기 YAML

apiVersion: v1
kind: Namespace
metadata:
  name: production

 

 

네임스페이스에 디플로이먼트, 서비스 생성하기 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-deployment-ns
  namespace: production
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: my-webserver
      labels:
        app: webserver
    spec:
      containers:
      - name: my-webserver
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: hostname-svc-clusterip-ns
  namespace: production
spec:
  ports:
    - name: web-port
      port: 8080
      targetPort: 80
  selector:
    app: webserver
  type: ClusterIP
  • --- : 여러개의 리소스 정의

 

 

모든 네임스페이스의 리소스 확인하기

kubectl get pods --all-namespaces

 

 

같은 네임스페이스 내의 서비스에는 서비스 이름만으로 접근 가능

But, 다른 네임스페이에 존재하는 서비스에는 서비스 이름만으로 접근 불가능

-> 서비스이름.네임스페이스이름.svc 로 다른 네임스페이스의 서비스에도 접근 가능

 

ex) production 네임스페이스에 있는 hostname-scv-clusterip-ns 라는 서비스에 접근하기

curl hostname-svc-clusterip-ns.production.svc:8080 -- slient | grep Hello

 

 

A 네임스페이스에서 포드를 만들면 B 네임스페이스에서는 보이지 않는다

== '오브젝트가 네임스페이스에 속한다' namespaced

 

 

네임스페이스에 속하는 오브젝트 종류 확인

kubectl api-resources --namespaced=true

 

네임스페이스에 속하지 않는 오브젝트 종류 확인

kubectl api-resources --namespaced=false

 


 

 

환경변수(키-값)를 YAML에 직접 명시하는 방식보다는, YAML 파일과 설정값을 분리할 수 있는 컨피그맵, 시크릿 사용

-> 장점: 어플리케이션과 설정값을 별도로 분리해 관리할 수 있다

 

컨피그맵(Configmap)

: 설정값 저장

 

 

컨피그맵 생성방법 1. --from-literal 옵션 사용

  • kubectl create configmap 컨피그맵이름 각종설정값들
  • --from-literal: 컨피그맵에 여러개의 변수 설정
kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG --from-literal k8s=kubernetes

 

컨피그맵 저장된 값 확인

kubectl get cm

 

 

컨피그맵 생성방법 2. --from-file 옵션 사용

  • kubectl create configmap 컨피그맵이름 --from-file 파일이름
kubectl create configmap index-file --from-file index.html // 키는 index.html이 된다

kubectl create configmap index-file --from-file myindex=index.html // 키는 myindex가 된다

 

  • --from-env-file 옵션: 여러개의 키-값 들로 구성된 설정 파일을 한번에 컨피그맵으로 가져올 때
kubectl create configmap --from-envfile --from-env-file mutiple-keyvalue.env

// yaml 형식으로 생성된 컨피그맵 확인
kubectl get cm from-envfile -o yaml

 

 

컨피그맵 생성방법 3. --dry-run 옵션 사용

 

컨피그맵을 생성하지 않은채로 YAML 파일 내용 출력 후 YAML 파일 저장

-> 컨피그맵도 YAML 파일로 배포해서 사용 가능

kubectl create configmap my-configmap --from-literal mykey=myvalue --dry-run -o yaml > my-configmap.yaml

 

 

 

 

 

 

 

컨피그맵을 포드에서 사용하는 방법1. 컨피그랩의 값을 컨테이너의 환경변수로 사용

애플리케이션이 시스템 환경 변수로부터 설정값을 가져온다면 이 방법 사용

 

1) 컨피그맵의 값을 환경 변수로 사용하는 포드를 생성하는 YAML

apiVersion: v1
kind: Pod
metadata:
  name: container-env-example
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      envFrom:
      - configMapRef:
          name: log-level-configmap
      - configMapRef:
          name: start-k8s
  • envFrom.configMapRef: 컨피그맵에 존재하는 모든 키-값 쌍을 가져온다

 

 

포드의 컨테이너에 설정된 변수 확인하기

  • env: 환경변수를 출력하는 명령어
kubectl exec container-env-example env

 

 

2) 컨피그맵에서 특정 값만 환경 변수로 사용하는 포드를 생성하는 YAML

apiVersion: v1
kind: Pod
metadata:
  name: container-selective-env-example
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      env:
      - name: ENV_KEYNAME_1     # (1.1) 컨테이너에 새롭게 등록될 환경 변수 이름
        valueFrom: 
          configMapKeyRef:
            name: log-level-configmap
            key: LOG_LEVEL
      - name: ENV_KEYNAME_2  # (1.2) 컨테이너에 새롭게 등록될 환경 변수 이름
        valueFrom: 
          configMapKeyRef:
            name: start-k8s      # (2) 참조할 컨피그맵의 이름
            key: k8s             # (3) 가져올 데이터 값의 키
                                 # 최종 결과 -> ENV_KEYNAME_2=$(k8s 키에 해당하는 값)
                                 #              ENV_KEYNAME_2=kubernetes
  • valueFrom.configMapKeyRef: 컨피그맵에 존재하는 키-값 쌍 중에서 원하는 데이터만 선택적으로 가져온다

 

 

컨피그맵을 포드에서 사용하는 방법 2. 컨피그맵의 값을 포드 내부의 파일로 마운트해 사용 

애플리케이션이 conf 등의 파일을 통해 설정값을 가져온다면 이 방법 사용

 

1) 컨피그맵에 존재하는 모든 키-값 쌍을 디렉터리에 마운트하는 YAML

apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: my-container
      image: busybox
      args: [ "tail", "-f", "/dev/null" ]
      volumeMounts:
      - name: configmap-volume          # volumes에서 정의한 컨피그맵 볼륨 이름 
        mountPath: /etc/config             # 컨피그맵의 데이터가 위치할 경로

  volumes:
    - name: configmap-volume            # 컨피그맵 볼륨 이름
      configMap:
        name: start-k8s

 

  • spec.volumes: 사용할 볼륨의 목록
  • spec.containers.volumeMounts: volume 항목에서 정의된 볼륨을 컨테이너 내부의 어떤 디렉터리에 마운트할 것인지 명시

 

 

마운트로 포드 생성 후 확인

$ kubectl exec configmap-volume-pod ls /etc/config
container
k8s

$ kubectl exec configmap-volume-pod cat /etc/config/k8s
kubernetes

 

 

2) 컨피그맵에 존재하는 특정 키-값 쌍을 디렉터리에 마운트하는 YAML

apiVersion: v1
kind: Pod
metadata:
  name: selective-cm-volume-pod 
spec:
  containers:
    - name: my-container
      image: busybox
      args: [ "tail", "-f", "/dev/null" ]
      volumeMounts:
      - name: configmap-volume
        mountPath: /etc/config       # 마운트되는 위치는 변경되지 않았습니다.
  volumes:
    - name: configmap-volume
      configMap:
        name: start-k8s
        items:                       # 컨피그맵에서 가져올 키-값의 목록을 나열합니다.
        - key: k8s                    # k8s라는 키에 대응하는 값을 가져옵니다.
          path: k8s_fullname         # 최종 파일 이름은 k8s_fullname이 됩니다

items: 컨피그맵에서 가져올 키-값 목록을 의미

path: 디렉토리에 위치할 파일 이름을 명시

 

 

마운트로 포드 생성 후 확인

$ kubectl exec selective-cm-volume-pod ls /etc/config
k8s_fullname

$ kubectl exec selective-cm-volume-pod cat /etc/config/k8s_fullname
kubernetes

시크릿(Secret)

: 노출되면 안되는 값 저장

 

 

kustomize

: YAML 파일이 너무 길어질 때 사용

 

 

SSH키 비밀번호 등과 같이 민감한 정보를 저장하기 위한 용도로 사용
사용법은 컨피그맵과비슷

kubectl create secret generic my-password --from-literal password=1q2w3e4r

echo mypassword > pw1 && echo yourpassword > pw2
kubectl create secret generic our-password --from-file pw1 --from-file pw2

 

시크릿은 컨피그맵과 달리 데이터의 사용 목적에 따라 몇가지 종류로 나뉨

kubectl describe secret my-password
password: 8 bytes

kubectl get secret my-password -o yaml
data:
    password: MXEydzNlNHI=

 

컨피그맵과 비스산 형식으로 데이터가 저장돼 있지만, 키-값 쌍에서 값에
해당하는 부분이 이상한값으로 변형돼있음 MXEydzNlNHI=는 1q2w3e4r이 base64로 인코딩한값
--dry-run -o로 확인해보면 맞게 나와있음

컨피그맵ref와같이 시크릿도 secretRef가 존재

envFrom:
- secretRef:
    name: my-password

 

동일하게 사용가능하고 key, name도 사용가능

728x90
반응형

댓글